ответ

2

Если один из операндов < или > это число, другие будут приведены к ряду.

alert("3" > 3); // false 
alert("3.5" > 3); // true 

EDIT и дальнейшее объяснение:

Если это не представляется возможным, чтобы бросить другой параметр в число, оно разливается в специальное значение, называемое NaN - аббревиатура означает "N ot aN umber ". Значение NaN имеет особое свойство, которое абсолютно несравнимо - все операторы отношения, такие как <, > и =, возвращают false, если один из аргументов NaN.

alert("" > 3);  // false 
alert("3.5?" > 3); // false 
alert({} > 3);  // false 

Кроме того, обратите внимание, что во второй строке, если бы мы использовали

alert(parseInt("3.5?") > 3); 

это предупредит true, потому что parseInt читает "3.5" из строки "3.5?", затем прекращает чтение на "?" и, таким образом, оценивается в 3.5 , Однако

alert("3.5?" > 3); 

возвращается false, потому что бросок от string к number не столь великодушным parseInt. Поскольку "3.5" действительно не является номером, он отливается NaN.

+0

И если другой может быть преобразован в число i.e. '((" a "> 5) || (" a "<5))' false. –

+0

@AlexeiLevenkov В этом случае интерпретатор пытается использовать '' a ''для номера. Поскольку этого не может быть сделано, оно передается в «NaN» - «Not A Number», потому что «a» не является числом. И любое сравнение с «NaN» приводит к ложному. – Imp

+0

+1. Как теперь это полное объяснение. Рассмотрите возможность объединения вашего комментария в ответ. –

0

Строка будет преобразована в число с использованием произвольных правил. Как правило, вы увидите следующие правила:

  • Если строка начинается с 0x, обрабатывайте ее как шестнадцатеричное число.
  • Если строка начинается с 0, обработайте ее как восьмеричное число. (не во всех браузерах)
  • В противном случае обрабатывайте его как десятичное.

Это означает, в частности, что вход как «09» может вызвать путаницу в браузер и может быть истолковано как 9 или 0 (потому что девять не является допустимой восьмеричной цифра).

В общем, при сравнении строки с номером вы всегда должны вручную вызывать parseInt с аргументом radix 10. Таким образом, сюрпризов нет.

3

Ну, как EMCAScript реализации, Javascript будет следовать Аннотация Relational алгоритм сравнения, как это определено в разделе ECMA-262 11.8.5.

Во-первых, Javascript будет применяться к обоим операнды внутренний оператор ToPrimitive, который должен возвращать элементарное значение (неопределенными, булево, строку, нуль или номер) на основе аргументов, переданных Это. Если примитивное значение передается в ToPrimitive, возвращаемое значение - это значение аргумента, переданное оператору, если он является внутренним методом, который вызывается всеми объектами в Javascript, это [[DefaultValue]]. Этот метод отвечает за возврат примитивного типа, который представляет объект. В зависимости от типа кода этот метод может вызывать либо методы toString, либо valueOf объекта.

Например:

var x = {valueOf: function() { return 3; }}; 

console.log(x > 2); // true 
console.log(x < 1); // false 
console.log(x == 3); // true 


Каким Javascript решить, какой метод он должен вызвать? Ну, оператор ToPrimitive может получить необязательный параметр, он используется, чтобы отдать предпочтение определенному типу, например. Number или String. Если передано Number, сначала будет вызываться метод valueOf, если этот метод не существует в объекте или не возвращает примитивный тип, тогда вызывается toString. Если передается String, происходит обратное: toString вызывается первым, если он не существует в объекте и не возвращает примитивное значение, вызывается valueOf.
Вот почему в приведенном выше фрагменте я могу свободно сравнивать объект и примитивный тип. Очень важно понимать при сравнении.

После этого, если оба операнда Strings Javascript будет следовать некоторому интересному и конкретному алгоритму, связанному с Unicode Standard, проверяя значения кодовых точек. В противном случае Javascript будет отличать оба операнда до Number, а их математическое значение сравнивается. Заметим, что если один из них равен NaN, сравнение составляет undefined, который будет false в сообщении if.

Некоторых примеры:

// true => ToNumber(true) > ToNumber(false) 
console.log(true > false); 
// true => ToNumber("5") < ToNumber(10) 
console.log("5" < 10); 
// false ToNumber(ToPrimitive(obj, Number)) == ToNumber(10) 
console.log(({valueOf: function() { return 10}}) > 10); 
// false, it's not related to the length of the strings, 
// the code point value of each char is used to evaluate the comparison 
console.log('Hello worlds' > 'hello'); 

Надеются, что это помогает прояснить кой-что.

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