Подтвердить что ты не робот

Почему "[] + {} === {} + []" оценивается как "истина"?

Если вы откроете свою консоль JS и введите [] + {} === {} + [], она сообщит вам об этом.

Я не понимаю, почему это так. Я попытался посмотреть, как он разбирается.

Для [] + {} + здесь используется оператор сложения, так как операнды являются как литералами. LHS не дает число через .valueOf(), поэтому он выполняет конкатенацию строк с помощью .toString() на обоих операндах, предоставляя нам "" + "[object Object]"

Для {} + [] {} является пустым кодовым блоком и "игнорируется", оператор + здесь анализируется как оператор унарного плюса, он преобразует его операнд в число. Пустые массивы, преобразованные в число, становятся 0

Итак, это выглядит как "[object Object]" === 0, который, безусловно, должен быть ложным?.

Оператор идентичности проверяет, равны ли два операнда без преобразования типов. Я не могу понять, как это всегда будет правдой. Какую часть истории мне не хватает?

Изменить:

Я вижу, если вы наберете ({} + []), он проанализирует его как пустой объект, делая RHS равным "[object Object]". Я посмотрел это, и ( ) - оператор группировки. Так что, возможно, это имеет какое-то отношение к этому?

Это не дубликат Какое объяснение этих странных действий JavaScript, упомянутых в разговоре "Wat" для CodeMash 2012?. Ответьте на пункты 1 === 2 НЕ должно быть правдой.

4b9b3361

Ответ 1

Вторая точка в этом великолепном ответе объясняет, что происходит, когда вы "объединяете" массив и объект.

var result = [] + {};

console.log(result);
console.log(typeof result);

Ответ 2

    var array = ['test1', 'test2', 'test3']
    var emptyObject = {}

    console.log(typeof(array+emptyObject));
    console.log(array+emptyObject);
    console.log(emptyObject+array);
    console.log(array+emptyObject === emptyObject+array);

    var array = [];
    var emptyObject = {}

    console.log(typeof(array+emptyObject));
    console.log(array+emptyObject);
    console.log(emptyObject+array);
    console.log(array+emptyObject === emptyObject+array);

    var array = ['firstArrayElement', 'secondArrayElement'];
    var object = {a:1, b:2}
    
    console.log(typeof(array+object));
    console.log(array+object);
    console.log(object+array);
    console.log(array+object === object+array);

    console.log(['a','b']+['c','d']);