Загрузите свой интерпретатор / консоль и попробуйте сравнение
> ",,," == Array(4)
True
Зачем? Сначала я подумал, что, может быть, так как вы могли представить «,,,» как массив из четырех символов с завершающим срезом '\ 0', может быть, поэтому, но
> "..." == Array(4)
Возвращает «Ложь». Итак ... почему? Я знаю, что это какой-то своеобразный утиный ввод в Javascript, но мне просто любопытно, что подчеркивает такое поведение. Позаимствовал это из отличной презентации Зеда Шоу здесь, кстати .
javascript
ZenLikeThat
источник
источник
===
вместо==
.Ответы:
Поскольку правая операнд преобразуется в строку и строковое представление
Array(4)
является,,,
:Если вы используете функцию конструктора массива и передаете число, она устанавливает длину массива равной этому числу. Таким образом, вы можете сказать, что у вас есть четыре пустых индекса (таких же, как
[,,,]
), а строковое представление массивов по умолчанию - это список его элементов, разделенных запятыми:Как работает сравнение, описано в разделе 11.9.3 спецификации . Там вы увидите (
x == y
):(массивы - это объекты в JavaScript)
и если вы последуете этому
ToPrimitive
методу, вы в конечном итоге обнаружите, что он вызываетtoString
.источник
Array.join(",")
.Внутренне это происходит
источник
Попробуйте использовать
===
. При использовании==
в Javascript он попытается преобразовать переменные, что приведет к подобным проблемам. Консоль преобразуетсяArray(4)
в строковое представление (т.е.Array(4).toString
), которое есть",,,"
. Причина наличия запятых в том, что.toString()
функция добавляет их к отдельным элементам в массиве.См. Фрагмент ниже:
источник
Это связано с тем, что
Array(4)
инициализирует массив из 4 пустых значений,==
неявно преобразует, поэтому:Все похожи.
==
выполняет неявное преобразование типов перед сравнением значений, что может привести к непредсказуемым результатам. Используйте===
для проверки типа и значения.источник
Сравнение массива со строкой приводит к тому, что массив превращается в строку перед выполнением сравнения. Приведение пустого 4-элементного массива к строке дает именно эту строку.
источник
Сначала я подумал, что это что-то с "прототипом" ... но после небольшого расследования я пришел к печальному выводу ...
По-видимому, это внутренняя и более непонятная js-штука с небольшой логикой ...
Просто попробуй
и никакого принуждения к типам тоже ...
и вы получите ЛОЖЬ
вы это знаете
null==null
,null===null
и дажеundefined==undefined
иundefined===undefined
возвращает ИСТИНА ... так что ... это немного непонятно ...Array(4)==[,,,]
также должно быть правдойисточник