- 执行
Number(obj)
时发生的情况:
- 当执行
Number(obj)
时,JavaScript会尝试将对象obj
转换为数字类型。它首先会调用对象的valueOf
方法。
- 因为
obj
定义了valueOf
方法且返回'456'
,这是一个字符串。然后JavaScript会进一步将这个字符串'456'
转换为数字,最终Number(obj)
的结果为456
(数字类型)。
- JavaScript内部的类型转换机制:
- 显式类型转换:像
Number()
、String()
、Boolean()
等函数进行的类型转换。
Number()
转换:
- 如果是数字,直接返回该数字。
- 如果是字符串,若字符串为纯数字字符,转换为对应的数字;若字符串为空,转换为
0
;若字符串包含非数字字符,转换为NaN
。
- 如果是布尔值,
true
转换为1
,false
转换为0
。
- 如果是
null
,转换为0
。
- 如果是
undefined
,转换为NaN
。
- 如果是对象,先调用
valueOf
方法,如果返回原始值,则按照原始值的规则进行转换;如果valueOf
返回的还是对象,则调用toString
方法,如果toString
返回原始值,则按照原始值规则转换,否则返回NaN
。
String()
转换:
- 如果是字符串,直接返回该字符串。
- 如果是数字,转换为对应的字符串形式。
- 如果是布尔值,
true
转换为'true'
,false
转换为'false'
。
- 如果是
null
,转换为'null'
。
- 如果是
undefined
,转换为'undefined'
。
- 如果是对象,先调用
toString
方法,如果返回原始值,则按照原始值的规则进行转换;如果toString
返回的还是对象,则调用valueOf
方法,如果valueOf
返回原始值,则按照原始值规则转换,否则返回'[object Object]'
。
Boolean()
转换:
- 除了
false
、0
、''
、null
、undefined
、NaN
转换为false
,其他值都转换为true
。
- 隐式类型转换:在一些操作符(如
+
、==
等)使用过程中自动进行的类型转换。例如'1' + 2
,'1'
会被隐式转换为数字1
,然后执行加法操作,结果为3
。'1' == 1
,两边的值会根据一定规则进行类型转换后再比较,这里'1'
会转换为数字1
,然后比较相等,结果为true
。
- 通过自定义
valueOf
或toString
方法来控制显式类型转换行为:
- 自定义
valueOf
:
- 如上述
obj
对象,通过自定义valueOf
方法返回'456'
,从而影响了Number(obj)
的转换结果。如果希望Number(obj)
返回其他值,可以修改valueOf
的返回值。例如:
var obj = {
valueOf: function() {
return 789;
}
};
console.log(Number(obj));// 输出789
- 自定义
toString
:
- 当
valueOf
返回对象或者未定义valueOf
时,Number()
会调用toString
方法。例如:
var obj = {
toString: function() {
return '123';
}
};
console.log(Number(obj));// 输出123
- 可以同时定义
valueOf
和toString
方法,JavaScript会优先调用valueOf
,如果valueOf
返回对象,再调用toString
。例如:
var obj = {
valueOf: function() {
return {a: 1};// 返回对象
},
toString: function() {
return '987';
}
};
console.log(Number(obj));// 输出987