JavaScript是一个对范例异常容忍的言语,在我们编写代码的过程当中,会看到很多代码直接对差别范例的操纵数举行操纵。有的时刻这会给我们的代码的编写带来很大的轻易,而有些时刻这些不加搜检的范例比较也会给我们的代码带来一些隐患。在调试的时刻,我们假如对JavaScript自动实行的范例转换有比较清楚的相识的话,很不轻易发现问题的地点点。
PS: 对象→基础范例的转换规则请参考《JavaScript高等编程指南》
一、减号、乘号、除号、取模…
减号、乘号、除号、取模等操纵符是比较纯真的操纵符。
这些操纵符会尝试将他们的操纵数转换为数字(运用Number()
),假如操纵数没法转换为数字的话,他们的效果就是NaN
。
NaN
与任何数举行这些操纵,效果都是NaN
// Demo1.html
var obj = {
valueOf: function() {
return 18;
}
};
var obj2 = {
valueOf: function() {
return 19;
}
};
console.log(
1 - "2", // -1
"32" - "22", // 10
obj % 4, // 2
obj * obj2, // 342
"99b" * 10 // NaN
);
二、大于、小于、大于即是、小于即是
同(一),然则关于两个操纵数均是字符串的时刻&没法转换时的返回值会有差别。
当两个操纵数均是字符串的时刻,它会实行人人熟习的字符串比较,即从左到右顺次比较每个字符的ASCII码,若涌现相符操纵符的状况,则返回true
,不然返回false
。
没法将操纵数转换为数字的状况下老是返回false
。
Boolean(NaN) == false
// Demo2.html
var obj = {
valueOf: function() {
return 18;
}
};
console.log(
1 <= "2", // true
"1" <= "a", // true
obj >= "17" // true
);
三、==、!=
这两个运算符在大部分上面都是与(一)雷同的,差别的是:
- 字符串 op 字符串:不会举行范例转换,直接比较。
- 对象 op 对象:援用都指向同一个对象才为
true
。
// Demo3.html
var obj = {
valueOf: function() {
return 18;
}
};
var obj2 = {
valueOf: function() {
return 19;
}
};
console.log(
obj == obj2, // false
"XD" == "XD", // true
obj == 18, // true
obj2 == "19" // true
);
温馨提醒:
null == undefined // true
四、加号(+)
当没有迥殊指定的时刻参考(一),比方对象+对象等,但有以下几种例外状况:
- 字符串 + 字符串:举行字符串拼接操纵。
- 字符串 + 其他:将其他转换为字符串,并举行拼接操纵。
// Demo4.html
var obj = {
toString: function() {
return "18s";
},
valueOf: undefined
};
var obj2 = {
toString: function() {
return "19b";
},
valueOf: function() {
return 19;
}
};
console.log(
obj + obj2, // "18s19"
obj2 + obj2 // 38
);
注重上面
obj + obj2
的效果不是”18s19b”。由于操纵数中没有字符串,所以参考(一)的转换规则。
DEMO
[主要提醒]请不要遗忘引荐和珍藏 (╯‵□′)╯︵ ┴─┴
git clone https://github.com/JasonKid/fezone.git
搜刮 操纵数隐式范例转换