Подтвердить что ты не робот

Почему ",," == Массив (4) в Javascript?

Загрузите свой интерпретатор/консоль и попробуйте сравнить

> ",,," == Array(4)
True

Почему? Сначала я подумал, что, поскольку вы можете думать о ",," как массив из четырех символов с завершающим фрагментом "\ 0", возможно, поэтому, но

> "..." == Array(4)

Возвращает "False". Итак... почему? Я знаю это какой-то идиосинкразированный бит утки, набирающий текст в Javascript, но просто любопытно, что подчеркивает это поведение. Выбрал это от Зеда Шоу отлично презентация здесь, btw.

4b9b3361

Ответ 1

Поскольку правый операнд преобразуется в строку, а строковое представление Array(4) равно ,,,:

> Array(4).toString()
  ",,,"

Если вы используете функцию конструктора массива и передаете число, он устанавливает длину массива на это число. Таким образом, вы можете сказать, что у вас есть четыре пустых индекса (то же, что и [,,,]), а строковое представление массивов по умолчанию представляет собой список элементов, разделенных запятыми:

> ['a','b','c'].toString()
  "a,b,c"

Как работает сравнение, описано в разделе 11.9.3 спецификации. Там вы увидите (x == y):

8. Если Type (x) является либо String, либо Number и Type (y) - Object,
   верните результат сравнения x == ToPrimitive (y).

(массивы - это объекты в JavaScript)

и если вы следуете методу ToPrimitive, вы в конце концов обнаружите, что он вызывает toString.

Ответ 2

Попробуйте использовать ===. При использовании == в Javascript он попытается использовать переменные, что приведет к таким проблемам. Консоль передает Array(4) в строковое представление (т.е. Array(4).toString), которое равно ",,,". Причина заключается в том, что функция .toString() добавляет их к отдельным элементам в массиве.

Смотрите фрагмент ниже:

document.write( Array(4).toString() );

Ответ 3

Внутренне его движение

",,," == Array(4).toString()

Ответ 4

Это связано с тем, что Array(4) инициализирует массив из 4 пустых значений, a == неявно преобразует, поэтому:

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

Все схожие.

== выполняет неявные преобразования типов перед сравнением значений, что может привести к непредсказуемым результатам. Используйте ===, чтобы проверить тип и значение.

Ответ 5

Сравнение массива с строкой принуждает Array к строке перед выполнением сравнения. Принуждение пустого 4-элементного массива к строке дает точную строку.

Ответ 6

Сначала я подумал, что это что-то с "prototype"... но после небольшого расследования я дошел до грустного заключения...

По-видимому, это внутренняя и более неясная вещь js с не так много логики...

Просто попробуйте

Array(4)==Array(4)

и никакого принуждения по типам также...

Array(4)===Array(4)

и вы получите FALSE

вы знаете, что null==null, null===null и даже undefined==undefined и undefined===undefined возвращает TRUE... так что... это немного неясно...

Array(4)==[,,,] должно быть истинным также