基础类型
- 大部分类型错误都被类型转换隐藏了
3 + true //4
但少数会出现错误
null.x//"TypeError: Cannot read property 'x' of null
2.运算符中的"+"运算是从左到右
1+2+"3"//"33"
1+"2"+3//"123"
当字符串与数字相加时,数字会转换为字符串
3.NaN
只有NaN与自己也不相等,利用这一特性,我们可以用一个函数来检测是不是NaN
function isRealNaN(data){
return data!==data;
}
isRealNaN(NaN);//true
对象的隐式转换
对象都有自己的toString(),valueOf方法,但优先调用valueOf()
对象转换成字符串是调用了他的toSting函数的,你可以手动的调用它来检测一下:
Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"
类似的,对象也是可以转换成数字的,他是通过valueOf函数的,当然,你也是可以自定义这个valueOf函数的,如下:
"J" + { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6
如果,一个对象同时存在valueOf方法和toString方法,那么,valueOf方法总是会被优先调用的,如下:
var obj = {
toString: function() {
return "[object MyObject]";
},
valueOf: function() {
return 17;
}
};
"object: " + obj; // "object: 17"
真值运算
只有false,0,-0,"",NaN,null,undefined
这些转换为false
所以,直接用真值转换来判断一个函数的参数是否传进来了,这是不太安全的。如下:
function point(x, y) {
if (!x) {
x = 320;
}
if (!y) {
y = 240;
}
return { x: x, y: y };
}
这个函数会忽略任何的真值为假的参数的,包括0,-0;
point(0, 0); // { x: 320, y: 240 }
point(0, 0); // { x: 320, y: 240 }
检测undefined的更加准确的方法是用typeof操作:
function point(x, y) {
if (typeof x === "undefined") {
x = 320;
}
if (typeof y === "undefined") {
y = 240;
}
return { x: x, y: y };
}
这种写法,可以区分开0和undefined的:
point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }
另外一种方法是利用参数跟undefined作比较,如下:
if (x == undefined) { ... }
每天都努力一点点
谢谢你看完