Почему переключение аргументов == в консоли меняет вывод?

Если я открою консоль браузера (проверено в Chrome/Firefox) и введите:

null == {}

Я получил:

ложный

Однако, если я коммутирую оба аргумента == оператор и вместо этого введите:

{} == null

Я получил:

Uncaught SyntaxError: Неожиданный токен ==

Образ:

  • Почему это происходит?
  • Почему это происходит только в консоли, а не тогда, когда браузер выполняет скрипт на HTML-странице?

РЕДАКТИРОВАТЬ:

В то время как вопрос 35812626 обращается к этому и объясняет причину как JS, анализирующий {} в качестве блока кода используется оператор тройного равенства (строгое сравнение) ===не двойные равны ==, Как указывает пользователь ниже, за блоком кода определенно может следовать == не вызывая синтаксическую ошибку:

{} == {} // false

Почему это работает, а мой пример нет?

2 ответа

Я думаю, потому что переводчик интерпретирует {} как блок кода, а не как объект.

так твой код {} == null оказывается начало и конец блока, а затем оператор начинается с == что определенно является синтаксической ошибкой.

но если вы можете попробовать ({} == null) Я думаю, что это должно работать нормально.

и как указано @dhaker {}=={} возврате false не ошибка.

и я обнаружил, что есть несколько сценариев, возвращающих результат и мало получающих ошибку.

следующие ошибки:

{}==null //Uncaught SyntaxError: Unexpected token ==
{}==1 //Uncaught SyntaxError: Unexpected token ==
{}==0 //Uncaught SyntaxError: Unexpected token ==
{}==true //Uncaught SyntaxError: Unexpected token ==
{}==false //Uncaught SyntaxError: Unexpected token ==
{}==true //Uncaught SyntaxError: Unexpected token ==
{}=='' //Uncaught SyntaxError: Unexpected token ==
{}=='hi' //Uncaught SyntaxError: Unexpected token ==
{}==(new Object) //Uncaught SyntaxError: Unexpected token ==

следующие возвращают результат без ошибки:

{}=={} //false
{}==function(){} //false

так что я думаю, это как-то связано с тем, как Javascript компилируется или интерпретируется браузерами.

для более подробного ответа, пожалуйста, проверьте следующий ответ.

Странное поведение сравнения объектных литералов

Я тестировал на сафари это не так.

NULL является примитивной переменной, и NULL может быть слева.

Но {} для javaScript это пространство имен. Используется для создания глобального объекта.

Ответ прост: нет смысла использовать {} с операторами равенства.

Обновлено:

Это так ясно:

Все, что в javascript, что идет с {не имеет назначения.

Давай попробуем сказать:

{x: null}

а что вы получите?

Ничего такого. Можете ли вы снова получить доступ к этому объекту? Нет.

console.log( null == {} );

console.log( {} == null );

console.log( null === {} );

console.log( {} === null );

// Also 

var object1 = {'key': 'value'}
var object2 = {'key': 'value'};
console.log(object1 === object2); //false

console.log({} === {}); //false

console.log({} == {}); //false

({}) == null; // little hack ;) false

// {} == null; syntax error !

 (typeof {}) == (typeof {});
 
 var A = {};
 var B = {};
 (typeof A) === (typeof B);

// console.log( (A instanceof "object" ) );
console.log( typeof A );

// This is only correct 
console.log(typeof A === typeof B)
console.log(typeof {} === typeof {})

Я пробую эту глупую вещь:

{ 'Тест':0}.hasOwnProperty('тест')

и я получаю такой же персонал ( syntaxError) . Не используйте это так!

Другие вопросы по тегам