Вопрос по javascript – Почему «,,,» == Array (4) в Javascript?

118

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

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

Зачем? Сначала я подумал, может быть, так как вы могли подумать о & quot; ,,, & quot; в виде массива из четырех символов с '\ 0'; завершающий срез, возможно, поэтому, но

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

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

Это одна из многих веских причин всегда использовать=== вместо==. wprl
Если я могу спросить, что привело к этому открытию? SomeKittens
Немногие языки, кроме C, используют нулевое завершение способом, видимым для программиста. Joey
@SomeKittens Это также упоминается в (довольно хорошо известном) & quot; wat & quot; поговорим, показывая некоторые причуды в Ruby и JavaScriptdestroyallsoftware.com/talks/wat Cronco
@SomeKittens Zed Shaw прямо упоминает об этом в видео, на которое я ссылаюсь в своем вопросе (как критика Javascript). Ура! ZenLikeThat

Ваш Ответ

6   ответов
5

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

31

Внутренне это происходит

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

ениеArray(4) является,,,:

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

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

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

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

8. If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).

(arrays are objects in JavaScript)

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

Отличный ответ, очень точный.
Что, в свою очередь, связано с тем, что массивы преобразуются в строку, как если бы они использовалиArray.join(",").
Вы должны быть чертовски терпеливы, чтобы программировать в JavaScript
Хорошо, теперь это все имеет смысл для меня. Благодарю. ZenLikeThat
32

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

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

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

4

что это что-то с «прототипом» ... но после небольшого расследования я пришел к печальному выводу ...

Очевидно, это внутренняя и более неясная вещь с небольшой логикой ...

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

Array(4)==Array(4)

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

Array(4)===Array(4)

и вы получите ЛОЖЬ

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

Array(4)==[,,,] должно быть правдой также

ZEE, Array (4) == [,,,] не будет правдой. Если мы сравним объект с примитивом, то объект будет преобразован в примитив. Вот почему он вызывает toString ().
массив (x) должен быть адресом конструктора ... в любом случае, в системе (не беспокойтесь о том, какая система), & lt; identity_X & gt; === & lt; identity_X & gt; всегда должно быть правдой!
18

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

 ",,," == Array(4)

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

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

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

Все похожи.

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

Похожие вопросы