参考文章:https://www.cnblogs.com/ihboy/p/6700059.html
首先,js的typeof返回的是字符串
一共有 “number”, “string”, “boolean”, “object”, “undefined” “function”
其实function也是object,为什么这么返回我也不知道
在进行( + - * / % )运算时
基本类型的转换形式
先说加,这个与其他的不太一样。无论什么类型,遇到string都会转换成字符串。比如
true + '1' => 'true1'
undefined + '1' => 'undefined1'
null + '1' => 'null1'
其余时候是转换成数字。
null, false => 0
undefined => NaN
true => 1
其他运算符,那就没办法做字符串拼接操作了,统一转化成"number"类型(即使是string类型也不例外)
"a1" => NaN
"1" => 1
大概很好理解吧,如果是纯数字就能转,不是纯数字,就会转成NaN
对象
分类讨论
如果是+,会调用toString()方法,
如果是其他的,则会调用valueOf,基本上可以说,如果你没有自己去覆盖valueOf方法,那答案就必定是NaN。
JavaScript调用该valueOf方法将对象转换为原始值。您很少需要自己调用该valueOf方法;
当遇到期望原始值的对象时,JavaScript会自动调用它。默认情况下,该valueOf方法由后代的每个对象继承Object。每个内置核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,则valueOf返回对象本身。
这是mdn关于valueOf的描述
我的理解是,首先,js一切皆为对象。包括string,number,boolean。
上面这几种,他们是有原始值的,所以valueOf()会直接返回本身。
Object类型,一般是不会自己设valueOf()的,所以会返回对象本身
如果想要对象参与运算,最好先给他定义valueOf和toString方法,否则肯定是要出现你不想要的答案
转化成Number类型会先调用valueOf(), 转化成String类型会先调用toString(),
function MyNumberType(n) {
this.number = n;
}
MyNumberType.prototype.valueOf = function() {
return this.number;
};
var myObj = new MyNumberType(4);
myObj + 3; // 7
这个可以解释
if判定条件里,应该是要先转化成boolean类型,
如null, ‘’, undefined, NaN, 0 => false