'hello' == (что-нибудь, что вернет true, кроме 'hello') в JavaScript?

Я это понимаю == в JavaScript есть сравнение с приведением типов. И я знаю, что следующие заявления true:

'' == false;
' ' == false;
'0' == false;
'\n' == false;

Тем не менее, я не могу получить сравнение с "привет" на левой стороне, чтобы быть правдой:

'hello' == true; // no this is false
'hello' == false; // no this is false
'hello' == 1; // no this is false
'hello' == 0; // no this is false

Есть ли что-нибудь "привет", можно сравнить с тем, что приводит к true кроме "привет"?

3 ответа

Вот этот:

if('hello') {
  alert('true') 
}

Это будет оценено как true потому что строка не пуста или null,

Так как вы хотите сравнить:

'hello' == String.fromCharCode.apply(String, [104, 101, 108, 108, 111])

Это считается?

["hello"] == "hello"  // true

Вот один из них:

var x = ['H', 'e', 'l', 'l', 'o'];
x.toString = function() {
    return this.join("");
}

alert(x == "Hello");   // true

http://jsfiddle.net/jfriend00/KSgwb/

Или другой:

var x = {
    toString: function() {return "Hello";}
}

alert(x == "Hello");   // true

http://jsfiddle.net/jfriend00/hKx9x/

Если вы изучаете правила принуждения для ==, вы найдете, что единственное, что удовлетворит == с "Hello" это то, что уже является строкой, которая "Hello" или что-то, что имеет .toString() метод, который возвращает "Hello",

Это может быть сделано любым творческим путем, если вы захотите, присоединяясь к массиву, возвращая строку напрямую, обрабатывая набор кодов символов, которые объединяются в эту строку и т. Д. Но, в конце концов, .toString() должен вернуться "Hello" чтобы удовлетворить == тестовое задание.


Если вы не позволяете тому, с чем сравниваете, иметь "Hello" в ней каким-либо образом или быть в состоянии произвести эту строку по требованию, тогда НЕТ, нет ничего, что удовлетворит == кроме того, что производит строку "Hello" когда попросили привести к строке.


Вот непрофессиональное описание правил приведения типов для Javascript: http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html


Вкратце, вот правила принуждения, когда используется строка:

  1. Если оба типа являются строкой, то сравнение true только если две строки содержат одинаковые символы.

  2. Если одна строка, а другая - число, попробуйте преобразовать строку в число и сравнить ее с другим числом. поскольку Number("Hello") является NaN, это никогда не будет работать для числа, так как NaN не может быть == на другой номер.

  3. Если один является строкой, а другой - объектом, вызовите внутренний метод valueOf если это определено или toString если он не определен, сравните результат с вашей строкой.

  4. Если одна строка, а другая логическое значение, преобразуйте оба в число и сравните их. поскольку Number("Hello") является NaN, он никогда не будет соответствовать логическому, который либо будет 0 или же 1 при преобразовании в число. Например: true == "1",

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