我理解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'吗?
答案 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>}。
如果一个是字符串而另一个是数字,则尝试将字符串转换为数字并将其与另一个数字进行比较。由于==
为"Hello"
,因此NaN不能用于true
到另一个数字。
如果一个是字符串而另一个是对象,则调用内部方法Number("Hello")
(如果已定义)或NaN
(如果未定义)并将其结果与字符串进行比较。
如果一个是字符串而另一个是布尔值,则将两者都转换为数字并进行比较。由于==
为valueOf
,因此在转换为数字时,它永远不会匹配布尔值toString
或Number("Hello")
。例如:NaN
。