предисловие
Увидел интересный тест в сети,адрес. Он содержит 25 вопросов с несколькими вариантами ответов, каждый из которых представляет собой простое выражение, а затем позволяет вам выбрать, что является воплощением какого-то странного поведения JavaScript, и, наконец, веб-сайт генерирует ответы и анализирует, чтобы помочь вам лучше понять странное поведение JavaScript.
Здесь я делюсь 10 вещами, которые я считаю интересными, надеюсь, это поможет вам
тестовое задание
-
[,,,].lengtha. 0
b. 3
c. 4
d. SyntaxError
-
10,2
a. 10.2
b. 10
c. 2
d. 20
-
true == "true"
a. true
b. false
-
010 - 03
a. 7
b. 5
c. 3
d. NaN
-
1/0 > Math.pow(10, 1000)
a. true
b. false
c. NaN
d. SyntaxError
-
0/0
a. 0
b. Infinity
c. NaN
d. SyntaxError
-
true++
a. 2
b. undefined
c. NaN
d. SyntaxError
-
true + ("true" - 0)
a. 1
b. 2
c. NaN
d. SyntaxError
-
undefined + false
a. "undefinedfalse"
b. 0
c. NaN
d. SyntaxError
-
NaN++
a. NaN
b. Undefined
c. TypeError
d. SyntaxError
Отвечать
-
[,,,].lengtha. 0
b. 3
c. 4
d. SyntaxError
Анализ: б. разреженный массив,
[,,]Средний элементempty, которые мы называем разреженными массивами, и мы также можем создавать разреженные массивы аналогично new Array(2). Так почему не 4, а 3? Это с JavaScriptзамыкающая запятаяСвязанный. Разрешение в MDN выглядит следующим образом:замыкающая запятая(иногда называемая «конечная запятая») полезна при добавлении элементов, параметров, атрибутов в код JavaScript. Если вы хотите добавить новое свойство, а в предыдущей строке уже есть завершающая запятая, вы можете просто добавить новую строку, не изменяя предыдущую строку. Это делает сравнение кода (diffs) для контроля версий более чистым и избавляет от хлопот при редактировании кода.
На самом деле это больше используется, когда мы обычно пишем объекты (если это позволяет ESlint).
var object = { foo: "bar", baz: "qwerty", age: 42, // 注意 };На самом деле то же самое верно и для массива, так что нетрудно понять вышеприведенный вывод.
var arr = [ 1, 2, 3, ]; arr; // [1, 2, 3] arr.length; // 3 -
10,2
a. 10.2
b. 10
c. 2
d. 20
Разбор: c. Оператор запятой возвращает только значение последнего оператора. Это позволяет создать составное выражение, в котором оцениваются несколько выражений, где составное выражение является значением последнего выражения. Может использоваться в циклах for. Если вы этого не понимаете, в комментариях вы можете прочитатьMDN
for (var i = 0, j = 9; i <= 9; i++, j--) console.log('a[' + i + '][' + j + '] = ' + a[i][j]);function myFunc() { var x = 0; return (x += 1, x); // the same as return ++x; } -
true == "true"
a. true
b. false
Анализ: б. По правилам неявного преобразования типов.
Number(true); // -> 1 Number("true"); // -> NaN 1 == NaN; // -> false -
010 - 03
a. 7
b. 5
c. 3
d. NaN
Анализ: б. 010 рассматривается JavaScript как восьмеричное число. Следовательно, его значение равно основанию 8. 010 анализируется как 8, минус 3, чтобы получить 5.
-
1/0 > Math.pow(10, 1000)
a. true
b. false
c. NaN
d. SyntaxError
Анализ: б. Оба выражения есть Бесконечность. Бесконечность Оба равны.
1/0; // -> Infinity Math.pow(10, 1000); // -> Infinity Infinity > Infinity; // -> false -
0/0
a. 0
b. Infinity
c. NaN
d. SyntaxError
Анализ: Из-за уравнения
0/0не имеет значимого числового ответа, вывод простоNaN. -
true++
a. 2
b. undefined
c. NaN
d. SyntaxError
Разбор: д. Будет следующее странное поведение, и undefined не сообщит об ошибке. [Я также не могу найти подходящей причины для объяснения здесь].
1++; // -> SyntaxError "x"++; // -> SyntaxError undefined++; // -> NaNЕсли вы хотите, чтобы он не сообщал об ошибке, вам необходимо:
let x = true; x++; x; // -> 2 -
true + ("true" - 0)
a. 1
b. 2
c. NaN
d. SyntaxError
Анализ: То же, что и 3.
Number("true"); // -> NaN -
undefined + false
a. "undefinedfalse"
b. 0
c. NaN
d. SyntaxError
Разобрать:
falseможно преобразовать в числа,undefinedне можем.Number(false); // -> 0 Number(undefined); // -> NaN NaN + 0; // -> NaNНо undefined можно снова преобразовать в false.
!!undefined === false; // -> trueТаким образом, указанное выше должно быть 0. должен:
!!undefined + false; // -> 0 -
NaN++
a. NaN
b. Undefined
c. TypeError
d. SyntaxError
Ответ: а.
NaNне является числом, поэтому его нельзя увеличить. Это также означаетNaNа такжеNaN++представляют одно и то же значение.
Эпилог
Причина, по которой Javascript имеет вышеуказанную странную производительность, в основном заключается в том, что первоначальный дизайн был слишком поспешным, и в 1995 году на его завершение ушло всего 10 дней. Мы можем не часто использовать вышеперечисленное поведение, но знание их также может помочь нам глубже понять JavaScript. Так что я настоятельно рекомендую вам сделать это25 вопросов, Почувствуй это.