2016-07-29 3 views
12

я liketo знаю, почему выражение, приведенное в названии[] ==! [] Имеет значение истинного

[] == ![]

оценивается истина.

Вы не можете сравнивать массивы как строки. Я понимаю. Если

[] == []

будет оценивать ложь, так как ссылки отличаются. Хотя, если у нас есть следующее утверждение.

var arr = []; 
arr == arr // this evaluates to true simply because references are the same. 

Для того, чтобы A == B возвращал true, либо A, либо B должны быть ложными или истинными. A ==! B, чтобы вернуть true A, может быть истинным, а B может быть ложным или наоборот, но в этом случае A и B являются одинаковыми значениями, поэтому я не получаю его.

+6

В этом вопросе нет ничего плохого. Он не заслуживает ниспроверки. Если вы не согласны, вы должны оставить комментарий с объяснением. – Brad

+0

Может, Тим снова сбросил ключи? – Li357

+0

У меня нет идеи, почему кто-нибудь мог бы это сделать. Это не очень очевидно. +1 к заявлению Брэда – Tek

ответ

4

![] оценивает по false, потому что ссылка правдивая. [] может быть преобразован в число (0 в этом случае), которое является ложным. Поэтому: условие проходит как равное. Если вы сделали ===, это было бы неверно.

+2

'[]' не является ложным. '[]' является объектом. Попробуйте в своем браузере: 'if ([]) console.log ('not falsey)' –

+1

Этот ответ неверный. – Brad

+2

Я уверен, что [он преобразуется в число, а не в строку] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3). – Quentin

-1

Array - это специальный объект в javascript, который можно сравнить с пользовательскими объектами. Даже это тип - объекты, [] instanceof Array == true;

поэтому использование var x = []; совсем не похож на вызов Array contructor. И сравнение двух экземпляров объектов в javascript вернет false, потому что они не используют один и тот же адрес памяти. Это похоже на сравнение указателей.

+0

Вопрос не в том, чтобы сравнивать два массива. Речь идет о сравнении массива с булевым. – Quentin

+0

uups .. моя ошибка – Wolfgang

6

В основном Javascript пытается преобразовать обе стороны в число, если оба типа не совпадают. И если его объект, он пытается преобразовать в элементарное значение

Таким образом, в этом случае шаг за шагом будет

=> []==![] 

=> []==false // Type conversion by the statement itself 

=> []==0 // To number of right operand 

=> ""==0 // To Primitive call for Array which will in this case convert to empty string 

=> 0==0 // To number call of "" which is 0 

=> true 

можно проверить для ECMAScript объяснения здесь в описании компилятора http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

Вот более подробное объяснение от codementor.io

Прежде чем понимать, что происходит, нам нужно понять концепцию правды и фальсификаций в JavaScript и как! (логический NOT). Такие значения, как false, null, undefined, NaN, 0, '' and "" считаются фальшивыми. Другие ценности, такие как *true, {}, [], "foo" * и т. Д. Считаются правдивыми. The! оператор, с другой стороны, определяется только для булевых значений. Любые другие типы данных будут автоматически принудительно введены в соответствующее булевское значение при работе с! оператор. Здесь ![] оценивает значение false, и сравнение фактически становится '[] == false' который оценивает 'true'. Разве это не должно быть ложным, так как пустые массивы правдивы? Правильно, но оператор с двойным равным вычисляет выражения для определенных правил. Мы пытаемся сравнить объект с логическим значением, и JavaScript будет неявно преобразовывать операнды в тип Number.Number([]) is 0 и Number(false) is also 0, которая вычисляется в true since zero is equal to zero

1

Всякий раз, когда 2 значения сравниваются с помощью ==, JavaScript выполняет абстрактный алгоритм сравнения равенства.

enter image description here

Здесь х [], и у есть! []. Кроме того,

typeof([]) // "object" 
typeof(![]) // "boolean" 

Так как у булевой и х представляет собой объект, условие 7 является первым провести:

Если Тип (у) Логический, возвращает результат сравнения х == ToNumber (y).

Какова стоимость ToNumber (y)?

Number(![]) // 0 

потому что [] является правдивым значением, отрицание делает его ложным. Количество (ложь) является 0

Теперь у нас есть сравнение: [] == 0.

С TypeOf (0) является "число", состояние 8 теперь держит:

Если Тип (x) является Object и Type (y) либо строкой, либо номером, возвращает результат сравнения ToPrimitive (x) == y.

ToPrimitve (x) как x.toString().

[].toString() // ”” - the empty string 

Почти сделано сейчас мы сталкиваемся со сравнением: «» == 0

Теперь условие 5 выполнено:

Если Тип (х) Строка и тип (у) Number, возвращает результат сравнения ToNumber (x) == y.

ToNumber(“”) // 0 

Наконец оба операнда имеют одинаковый тип и состояние 1 имеет место. Я думаю, что вы можете взять, если отсюда :)

о Abstract Equality Comparison о технических характеристиках!

Смежные вопросы