"Nioke.com" 45 классических вопросов для оценки навыков JS

JavaScript
"Nioke.com" 45 классических вопросов для оценки навыков JS

предисловие

45 вопросов для оценки навыков JS на Niuke.com лично кажутся очень хорошими 45 базовыми тестовыми вопросами по JS. По сути, это для более всесторонней оценки собственной основы JavaScript, включая оператор if, тело цикла, основные операторы, setInterval, setTimeout, управление потоком, общие методы массива и связанные с es6 (деструктурирование, карта, набор,...Ждать). Я уже делал это один раз. Я помню, что Niuke.com раньше не поддерживал метод написания es6. Я потратил некоторое время за последние два дня, чтобы снова пройти все темы, и обнаружил, что он поддерживает es6. На этот раз я старался изо всех сил использовать разные методы для реализации каждой темы. Конечно, если у вас есть лучший и более новый метод реализации, добро пожаловать, оставьте сообщение в области комментариев.

Я также вставляю сюда часто используемые методы массивов и строковые методы, вы можете самостоятельно проверить мастерство

1. Найдите позицию элемента массива

Первый вопрос относительно прост, достаточно сразу перейти к ответу:

// 方法一
function indexOf(arr, item) {
    if(Array.prototype.indexOf){// 判断浏览器是否支持indexOf方法
        return arr.indexOf(item);
    }else{
        for(var i=0;i<arr.length;i++){
            if(arr[i]===item){
                return i;
            }
        }
    }
    return -1;
}
// 方法二
function indexOf(arr, item) {
 if(Array.prototype.indexOf){// 判断浏览器是否支持indexOf方法
        return arr.indexOf(item);
    } else if (arr.indexOf(item) > 0) {
        return arr.indexOf(item)
    }else{
        return -1
    }
}

вот кстатиArray.prototype.indexOf

indexOf()Метод возвращает первый индекс в массиве, по которому можно найти данный элемент, или -1, если он не существует.

грамматика:

 arr.indexOf(searchElement) //查找searchElement元素在数组中的第一个位置
 arr.indexOf(searchElement[, fromIndex = 0]) //从fromIndex开始查找searchElement元素在数组中的第一个位置

Есть еще один способ найти строкуString.prototype.indexOf()

str.indexOf(searchValue[, fromIndex])
  • searchValue: строка, представляющая искомое значение.
  • fromIndex (необязательно): указывает позицию в строке, где вызывается метод для начала поиска. Может быть любым целым числом. Значение по умолчанию — 0. Если fromIndex = str.length, метод возвращает -1, если искомая строка не является пустой строкой, и в этом случае возвращается str.length.

В частности, вы можете увидетьMDN

2. Добавляем элементы (добавляем в конце)

Способ 1: обычное копирование цикла for + push

function append(arr, item) {
    let resArr = []
    for(let i = 0;i<arr.length;i++){
        resArr.push(arr[i]) 
    }
    resArr.push(item)
    return resArr
}

Способ 2. Используйте concat для объединения входящего массива или значения, не являющегося массивом, с исходным массивом, чтобы сформировать новый массив и вернуть его.

function append(arr, item) {
    return arr.concat(item);
}

Способ 3: использовать неглубокое копирование фрагмента + push

function append(arr, item) {
     let newArr = arr.slice(0);  // slice(start, end)浅拷贝数组
    newArr.push(item);
    return newArr;
}

Способ четвертый:...спред операторЕсли вы не знаете, вы можете взглянуть на знания, связанные с es6.

function append(arr, item) {
let resArr = [...arr,item]
return resArr
}

3. Удалить элементы из массива (вернуть исходный массив)

Здесь вам нужно обратить внимание на понимание проблемы, это напрямую манипулировать исходным массивом, поэтому newArr не может появиться

Способ 1: обычная петля + сращивание

function removeWithoutCopy(arr, item) {
    for(let i=arr.length;i>=0;i--){
        if(arr[i]==item){
            arr.splice(i,1);
        }
    }
    return arr;
}

Метод 2: Другой способ написания метода 1

Здесь следует отметить, что при удалении элемента требуется i–, то есть после удаления этого элемента положение других элементов сдвигается вперед.

function removeWithoutCopy(arr, item) {
    for(let i = 0; i< arr.length; i++) {
        if(arr[i]===item) {
            arr.splice(i,1);
            i--;
        }
    }
    return arr;
}

Немного измените вопрос 3 и посмотрите следующий вопрос

4. Удалить элементы из массива (вернуть новый массив)

Способ 1: фильтрация через фильтр

function remove(arr, item) {
     return arr.filter(res =>{
         return res != item;
    })
}

Способ 2: цикл for + push

function remove(arr, item) {
    let resArr = []
    for(let i = 0;i<arr.length;i++){
        if(arr[i]!== item){
            resArr.push(arr[i])
        }
    }
    return resArr
}

Способ 3: forEach+push (эффективность выше, чем у цикла for)

function remove(arr, item) {
    let resArr=[];
    arr.forEach(v=>{
        if(v!==item){
            resArr.push(v);
        }
    })
    return resArr;
}

Способ 4: на петлю + сращивание

function remove(arr,item){
    let resArr= arr.slice(0);
    for(let i=0;i<resArr.length;i++){
        if(resArr[i] == item){
            resArr.splice(i,1);
            i--;
        }
    }
    return resArr;
}

5. Суммирование массива

Способ 1: обычный цикл for

function sum(arr) {
    let res = 0
    for(let i=0;i<=arr.length;i++){
        res +=arr[i]
    }
    return res
}

Способ 2: цикл forEach

function sum(arr) {
    let res = 0
arr.forEach((value,index,array)=>{
    array[index] == value;    //结果为true
     res+=value;  
    });
    return res;
};

Способ 3: уменьшить

Метод reduce() получает функцию как аккумулятор.Каждое значение в массиве (слева направо) сокращается и, наконец, вычисляется как значение.Подробности см. в знаниях, связанных с es6.

function sum(arr) {
    return arr.reduce((pre,cur)=>{
        return pre+cur;
    })
}

Метод 4: оценка

Функция eval() оценивает строку и выполняет в ней код JavaScript.

function sum(arr) {
     return eval(arr.join("+"));
}

6, удалить последний элемент массива

Способ 1: нарезка

function truncate(arr) {
  return arr.slice(0,arr.length-1)
}

Способ 2: concat/slice+pop

function truncate(arr) {
  let resArr = arr.concat()
  // let resArr = arr.slice(0)
  resArr.pop()
  return resArr
}

7. Добавляем элементы (добавляем в начале)

concat/slice/arr.join().split(',')+unshift

  function prepend(arr, item) {
            // let resArr = arr.slice(0);
            // let resArr = arr.concat()
             let resArr = arr.join().split(',')
            resArr.unshift(item);
            return resArr;
        }

8. Удалить первый элемент массива

Как и в вопросе 7, здесь не так уж много трюков, если у вас есть другие забавные методы, добро пожаловать, чтобы оставить сообщение

function curtail(arr) {
    let resArr = arr.slice(0)
    resArr.shift()
    return resArr
}

9. Объединить массивы

Есть много способов, добро пожаловать, чтобы оставить комментарий

Способ 1: конкат

function concat(arr1, arr2) {
    let resArr = arr1.concat(arr2)
    return resArr
}

Способ второй:...спред оператор

function concat(arr1, arr2) {
    let resArr = [...arr1,...arr2]
    return resArr
}

Способ 3: slice+push.apply

function concat(arr1, arr2) {
    let resArr = arr1.slice(0);
            [].push.apply(resArr,arr2);
            return resArr;
}

10. Добавьте элементы (добавьте в указанное место)

Метод 1: сначала скопируйте первые элементы 0~index, вставьте элемент item, а затем соедините элементы после индекса.

function insert(arr, item, index) {
    let resArr = arr.slice(0,index)
    resArr.push(item)
    resArr = resArr.concat(arr.slice(index))
    return resArr
}

Способ 2: используйте метод сращивания для вставки (более высокая эффективность)

function insert(arr, item, index) {
    let  resArr = arr.slice(0);//
            resArr.splice(index,0,item);
            return resArr;
}

Способ 3: push.apply+splice

function insert(arr, item, index) {
let resArr=[];
[].push.apply(resArr, arr);
resArr.splice(index,0,item);
return resArr;
}

11. Подсчет

Способ 1: обычный цикл for

function count(arr, item) {
    let reSCount = 0
    for(let i = 0;i<=arr.length;i++){
        if(arr[i] === item){
            reSCount++
        }
    }
    return reSCount
}

Способ 2: для каждого

function count(arr, item) {
    let resCount=0;
    arr.forEach(v => {
        if(v==item){
            resCount++;
        }
    });
    return resCount;
}

Способ 3: фильтр

function count(arr, item) {
   let res = arr.filter(v => {
       return v === item
    });
    return res.length;
}

Способ 4: карта (эффективность выше фильтра)

function count(arr, item) {
    let resCount = 0
   arr.map(v => {
       if(v === item){
           resCount++
       }
    });
    return resCount;
}

Функция карты немного похожа на фильтр, но карта предназначена для проверки всех элементов в массиве, чтобы проверить условия функции и, наконец, получить новый массив с тем же количеством элементов.

Хотя функция фильтра также возвращает новый массив, количество элементов равно сумме элементов условий функции проверки.

Способ 5: уменьшить

 function count(arr, item) {
     let res = arr.reduce( (init,curr)=> {
       //如果当前置等于item,该函数值加一
       return curr === item ? init+1:init;
      },0)
      return res;
  }


12. Найдите повторяющиеся элементы

Способ 1: for/for in/+sortСначала отсортировать, а потом судить, равны ли предыдущие данные после сортировки последним данным, если да и в результирующем массиве нет этого элемента

//for 运行时间:1596ms 占用内存:77772k
function duplicates(arr) {
    let resArr = [];
    arr.sort();
    for(let i=0;i<arr.length;i++){
        if(arr[i]==arr[i-1] && resArr.indexOf(arr[i])==-1){
            resArr.push(arr[i]);
        }
    }
    return resArr;
}
//for in  运行时间:1132ms占用内存:77868k
function duplicates(arr) {
    let resArr = [];
    arr.sort();
    for(i in arr){
        if(arr[i]==arr[i-1] && resArr.indexOf(arr[i])==-1){
            resArr.push(arr[i]);
        }
    }
    return resArr;
}

Способ 2: для каждогоИспользуйте индекс, чтобы определить, повторяется ли он (используется дважды)

// 运行时间:1184ms 占用内存:77772k
function duplicates(arr) {
    var resArr=[];
    arr.forEach(v => {
     //判断原数组是否有重复数据
     //判断结果数组是否已经具有该数据
       if(arr.indexOf(v) !=arr.lastIndexOf(v) && resArr.indexOf(v) == -1){
           resArr.push(v);
       }
    });
    return resArr;
}

Способ 3: уменьшитьСначала определите, сколько раз элемент появляется в массиве, если он больше 1 и такого элемента нет перед массивом результатов, поместите этот элемент в массив результатов

// 运行时间:1129ms 占用内存:77776k
function duplicates(arr) {
   let b = [];
   let resArr = [];
   for (let i= 0; i<arr.length; i++){
        b[i] = arr.reduce( (init,curr)=> {
        //如果当前置等于item,该函数值加一
           return curr === arr[i] ? init+1:init;
           },0)
           if (b[i] > 1 && resArr.indexOf(arr[i]) === -1){
               resArr.push(arr[i]);
           }
        }
    return resArr;
}

13. Ищите квадратичный

Способ 1: для/для каждого

// 运行时间:1466ms 占用内存:77772k
function square(arr) {
    var res = [];
    for(var i in arr){
        res.push(arr[i]*arr[i]);
    }
    return res;
}
// forEach 运行时间:1130ms 占用内存:77772k
function square(arr) {
    var resArr = [];
    arr.forEach((e)=>{
        resArr.push(e*e);
    });
    return resArr;
}

Способ 2: карта

// 运行时间:1433ms 占用内存:78004k
function square(arr) {
    //let resArr = arr.slice(0);
    let resArr = arr.map((e,index,array)=>{
        return e*e;
    });
    return resArr;
}

14. Найти местоположение элемента

Способ 1: для

//运行时间:1139ms 占用内存:77772k
function findAllOccurrences(arr, target) {
    let resArr = [];
    for(let i=0;i < arr.length;i++){
        if(arr[i] === target){
            resArr.push(i);
        }
    }
    return resArr;
}

Способ 2: для каждого

// 运行时间:1135ms 占用内存:77776k
function findAllOccurrences(arr, target) {
    let resArr = [];
    arr.forEach((v,index)=>{
                if(v === target){
        resArr.push(index)
    }
                })
    return resArr;
}


15. Избегайте глобальных переменных

Оригинальный код:

function globals() {
    myObject = {
      name : 'Jory'
    };

    return myObject;
}



ремонт:

function globals() {
  let  myObject = {
      name : 'Jory'
    };

    return myObject;
}

16. Правильное определение функции

Оригинальный код:

function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}

Исправление: оператор в else эквивалентен переписыванию функции в if, поэтому независимо от значения флага возвращаемый метод всегда является переписанным методом. При присвоении метода переменной метод не будет переопределен, поэтому можно получить правильный результат. И может быть объявлен только с помощью var.

function functions(flag) {
    if (flag) {
      var getValue = function () { return 'a'; }
    } else {
      var getValue = function () { return 'b'; }
    }

    return getValue();
}

17. Правильное использование parseInt

Оригинальный код:

function parse2Int(num) {
    return parseInt(num);
}


Исправлено: функция parseInt(string, radix) анализирует строку и возвращает целое число. Основание параметра представляет основание числа для анализа. Значение находится в диапазоне от 2 до 36. Если этот параметр опущен или его значение равно 0, parseInt() определит основание числа на основе строки. Например, если строка начинается с «0x», функция parseInt() будет анализировать остальную часть строки как шестнадцатеричное целое число. Если строка начинается с 0, ECMAScript v3 позволяет реализации parseInt() анализировать следующий символ как восьмеричное или шестнадцатеричное число. Если строка начинается с числа от 1 до 9, функция parseInt() будет анализировать ее как десятичное целое число. В этом вопросе требуется анализировать его как целое число в десятичном виде.

function parse2Int(num) {
    return parseInt(num,10);
}

Уведомление:

1. Будет возвращено только первое число в строке.

2. Если первый символ строки не может быть преобразован в число, то функция parseFloat() вернет NaN. 3. Если основание параметра меньше 2 или больше 36, parseInt() вернет NaN.

18. Точно эквивалентно

function identity(val1, val2) {
    if(val1===val2) {
        return true;
    }
    else{
        return false;
    }
}


19. Таймер

function count(start, end) {
    //立即输出第一个值
    console.log(start++);
     var timer = setInterval(
         function()
         {
         if(start <= end){
             console.log(start++);
         }else{
             clearInterval(timer);
         }
     },100);
    //返回一个对象
     return {
         cancel : function()
         {
             clearInterval(timer);
         }
     };
}

Метод setInterval(code,millisec) вызывает функцию или вычисляет выражение с заданным интервалом (в миллисекундах).

code — это вызываемая функция или строка кода для выполнения, а миллисекунды — это временной интервал в миллисекундах между периодическими выполнениями или вызовами кода.

Метод setInterval() продолжает вызывать функцию кода до тех пор, пока не будет вызвана функция clearInterval() или пока окно не будет закрыто. Значение идентификатора, возвращаемое setInterval(), может использоваться в качестве аргумента метода clearInterval(). Метод clearInterval() отменяет тайм-аут, установленный setInterval(), где аргументом должно быть значение идентификатора, возвращаемое setInterval().

20. Контроль процесса

function fizzBuzz(num) {
    if(num%3==0 && num%5==0){
        return 'fizzbuzz';
    }
    else if(num%3==0){
        return 'fizz';
    }
    else if(num%5==0){
        return 'buzz';
    }
    else if(num==null || typeof num != 'number'){
        return false;
    }
    else{
        return num
    }
}


21. Передача параметров функции

Способ 1: подать заявку/позвонить

function argsAsArray(fn, arr) {
  return fn(arr[0],arr[1],arr[2]);
}
 
用apply
function argsAsArray(fn, arr) {
  return fn.apply(fn, arr);
}
 
//或者
function argsAsArray(fn, arr) {
  return fn.apply(this, arr);
}
 
用call
function argsAsArray(fn, arr) {
  return fn.call(fn, arr[0],arr[1],arr[2]);
}
 
//或者
function argsAsArray(fn, arr) {
  return fn.call(this, arr[0],arr[1],arr[2]);
}

Метод function.apply(newObj[ argsArray]) может изменять вызывающий объект указанной функции. function — это функция, вызывающий объект которой будет изменен, newObj — новый вызывающий объект функции, а argsArray — аргументы, массив или объект аргументов, переданный функции function.

Метод применения заключается в том, чтобы поместить параметры, переданные функции, в массив и просто передать массив параметров.

Метод function.call(newObj[ arg1[ arg2[ […argN]]]]) аналогичен методу apply() с одним отличием: метод call() принимает список несколько параметров.Метод apply() принимает массив с несколькими параметрами.

Способ второй:...спред оператор

function argsAsArray(fn, arr) {
  return  fn(...arr);
}

22. Контекст функции

Эта тема исследует, чтобы изменить это на точку

//apply
function speak(fn, obj) {
    return fn.apply(obj);
}
//call
function speak(fn, obj) {
    return fn.call(obj);
}
//bind
function speak(fn, obj) {
    return fn.bind(obj)();
}

23. Функция возврата

function functionFunction(str) {
    return f = function (obj) {
        return str + ', ' + obj;
    }
}


24. Используйте замыкания

function makeClosures(arr, fn) {
    let result = [];
    for (let i of arr) {
        result.push(()=>{
            return fn(i)
        });
    }
    return result;
}
// 也可以换成forEach

25. Вторичная функция инкапсуляции

Поскольку этот указатель и область действия внутри функции не требуются, методы вызова и применения можно опустить.

function partial(fn, str1, str2) {
    return result = function (str3) {
        return fn(str1, str2, str3)
    };
}

26. Используйте аргументы

Метод 1: оценка

function useArguments() {
 let arr=Array.prototype.slice.call(arguments)//把arguments类数组转化为数组
 return eval(arr.join("+"));//求和
}

Способ 2: комбинация уменьшения+вызова

function useArguments() {
 let result = Array.prototype.reduce.call(arguments,function(a,b){return a+b;});
 return result;
}

27. Используйте применить к функциям вызова

Вопрос 21 уже обсуждался, поэтому повторяться не буду.

function callIt(fn) {
    return fn.apply(this, [].slice.call(arguments, 1))
}

28. Вторичная функция инкапсуляции

Обратите внимание на разницу с требованиями 25 вопросов. Начальный уровень, нечего сказать, это личный опыт

function partialUsingArguments(fn) {
     //先获取p函数第一个参数之后的全部参数
     var args = [].slice.call(arguments,1);
     //声明result函数
     return result = function(){
         //使用concat合并两个或多个数组中的元素
         return fn.apply(this, args.concat( [].slice.call(arguments) ));
     };
}

29. Карри

Каррирование — это метод преобразования функции, которая принимает несколько параметров, в функцию, которая принимает один параметр (первый параметр исходной функции) и возвращает новую функцию, которая принимает остальные параметры и возвращает результат.

function curryIt(fn) {
     var args = [];
     var result = function(arg){
         args.push(arg);
         if(args.length < fn.length){
            return result;
         }else 
            return fn.apply(this,args);
     }
     return result;
 }


30. Операция ИЛИ

function or(a, b) {
    return (a || b);
}


31, и операция

function and(a, b) {
    return  (a && b);
}


32. Модули

function createModule(str1, str2) {
     let obj = {
         greeting: str1,
         name: str2,
         sayIt: function(){
             return obj.greeting+", "+obj.name;
         }
     };
     return obj;
}

33. Двоичное преобразование (десятичное в двоичное)

function valueAtBit(num, bit) {
    let res = num.toString(2);
    return sre[res.length - bit];
}

Метод NumberObject.toString(radix) преобразует объект Number в строку и возвращает строковое представление числа. Основание представляет собой основание числа, целое число от 2 до 36. Если этот параметр опущен, по умолчанию используется основание 10. Например, если основание равно 2, NumberObject преобразуется в строку, представляющую двоичное значение.

当调用该方法的对象不是 Number 时抛出 TypeError 异常。

С помощью num.toString(2) число может быть напрямую преобразовано в строку в двоичном формате, а соответствующее значение может быть извлечено с помощью нижнего индекса. Число, возвращаемое вопросом, идет справа налево, поэтому нижний индекс является обратным.

34. Двоичное преобразование (двоичное в десятичное)

function base10(str) {
    return parseInt(str,2);
}

35. Двоичное преобразование (десятичное в 8-битное двоичное)

function convertToBinary(num) {
    let res = num.toString(2);
    while(res.length<8){
        res = '0'+res;
    }
    return res;
}

36. Умножение

В этом вопросе мы должны обратить внимание на требования заголовка, мы должны учитывать точность и следить за тем, чтобы количество цифр после запятой превалировало. Следующее написание недопустимо

// 这种写法是通不过的
function multiply(a, b) {
    return a*b;
}

правильный:

function multiply(a, b) {
// 先将数字转换为字符串
let str1 = a.toString();
let str2 = b.toString();
// 获取两个数的小数位数
let lenA = (str1.indexOf('.')==-1)?0:(str1.length-str1.indexOf(".")-1);
let lenB = (str2.indexOf('.')==-1)?0:(str2.length-str2.indexOf(".")-1);
// 比较两数的精度/位数,精度大的作为结果数精度
let len = Math.max(lenA,lenB);
// 运算结果
let result = parseFloat(a*b).toFixed(len);
return result
}
  • toFixed(num):toFixed()Метод может округлить число до указанного числа знаков после запятой, параметр num: представляет количество знаков после запятой;
let num = 5.56789; num.toFixed(2); ==>5.57
  • parseFloat(string): parseFloat()Функция может анализировать строку и возвращать число с плавающей запятой; строка параметра может быть числом или строкой, когда параметр является строкой, оценивается, является ли символ числом, если да, строка анализируется до тех пор, пока число достигнуто до конца , затем вернуть число как число или NAN, если нет;
parseFloat("43ar4s2");==>43   
parseFloat("qwar4s2");==>NAN

37. Измените контекст

Я уже говорил это раньше, так что не буду повторяться

function alterContext(fn, obj) {
    //return fn.call(obj);
    //return fn.apply(obj);
    return fn.bind(obj)();
}

38. Пакетное изменение свойств объектов

function alterObjects(constructor, greeting) {
    constructor.prototype.greeting = greeting;
}

Свойство прототипа может добавлять свойства и методы к объекту. Это знание цепочки прототипов: при поиске метода или свойства объекта сначала будет искать в объекте, а если найдет, то будет возвращено, если сам экземпляр объекта не имеет свойства, то будет будет искаться на один уровень вверх по цепочке прототипов. Если он найден, он будет выведен. Если он не существует, он будет продолжать поиск на один уровень вверх по цепочке прототипов до объекта-прототипа верхнего уровня Object.prototype. он все еще не найден, он вернет значение undefined.

Чтобы указать свойству приветствия всех экземпляров конструктора данную переменную приветствия, просто добавьте свойство приветствия в прототип конструктора и укажите значение. О цепочке прототипов вы можете прочитать в моей предыдущей статье:"Front-end package" - глубокое понимание прототипа JavaScript и цепочки прототипов

39. Обход атрибутов

Методов много, можно использовать любой метод с функцией обхода.

Способ 1: в цикле

//运行时间:1148ms 占用内存:77864k
function iterate(obj) {
    let result = [];
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            result.push(key+': '+obj[key]);//使用obj.key部分代码不能通过
        }
    }
    return result;
}

Все объекты, которые наследуются от Object, будут наследоваться отhasOwnProperty()метод.obj.hasOwnProperty(prop)Метод возвращает логическое значение, указывающее, имеет ли объект obj указанное свойство свойства в своих собственных свойствах. Этот метод можно использовать для определения наличия у объекта определенных собственных свойств и игнорирования свойств, унаследованных от цепочки прототипов.

Способ 2: карта

//运行时间:1133ms 占用内存:77828k
function iterate(obj) {
    return Object.getOwnPropertyNames(obj).map(key=>{
        return key+": "+obj[key];
    });
}

Object.getOwnPropertyNames()Метод возвращает массив, состоящий из имен свойств всех собственных свойств указанного объекта (включая неперечисляемые свойства, но не свойства со значениями Symbol в качестве имен).Способ 3: для каждого

//运行时间:1173m  占用内存:77872k
function iterate(obj) {
    let arr=Object.keys(obj);
    let resArr=[];
    arr.forEach(item=>{
        resArr.push(item+': '+obj[item])
    })
    
    return resArr
     
}

Большинство из последних 5 вопросов можно реализовать с помощью регулярных выражений. Для регулярных выражений вы можете увидетьНе запоминайте регулярные выражения

40. Определить, содержит ли он числа

Способ 1: Обычный тест/сопоставление

function containsNumber(str) {
    // return /\d/.test(str);
     return !!str.match(/\d/g);
}


Способ 2: Траверс

function containsNumber(str) {
    for(let i=0;i<10;i++){
        if(str.indexOf(i)!=-1){
            return true;
        }
    }
    return false;
}

Конечно, если вы хотите бросить, есть и чистое решение js:

Способ 3: цикл for + charCodeAt()

function containsNumber(str) {
    let res = str.split('')
    for(let i = 0;i<res.length; i++){
         let temp = res[i].charCodeAt();
          if(temp>=48 &&temp<=57){
               return true
         }
        }
    return false
}

Способ 4: цикл for +Число()

function containsNumber(str) {
    let res = str.split('')
   for(let i = 0;i<res.length; i++){
             let temp = Number(res[i]);
             if(temp){
                return true
          }
         }
    return false
}

41. Проверьте наличие повторяющихся строк

function containsRepeatingLetter(str) {
    return /([a-zA-Z])\1/.test(str);
}

В регулярных выражениях используйте () для группировки, используйте косую черту и числа для обозначения ссылок, \1 относится к первой группе, а \2 относится ко второй группе. Используйте [a-zA-Z] как группу, а затем кавычки, вы можете определить, есть ли последовательные повторяющиеся буквы.

Способ 2: строковый метод

function containsRepeatingLetter(str) {
    let reg = /[a-zA-Z]/;
    for(let i = 0;i < str.length;i++){
        if(str.charAt(i)==str.charAt(i+1)&&reg.test(str[i])){
            return true;
        }
    }
    return false;
}

42. Определите, заканчивается ли оно на гласную букву

Сначала определите набор гласных[a,e,i,o,u], за которым следует окончание гласной, за которым следует $ , за которым следует подстановочный знак, за которым следует i.

function endsWithVowel(str) {
    return /[a,e,i,o,u]$/i.test(str);
    //或者
    // return /(a|o|e|i|u)$/gi.test(str);
}

Или просто грубо:

function endsWithVowel(str) {
    return str && ("aeiouAEIOU".indexOf(str[str.length-1]) > -1);
}

43. Получить указанную строку

function captureThreeNumbers(str) {
    //声明一个数组保存匹配的字符串结果
    let arr = str.match(/\d{3}/);
    //如果arr存在目标结果,则返回第一个元素,即最早出现的目标结果
    if(arr){
        return arr[0];
    } else{
        return false;
    } 
}

44. Определите, соответствует ли он указанному формату

function matchesPattern(str) {
    return/^\d{3}-\d{3}-\d{4}$/.test(str);
}
本题需要注意格式,开头 ^ 和结尾 $ 必须加上来限定字符串,3个数可表示为\d{3},4个数则为\d{4},{n}表示前面内容出现的次数。正则表达式可写作 /^ \d{3}-\d{3}-\d{4}$ / ,有相同部分\d{3}-,因此也可写作 /^(\d{3}-){2}\d{4}$/ 。

45. Определите, соответствует ли он формату долларов США.

function isUSD(str) {
    return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str);
}
? 匹配前面一个表达式0次或者1次。等价于 {0,1}。
例如,/e?le?/ 匹配 'angel' 中的 'el',和 'angle' 中的 'le' 
(注意第二个 ? 前面的匹配表达式是 e 而不是 le) 以及 'oslo' 中的'l'。

如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省
使用的贪婪模式(匹配尽可能多的字符)正好相反。
例如,对 "123abc" 应用 /\d+/ 将会返回 "123",如果使用 /\d+?/,那么就只会匹配到 "1"。
还可以运用于向前断言 正向肯定查找x(?=y) 和 正向否定查找x(?!y) 。

* 匹配前一个表达式0次或多次。等价于 {0,}。
例如,/bo*/会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b', 
但是在 "A goat grunted" 中将不会匹配任何东西。

. (小数点)匹配  除了换行符(\n)之外的任何单个字符。
例如, /.n/将会匹配"nay, an apple is on the tree"中的'an'和'on', 但是不会匹配 'nay'。

💕 После прочтения трех вещей:

  1. Нравится | Можно点击——>收藏——>退出За один раз, но не забудьте поставить лайк 🤭
  2. Подписывайтесь | Нажмите, чтобы подписаться, не теряйтесь в следующий раз😘
  3. так же доступноGitHubПолучить все исходники моих статей 🤗