2016-05-10 1 views
2
function foo(){ 
console.log(function(){return 1} <= function(){return 1}); 
} 
foo(); 

Приведенный выше код печатает "true". Он печатает true для обоих < = и> =, для всех остальных операторов это «ложь».Объясните поведение операторов> = и <= в следующем случае:

Какой трюк происходит здесь?

+0

@Sterling Я не думаю, что оператор функции toString() вызывается, потому что следующее возвращается false: 'function() {return 1} == function() {return 1}' – harsh

+0

@Dmitri Итак, у javascript разные политика преобразования для операндов в случае> =, <- и другая политика для других? – harsh

+0

Да, оценка для '==' и '===' отличается от '<=', '> =', '>', '<', особенно при сравнении экземпляров. –

ответ

3

Потому что он не сравнивает возвращенный 1, он сравнивает functions. Когда вы запускаете оператор по функции, он неявно вызывает toString.

Что касается ==, Дмитрий объяснил это достаточно хорошо, что toString не вызывается, но он выполняет сравнение объектов, которое будет ложным, потому что два разных объекта никогда не совпадают.

ECMA spec О реляционных операторах, в которых объясняется, как он работает с операциями сравнения. С объектами используется instanceOf.

+1

Это кажется правдоподобным, но кажется странным для JS. Можете ли вы включить разделы спецификации, которые описывают это? – ssube

+1

@ssube У Дмитрия есть хорошая ссылка в его ответе –

-1

Потому что он всегда сравнивает 1 < = 1, и это правда. Если вы сравниваете 1> = 1, то всегда это верно. Но если вы сравните 1> 1, это будет ложным.

+0

Извините, @ ваш вопрос не ясен ... но я прочитал комментарий ниже – Patty

+0

Это по-прежнему не так, проблема не имеет ничего общего с тем, что функции возвращаются (само по себе), поскольку функции не выполняются. Сравнение выполняется по функциям –

+1

@Patty Было бы интересно спросить вас в этом случае: '(function() {return 1})() <= (function() {return 1})()' –

2

function(){return 1} <= function(){return 1} преобразует функции в примитив. Функция, преобразованная в примитив, оценивает его код в строке (вызов toString()).
Затем "function(){return 1}" <= "function(){return 1}" выполняет меньшее или равное сравнение по строкам, которое равно true.

В function(){return 1} == function(){return 1} JavaScript сравнивает объекты функции. Но поскольку это разные экземпляры, у вас будет false.

Подробнее об операторе равенства можно узнать в this article.

+0

Arg , я просто нашел это тоже. Перейдем к ссылке на ваш ответ. +1 –

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

  • Нет связанных вопросов^_^