这是一个:
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
简而言之,以下是涉及字符串时的强制规则:
如果两种类型都是字符串,则true
仅当两个字符串包含完全相同的字符时才进行比较。
如果一个是字符串,另一个是数字,则尝试将字符串转换为数字并将其与另一个数字进行比较。由于Number("Hello")
is NaN
,这将永远不会适用于一个数字,因为 NaN 不能是==
另一个数字。
如果一个是字符串而另一个是对象,则调用内部方法valueOf
(如果已定义或toString
未定义)并将其结果与您的字符串进行比较。
如果一个是字符串而另一个是布尔值,则将两者都转换为数字并进行比较。因为Number("Hello")
is NaN
,它永远不会匹配一个布尔值,该布尔值要么被转换为数字,0
要么被1
转换为数字。例如:true == "1"
。