这是一个:
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"。