[Интервью] Странный JavaScript

внешний интерфейс JavaScript опрос
[Интервью] Странный JavaScript

предисловие

Увидел интересный тест в сети,адрес. Он содержит 25 вопросов с несколькими вариантами ответов, каждый из которых представляет собой простое выражение, а затем позволяет вам выбрать, что является воплощением какого-то странного поведения JavaScript, и, наконец, веб-сайт генерирует ответы и анализирует, чтобы помочь вам лучше понять странное поведение JavaScript.

Здесь я делюсь 10 вещами, которые я считаю интересными, надеюсь, это поможет вам

тестовое задание

  1. [,,,].length

    a. 0

    b. 3

    c. 4

    d. SyntaxError

  2. 10,2

    a. 10.2

    b. 10

    c. 2

    d. 20

  3. true == "true"

    a. true

    b. false

  4. 010 - 03

    a. 7

    b. 5

    c. 3

    d. NaN

  5. 1/0 > Math.pow(10, 1000)

    a. true

    b. false

    c. NaN

    d. SyntaxError

  6. 0/0

    a. 0

    b. Infinity

    c. NaN

    d. SyntaxError

  7. true++

    a. 2

    b. undefined

    c. NaN

    d. SyntaxError

  8. true + ("true" - 0)

    a. 1

    b. 2

    c. NaN

    d. SyntaxError

  9. undefined + false

    a. "undefinedfalse"

    b. 0

    c. NaN

    d. SyntaxError

  10. NaN++

    a. NaN

    b. Undefined

    c. TypeError

    d. SyntaxError

Отвечать

  1. [,,,].length

    a. 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
    
  2. 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;
    }
    
  3. true == "true"

    a. true

    b. false

    Анализ: б. По правилам неявного преобразования типов.

    Number(true); // -> 1
    Number("true"); // -> NaN
    1 == NaN; // -> false
    
  4. 010 - 03

    a. 7

    b. 5

    c. 3

    d. NaN

    Анализ: б. 010 рассматривается JavaScript как восьмеричное число. Следовательно, его значение равно основанию 8. 010 анализируется как 8, минус 3, чтобы получить 5.

  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
    
  6. 0/0

    a. 0

    b. Infinity

    c. NaN

    d. SyntaxError

    Анализ: Из-за уравнения0/0не имеет значимого числового ответа, вывод простоNaN.

  7. true++

    a. 2

    b. undefined

    c. NaN

    d. SyntaxError

    Разбор: д. Будет следующее странное поведение, и undefined не сообщит об ошибке. [Я также не могу найти подходящей причины для объяснения здесь].

    1++; // -> SyntaxError
    "x"++; // -> SyntaxError
    undefined++; // -> NaN
    

    Если вы хотите, чтобы он не сообщал об ошибке, вам необходимо:

    let x = true;
    x++;
    x; // -> 2
    
  8. true + ("true" - 0)

    a. 1

    b. 2

    c. NaN

    d. SyntaxError

    Анализ: То же, что и 3.

    Number("true"); // -> NaN
    
  9. 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
    
  10. NaN++

    a. NaN

    b. Undefined

    c. TypeError

    d. SyntaxError

    Ответ: а.NaNне является числом, поэтому его нельзя увеличить. Это также означаетNaNа такжеNaN++представляют одно и то же значение.

Эпилог

Причина, по которой Javascript имеет вышеуказанную странную производительность, в основном заключается в том, что первоначальный дизайн был слишком поспешным, и в 1995 году на его завершение ушло всего 10 дней. Мы можем не часто использовать вышеперечисленное поведение, но знание их также может помочь нам глубже понять JavaScript. Так что я настоятельно рекомендую вам сделать это25 вопросов, Почувствуй это.