предисловие
❝На длинном пути программирования всегда есть ямы, которые заставят вас плакать.
❞
[1,2,5,10].sort()
Если вы не пишете функцию обратного вызова, каков порядок?
JavaScript использует буквенно-цифровую сортировку по умолчанию. Итак, результат [1,10,2,5]
При правильной сортировке должно быть [1,2,5,10].sort( (a,b) => a-b )
"b" + "a" + +"a" + "a"
Как вы думаете, что на выходе?
Приведенное выше выражение эквивалентно 'b'+'a'+(+'a')+'a', поскольку (+'a') равно NaN, поэтому:
'b'+'a'+ (+'a')+'a' = 'b'+'a'+ "NaN"+'a'='baNaNa'
Закрытие
Это классический вопрос на собеседовании по JavaScript.
let res = new Array()
for(var i = 0; i < 10; i++){
res.push(function(){
return console.log(i)
})
}
res[0]()
res[1]()
res[2]()
Ожидаемый результат — 0, 1, 2, но это не так. Причина в том, что он включает"сфера", как решить?
- [x] Используйте let вместо var для формирования области блока
- [x] Использовать функцию привязки.
res.push(console.log.bind(null, i))
Есть и другие решения, такие как использование IIFE, формирование приватной области и так далее.
Еще одна классическая проблема закрытия
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
"оставить вас думать"
неявное преобразование
var a = [0];
if (a) {
console.log(a == true);
} else {
console.log("wut");
}
Как вы думаете, какой ответ? Этот вопрос связан с неявным преобразованием, я сам восполню эту яму.
// ответ: ложь
"Еще раз?"
function fn() {
return 20;
}
console.log(fn + 10); // 输出结果是多少
function fn() {
return 20;
}
fn.toString = function() {
return 10;
}
console.log(fn + 10); // 输出结果是多少?
function fn() {
return 20;
}
fn.toString = function() {
return 10;
}
fn.valueOf = function() {
return 5;
}
console.log(fn + 10); // 输出结果是多少?
"В конце концов, преобразование типов JS хорошо составлено"
ты действительно понимаешь операторов
[1<2<3,3<2<1]
//[false,false]
//[true,true]
//[false,true]
//[true,false]
Выберите один, оператор сравнения или оператор присваивания, который имеет более высокий приоритет?
0.1+0.2 !== 0.3 ?
Во время интервью, если вам задают этот вопрос, если ответ неправильный, считается, что интервьюер очень подозрительно относится к основам! ! !
Задавая вам этот вопрос, вы можете задать много вопросов, например, как JS хранит десятичные дроби? Например, давайте поговорим о двоичном коде, например, в реальной разработке, когда вы сталкиваетесь с проблемами точности, как вы их решили и какие у вас есть хорошие решения.
Поговорив об этом, вы можете обратиться к максимальному безопасному числу, например, каково максимальное безопасное целое число JavaScript.Если оно превышает этот диапазон, как решить проблему точности?
Какую проблему решает недавно предложенный BigInt в спецификации ES, и какие подводные камни вы обнаружили в BigInt?
Как решить проблему точности?
Рекомендуется здесьNumber-PrecisionБиблиотека размером менее 1К.
arguments
function sidEffecting(ary) {
ary[0] = ary[2];
}
function bar(a, b, c) {
c = 10
sidEffecting(arguments);
return a + b + c;
}
function demo (arg) {
arg.name = 'new Name'
}
console.log(bar(2, 2, 2))
Когда дело доходит до грамматики ES6, ответ на этот вопрос определенно будет 22, но, если немного изменить вопрос, он будет более ямочным....
function sidEffecting(ary) {
ary[0] = ary[2];
}
function bar(a, b, c = 4) {
c = 10
sidEffecting(arguments);
return a + b + c;
}
function demo (arg) {
arg.name = 'new Name'
}
console.log(bar(2, 2, 2))
Какой ответ? Согласно более точному определению аргумента на MDN, см.argument
❝Когда функция в нестрогом режиме"имеют"Включаютостальные параметры,параметры по умолчаниюиприсваивание деструктуризации,Так
❞arguments
значение в объекте"Не буду"Отслеживание значения параметра (и наоборот).
Найдите это предложение, функция bar имеет параметры по умолчанию, и в нестрогом режиме, поэтому значение параметра не будет отслеживаться, естественный результат 14
"Читателям предлагается испытать"
История путаницы в браузерах
let demo1 = {class: "Animal", name: 'sheet'};
console.log(demo1.class)
Мошенник, это связано с браузерами, класс - это зарезервированное слово (теперь класс - это ключевое слово), ответ не имеет значения, важно стараться избегать зарезервированных слов при взятии имен атрибутов. Если вы используете его, пожалуйста, добавьте кавычки ['класс'].
"Зарезервированные слова против ключевых слов"
Насколько я понимаю лично, ключевое слово имеет особое значение и не используется как имя переменной. Например
let class = 123;
Сейчас это кажется неправильным, так на что мы должны обратить внимание?
let undefined = 123;
Таким образом, ошибка не будет сообщена. Это как-то связано с браузером. Похоже, что undefined не является ключевым словом. Так что просто на всякий случай,"Предполагается, что если вы оцениваете, является ли переменная неопределенной, попробуйте использовать void 0 === undefined"Очень вероятно, что undefined будет присвоено как переменная
"значение void 0 не определено"
["1", "2", "3"].map(parseInt)
Это должен быть часто встречающийся вопрос, очень просто понять, как использовать функцию карты и как использовать функцию parseInt.
По поводу массивов Array я писал статью ранее, из"Угловой анализ исходного кода большинства методов"
Нажмите, чтобы просмотреть его еще раз:[Галантные товары👍] От детальной работы массива js до анализа array.js в v8
map принимает два параметра, один callback, один this, то есть this указывает на при вызове функции, где callback функция обратного вызова это три параметра, одно currentValue, index, array;
parseInt принимает два параметра: строка, основание (основание)
Есть два случая, когда возвращается NaN
-
radix
меньше, чем2
или больше, чем36
,или - Первый символ, не являющийся пробелом, не может быть преобразован в число.
- Когда основание равно 0 или не определено, это особый случай, особенно асинхронный.MDN
parseInt('1', 0);
parseInt('2', 1);
parseInt('3', 2);
Если их объединить, результат, естественно, очевиден: [1,NaN,NaN]
Почему Math.min() больше, чем Math.max()?
Math.min() < Math.max() // false
По общему замыслу должно быть верно, ведь минимальное значение должно быть меньше максимального, а реальная ситуация ложная
причина:
- Аргументы для Math.min равны нулю или больше. Если несколько параметров легко понять, верните наименьший из параметров.
- Если 0 аргументов или нет аргументов, возврат"Infinity".
- И Math.max() возвращает -Infinity, когда аргументы не передаются.
Если интервьюер задает этот вопрос, э. . . .
[].concat[1,2,3]
Какой вывод? Обратите внимание, что не [].concat([1,2,3])
// [1,2,3]
// Uncaught SyntaxError: ....
// undefined
Ответ не определен, в чем причина?
-
Первый шаг вычисляет [].concat, результатом является Array.prototype.concat
-
На втором этапе выполняется оператор запятой, который оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.
>1,2,3 返回3
-
Третий шаг выполняет операцию доступа к массиву или операцию доступа к свойству.
Таким образом, приведенный выше [].concat[1,2,3] эквивалентен Array.prototype.concat[3]
Тогда результат закономеренundefined
.
[1,2,NaN,3].indexOf(NaN)
//2 or -1
- Метод indexOf выполнит строгое суждение о равенстве
- NaN !== NaN
Как это сделать?
let realIsNaN = value => typeof value === 'number' && isNaN(value);
Тип должен оцениваться в первую очередь, потому что преобразование строки сначала будет преобразовано в число, а ошибка преобразования будет NaN. Таким образом, он равен NaN.
isNaN('jjjj') —> true
Второй метод
let realIsNaN = value => value !== value;
Number.isFinite & isFinite
Number.isFinite('0') === isFinite('0')
Number.isFinite(0) === isFinite('0')
Каков результат печати, можно подробнее?
❝Number.isFinite() обнаруживает конечные значения, только по сравнению с глобальной функцией isFinite(), этот метод не заставляет нечисловой параметр преобразовываться в числовое значение, что означает, что возвращаются только значения числового типа. если есть конечное
❞true
.
Естественный ответ ложный, истинный
Легко упускаемый из виду вопрос на собеседовании
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
метод проталкивания
let newList = [1,2,3].push(4)
console.log(newList.push(4))
Как вы думаете, что на выходе?
// Error
Причина в Array.prototype.pu sh() возвращает длину нового массива, поэтому 4.push(5) естественно Ошибка
7.13 волна обновлений
Автоматическая вставка точки с запятой
function foo1()
{
return {
bar: "hello"
};
}
function foo2()
{
return
{
bar: "hello"
};
}
var a=foo1();
var b=foo2();
console.log(a) //Object {bar: "hello"}
console.log(b) //underfind
//仔细看就知道了
// 会在第10行加入一个`;`
Автоматически добавит точку с запятой в строке 10, поэтому возврат не определен.
let var
function foo() {
let a = b = 0;
a++;
return a;
}
foo();
typeof a; // => ???
typeof b; // => ???
Приведенное выше пусть a = b = 0 эквивалентно window.b = 0, пусть a = b;
проблема со зрением
const length = 4;
const numbers = [];
for (var i = 0; i < length; i++);{
numbers.push(i + 1);
}
numbers; // => ???
Единственное, что нужно знать, этоfor语句
вернул;
скульптура из песка
добавлять;
, он будет считать, что выполнение for завершено, поэтому все указанные операторы пусты, а окончательные числа равны [5]
Получить определенный символ индекса в строке
console.log('Hello World'[4])
Квадратная скобка используется для получения символа по определенному индексу строки.Стоит отметить, что более ранняя версия IE7 использует charAt()
Таким образом, этот вопрос выводит o
!==
const name = 'TianTianUp'
console.log(!typeof name === 'string')
console.log(!typeof name === 'object')
typeof name возвращает «строку», строка «строка» является истинным значением. следовательно! typeof name возвращает логическое значение false. так
ложь === 'строка'
и false === 'object' возвращает false
(Чтобы определить значение типа, мы должны использовать !== вместо !typeof)
forEach
const nums = [1, 2, 3, 4, 5, 6];
let firstEven;
nums.forEach(n => {
if (n % 2 ===0 ) {
firstEven = n;
return n;
}
});
console.log(firstEven);
Единственное, на что следует обратить внимание, так это на то, как написан исходный код forEach.Любой, кто читал исходный код, знает, что forEach не может использовать return для завершения цикла.Иными словами, каждый раз, когда вызывается callback-функция, текущая вызывается. завершен, а не весь цикл.
Результат естественно 6
Непрерывное обновление
Есть хорошие темы, или питы, в которых легко ошибиться в JS, пользователи Nuggets могут их придумать ❤️, буду обновлять 🆗
❤️ Всем спасибо
Если вы считаете этот контент полезным:
-
Поставьте лайк и поддержите его, чтобы больше людей увидело этот контент
-
Вы можете поделиться со мной своими мыслями в области комментариев, и вы также можете записать свой мыслительный процесс в области комментариев.
-
Если вы считаете, что это хорошо, вы также можете прочитать предыдущие статьи:
[Полная искренность👍] Советы по отладке Chrome DevTools, эффективность➡️🚀🚀🚀
[Практично 👍] Порекомендуйте несколько отличных интерфейсных веб-сайтов.
[Галантные товары👍] От детальной работы массива js до анализа array.js в v8
[1.2W word👍] Читы на девушку - как работает браузер (Часть 1)
[1.1W word] Читы на девушку - как работает браузер (процесс рендеринга)
[Полная искренность✍]Приглашаем вас заполнить несколько ям JS, подверженных ошибкам.
9 основных операций связанного списка "алгоритмы и структуры данных"