Если вы откроете свою консоль JS и введите [] + {} === {} + []
, она сообщит вам об этом.
Я не понимаю, почему это так. Я попытался посмотреть, как он разбирается.
Для [] + {}
+
здесь используется оператор сложения, так как операнды являются как литералами. LHS не дает число через .valueOf()
, поэтому он выполняет конкатенацию строк с помощью .toString()
на обоих операндах, предоставляя нам ""
+ "[object Object]"
Для {} + []
{}
является пустым кодовым блоком и "игнорируется", оператор +
здесь анализируется как оператор унарного плюса, он преобразует его операнд в число. Пустые массивы, преобразованные в число, становятся 0
Итак, это выглядит как "[object Object]" === 0
, который, безусловно, должен быть ложным?.
Оператор идентичности проверяет, равны ли два операнда без преобразования типов. Я не могу понять, как это всегда будет правдой. Какую часть истории мне не хватает?
Изменить:
Я вижу, если вы наберете ({} + [])
, он проанализирует его как пустой объект, делая RHS равным "[object Object]". Я посмотрел это, и ( )
- оператор группировки. Так что, возможно, это имеет какое-то отношение к этому?
Это не дубликат Какое объяснение этих странных действий JavaScript, упомянутых в разговоре "Wat" для CodeMash 2012?. Ответьте на пункты 1 === 2 НЕ должно быть правдой.