Я недавно обнаружил это 2 == [2]
в JavaScript. Как выясняется, у этой причуды есть несколько интересных последствий:
var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true
Точно так же работает следующее:
var a = { "abc" : 1 };
a[["abc"]] === a["abc"]; // this is also true
Еще более странно, это работает также:
[[[[[[[2]]]]]]] == 2; // this is true too! WTF?
Такое поведение выглядит одинаково во всех браузерах.
Есть идеи, почему это языковая функция?
Вот более безумные последствия этой «особенности»:
[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!
var a = [0];
a == a // true
a == !a // also true, WTF?
Эти примеры были найдены jimbojw http://jimbojw.com известностью, а также walkeyerobot .
+"2"
также номер 2.В правой части уравнения мы имеем a [2], который возвращает тип числа со значением 2. Слева мы сначала создаем новый массив с единственным объектом 2. Затем мы вызываем [( массив находится здесь)]. Я не уверен, оценивает ли это строку или число. 2 или «2». Давайте сначала возьмем строковый регистр. Я считаю, что ["2"] создаст новую переменную и вернет ноль. null! == 2. Итак, давайте предположим, что он фактически неявно преобразуется в число. a [2] вернет 2. 2 и 2 совпадут по типу (так === работает) и значению. Я думаю, что это неявное преобразование массива в число, потому что [значение] ожидает строку или число. Похоже, число имеет более высокий приоритет.
Кстати, мне интересно, кто определяет этот приоритет? Это потому, что [2] имеет число в качестве первого элемента, поэтому он преобразуется в число? Или же при передаче массива в [массив] он пытается сначала превратить массив в число, а затем в строку. Кто знает?
В этом примере вы создаете объект с именем a и членом с именем abc. Правая часть уравнения довольно проста; это эквивалентно a.abc. Это возвращает 1. Левая сторона сначала создает буквенный массив ["abc"]. Затем вы ищете переменную в объекте, передавая только что созданный массив. Поскольку это ожидает строку, он преобразует массив в строку. Теперь это оценивается как ["abc"], что равно 1. 1 и 1 имеют одинаковый тип (поэтому === работает) и равное значение.
Это просто неявное преобразование. === не будет работать в этой ситуации, потому что есть несоответствие типов.
источник
==
применяетсяToPrimitive()
к массиву, который, в свою очередь, вызывает егоtoString()
метод, поэтому в действительности вы сравниваете число2
со строкой"2"
; сравнение строки и числа выполняется путем преобразования строкиВ этом
==
случае, именно поэтому Даг Крокфорд рекомендует всегда использовать===
. Это не делает никакого неявного преобразования типов.Для примеров с
===
неявное преобразование типов выполняется до вызова оператора равенства.источник
Это интересно, это не так, что [0] является и истинным, и ложным, на самом деле
Это забавный способ обработки оператора if () в javascript.
источник
==
работы; если вы используете фактическое явное приведение (то естьBoolean([0])
или!![0]
), вы обнаружите, что оно[0]
будет оцениватьсяtrue
в булевых контекстах так, как должно: в JS рассматривается любой объектtrue
Массив из одного элемента может рассматриваться как сам элемент.
Это из-за утки. Так как "2" == 2 == [2] и возможно больше.
источник
==
оператором перед сравнением.Чтобы добавить немного деталей к другим ответам ... при сравнении
Array
с aNumber
, Javascript преобразуетArray
сparseFloat(array)
. Вы можете попробовать это самостоятельно в консоли (например, Firebug или Web Inspector), чтобы увидеть, во чтоArray
преобразуются различные значения.Для
Array
sparseFloat
выполняет операциюArray
с первым членом и отбрасывает остальные.Редактировать: Согласно сведениям Кристофа, возможно, он использует более длинную форму внутри, но результаты всегда идентичны
parseFloat
, так что вы всегда можете использоватьparseFloat(array)
как сокращенную форму, чтобы точно знать, как она будет преобразована.источник
В каждом случае вы сравниваете 2 объекта. Не используйте ==, если вы думаете о сравнении, вы имеете в виду ===, а не ==. == часто может дать безумные эффекты. Ищите хорошие части на языке :)
источник
Пояснение к разделу РЕДАКТИРОВАТЬ вопроса:
1-й пример
Первое приведение типа [0] к примитивному значению в соответствии с ответом Кристофа выше, мы имеем «0» (
[0].valueOf().toString()
)Теперь введите тип Boolean (false) для Number и затем String ("0") для Number
Что касается
if
утверждения, если в самом условии if нет явного сравнения, условие оценивается для истинных значений.Есть только 6 ложных значений : false, null, undefined, 0, NaN и пустая строка "". И все, что не является ложной ценностью, является истинной ценностью.
Поскольку [0] не является ложным значением, это истинное значение,
if
оператор оценивается как истинный и выполняет оператор.2-й пример
Снова введите приведение значений к примитиву,
источник