JavaScript是做弱类型语言,在使用算术运算符时,运算符两边的数据类型可以是任意的,之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换。
例如:数值和布尔类型的值:
只有少数情况下,错误类型才会导致出错,比如调用非函数,或者读取null或者undefined的属性时:
多数情况下,JavaScript都不会出错的,而是自动的进行相应的类型转换。比如-, *, /,和%等算术运算符都会把操作数转换成数字的,但是“+”号很特殊,有些情况下,它是算术加号,有些情况下,是字符串连接符号,具体的要看它的操作数。
null会转换成0,undefined会转换成NaN:
再分析对象的隐式转换:
XXX.toString()
1.1XXX是对象:
1.2XXX不是对象:
如果xxx不是对象,toString() 返回xxx应有的文本值
2.可以自定义一个方法覆盖默认的toString(),这个方法不能含有参数,方法里必须return一个值。
3.
obj.valueOf()
JavaScript 调用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值) 默认情况下, valueOf() 会被每个对象Object继承。每一个内置对象都会覆盖这个方法为了返回一个合理的值,如果对象没有原始值,valueOf() 就会返回对象自身
1.
但是,多数情况下,这都不是我们想要的,一般的,尽可能使valueOf和toString表示的值相同(尽管类型可以不同)
//这个对象是一个函数
function fn() {
return 20;
}
console.log(fn + 10);
console.log(fn + ‘hello’);
fn.toString = function() {
return 10;
}
console.log(fn + 10);
console.log(fn + ‘hello’);
fn.valueOf = function() {
return 5;
}
console.log(fn + 10);
console.log(fn + ‘hello’);
// 输出结果分别是多少?
function fn() {
return 20;
}10
function fn() {
return 20;
}hello
20
10hello
15
5hello
从上面的结果我们可以看出:当函数fn用+连接一个字符串或者是数字的时候,如果我们没有重新定义valueOf和toString,其隐式转换会调用默认的toString()方法,将函数本身内容作为字符串返回; 如果我们自己重新定义toString/valueOf方法,那么其转换会按照我们的定义来,其中valueOf比toString优先级更高
参考的博客:https://www.cnblogs.com/yugege/p/5277883.html
https://blog.csdn.net/x_jagger/article/details/73430959