'你好' ==(在JavaScript中除了' hello'之外会返回什么?)

时间:2014-05-10 07:56:28

标签: javascript string-comparison ecmascript-5 triple-equals

我理解JavaScript中的==与类型强制进行比较。我知道以下陈述是true

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

但是,我无法与左侧的'hello'进行比较:

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

有什么'hello'可以比较true而不是'hello'吗?

3 个答案:

答案 0 :(得分:4)

有这一个:

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

这将被评估为true,因为该字符串不为空或null

因为你想要比较:

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

答案 1 :(得分:3)

这算了吗?

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

答案 2 :(得分:2)

这是一个:

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"的{​​{1}}方法的东西。

可以通过加入数组,直接返回字符串,处理组合形成该字符串的一堆字符代码等,以任意多的创造性方式完成...但是,最后,{{ 1}}必须返回.toString()才能满足"Hello"测试。


如果你不允许你所比较的东西以任何方式在其中包含==或者能够根据需要产生该字符串,那么NO没有其他任何东西可以满足{{1除了在被要求强制转换为字符串时产生字符串"Hello"的东西。


这是一个外行人对Javascript类型强制规则的描述:http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html


简而言之,以下是涉及字符串时的强制规则:

  1. 如果两种类型都是字符串,则只有当两个字符串包含完全相同的字符时,才会进行比较{。{1>}。

  2. 如果一个是字符串而另一个是数字,则尝试将字符串转换为数字并将其与另一个数字进行比较。由于=="Hello",因此NaN不能用于true到另一个数字。

  3. 如果一个是字符串而另一个是对象,则调用内部方法Number("Hello")(如果已定义)或NaN(如果未定义)并将其结果与字符串进行比较。

  4. 如果一个是字符串而另一个是布尔值,则将两者都转换为数字并进行比较。由于==valueOf,因此在转换为数字时,它永远不会匹配布尔值toStringNumber("Hello")。例如:NaN