这个问题是考察相等操作符在比较的过程中如何进行数据类型转换的,基本规则如下:
1.、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值—— false 转换为0,而 true 转换为1;
2、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
3、如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
这两个操作符在进行比较时则要遵循下列规则
1.、null 和 undefined 是相等的。
2、要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
3、如果有一个操作数是 NaN ,则相等操作符返回 false ,而不相等操作符返回 true 。重要提示:即使两个操作数都是 NaN ,相等操作符也返回 false ;因为按照规则, NaN 不等于 NaN 。
4、如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true ;否则,返回 false 。
那么根据规则我们可以推断出"a"==true
是如何进行比较的:
1、字符串'a'
转换为数值是NaN(转换过程中使用Number构造函数出入'a'
,得到的NaN)
2、true
转换为数值1
3、NaN与任何数都不相等,所有会返回false
valueOf()
valueOf() 方法返回指定对象的原始值。
JavaScript调用valueOf
方法将对象转换为原始值。你很少需要自己调用valueOf
方法;当遇到要预期的原始值的对象时,JavaScript会自动调用它。
默认情况下,valueOf
方法由Object后面的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,则valueOf
将返回对象本身。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()
方法的返回值和返回值类型均可能不同。
不同类型对象的valueOf()
方法的返回值
对象 | 返 回值 |
Array | 返回数组对象本身。 |
Boolean | 布尔值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。 |
String | 字符串值。 |
Math 和 Error 对象没有 valueOf 方法。 |
你可以在自己的代码中使用valueOf
将内置对象转换为原始值。创建自定义对象时,可以覆盖Object.prototype.valueOf()
来调用自定义方法,而不是默认Object方法。