Запишите предварительный письменный тестовый вопрос | Техническое эссе Nuggets

внешний интерфейс Технологии Nuggets призывают к публикации алгоритм JavaScript

Первый вопрос

    console.log(a)       //       undefined
    var a = 1;
    var getNum = function() {
        a = 2;
    }
    function getNum() {
        a = 3;
    }
    console.log(a)      //        1
    getNum()
    console.log(a)      //        2

Этот вопрос исследует в основномпретензияа такжеОбъявления функций предшествуют объявлениям переменныхЭти две точки знания. При разборе этого js-фрагмента в таком порядке:

// 声明提升
function getNum() {
    a = 3;
}
var a;
var getNum;

// 
console.log(a);
a = 1;
getNum = function() {
    a = 2;
}
console.log(a)
getNum()
console.log(a)

Это очень ясно Когда a выводится в первый раз, оно только объявлено и не было назначено, поэтомуundefined. Излишне говорить, что второй раз. Третий вывод 2 связан с тем, что объявления переменных не могут переопределять объявления функций.getNumУказывает на функцию, а затем присваивает ее функциональному выражению, которое указывает на другую функцию.

вопрос 2

// 每隔一秒输出一次i值
for(var i = 0; i < 5; i++){
    // TODO
}

Главный тест этого вопросаЗакрытиеа такжемеханизм выполнения js. Следующие решения:

возможноВерсия, которая выводит один раз в секунду:

// 利用立即执行函数形成闭包
(function(i){
    setTimeout(function() {
        console.log(i)
}, i * 1000)})(i)
// 利用setTimeout的第三个参数形成闭包
setTimeout(function(i) {
    console.log(i)
}, i * 1000, i)
// 如果不是题目中指定了var,利用ES6的let就简单多了
for(let i = 1; i < 5; i++) {
    setTimeout(function(){
        console.log(i)
    }, i * 1000)
}
// 再看ES7版本
const sleep = (time) => 
    new Promise((resolve, reject) => 
        setTimeout(resolve, time));
(async function(){
   for(var i = 0; i < 5; i++){
       await sleep(1000);
       console.log(i);
   }
})()

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

Механизм выполнения js см. здесьНа этот раз полностью понять механизмы реализации JavaScript

посмотрите на сравнениеточный1 вторая версия:

for(var i =0; i < 5; i++) {
    var time = new Date();
    while(new Date() - time < 1000) {
    }
    console.log(i)
}

Заблокируйте ветку сразу на одну секунду, просто и грубо~

Вопрос 3

var a = {}
var b = {
    key: "a" 
}
var c = {
    key: "c"
}

a[b] = "123";
a[c] = "456";

console.log(a[b])  // 456

Этот вопрос исследует в основномобъект. Все ключевые атрибуты объекта имеют строковый тип JS (один из которых является разницей между структурой данных Карты, ключ Карты может быть любого типа) и будут преобразованы, поэтомуa[b]а такжеa[c]И b, и c вobject.prototype.toString()Принужденные в струну, все становятся[object Object], так что это не имеет ничего общего со значением ключа в объекте. такa[b]а такжеa[c]Направления те же.

Вопрос 4

var f = function() {
    var c = "ccc";
    return {
        a: function() {
            return c;
        },
        b: function(d) {
            c = d;
        }
    }
}()

console.warn(f.a())         // ccc
console.warn(f.c)           // undefined
console.warn(f.b("www"))    // undefined
console.warn(f.a())         // www

Этот вопрос в основном исследует контекст выполнения.цепочка прицелов. Следует обратить внимание на исполняющую функцию после функционального выражения - (), это функция немедленного исполнения, то есть f - это объект, содержащий атрибуты a и b.

console.warn(f.a()) 

Когда активируется контекст выполнения a(), определяются область видимости и переменный объект, переменная c является свободной и ее нужно искать в цепочке областей видимости, но она находится в родительской области видимости, поэтому выводится «ccc». .

console.warn(f.c)

Излишне говорить, что в f нет атрибута c, и если вы не можете его получить, вы, конечно, вернетесьundefined.

console.warn(f.b("www"))

Как и в первой строке, измените C, но, поскольку возвращаемое значение отсутствует, оно не определено.

Вопрос 5

Ввод дедупликации массива[1,2,3,1,'1','2',2]вернуть[1,2,3,'1','2']. Есть много способов сделать это.

(function(arr){
    console.log([...(new Set(arr))])
})([1,2,3,1,'1','2',2])

Благодаря тому, что ключ структуры Map может быть любого типа, можно хорошо различить символ «1» и цифру 1, в то время как значение ключа обычного объекта является строковым типом, который нельзя различить между двумя .

(function(arr) {
    let hash = new Map();
    arr = arr.reduce((item, value) => {
        hash.has(value) ? '' : hash.set(value, true) && item.push(value)
        return item;
    }, [])
    console.log(arr)
})([1,2,3,1,'1','2',2])

Вопрос 6

Существует два строчных буквы S1, S2, S2 - S1 после хаоса, добавьте строчный символ, Программирование Чтобы получить добавленные символы в S2, сложность времени алгоритма предпочтительно близка к O (N) (например, S1 'ABC', S2 - «CBAD», то повышенный характер - «D»).

Решение первое

Размышление автора над этим вопросом, во-первых, учитывая, что добавленные символы могут уже существовать в s1, затем путем обхода +indexOf()Решение s1 и s2 бесполезно, поэтому, когда я писал этот вопрос, учитывая, что разница между s1 и s2 только в одном символе, я просто заполнил символы s1 и s2 одним объектом и подсчитал количество каждого символа. , нечетное число является дополнительным символом. (Также добро пожаловать, чтобы дать лучшее решение в области комментариев) Код выше:

var s1 = "aaabweddccc";
var s2 = "aaaewwbcccdd";
(function(a,b){           
    let all = a + b;
    let allLen = all.length;
    let hash = {};
    for(let i = 0; i < allLen; i++) {
        hash[all[i]] ? hash[all[i]]++ : hash[all[i]] = 1;              
    } 
    console.log(hash)                          
    for(let j in hash) {
        if(hash[j] % 2 !== 0) {
            console.log(j)
        }
    }
})(s1,s2)

результат операции:

Решение второе

Этот метод пришел мне на ум позже. Идея такова, если две строки отсортированы до вставки лишнего символа, символы в соответствующих позициях двух строк должны быть одинаковыми, а после вставки символа должна быть позиция, где символы не совпадают .

(function(a,b){           
    a = a.split("").sort()
    b = b.split("").sort()
    for(let i = 0, len = b.length; i < len; i++) {
        if(a[i] !== b[i])
        console.log(b[i])             
    } 
})(s1,s2)

результат операции:

Суммировать

Всего есть 6 вопросов, основы теста, в том числе:

  • претензия
  • Закрытие
  • контекст выполнения
  • механизм выполнения js
  • ......

Приветствуем всех, кто исправит приведенный выше контент в области комментариев~

Ссылка на приглашение к участию в конкурсе Nuggets Technology:juejin.cn/post/1