Первый вопрос
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