work word any abc exp string ota always
一、if() 中的布尔判断
(Expression) 表达式会通过 ES5 定义的 ToBoolean 方法强制把 Expression 转换成布尔值。
- if
数据类型 | 转换结果 |
Undefined | false |
Null | false |
Boolean | 不变 |
Number | +0, ?0, or NaN 转换为 false; 其他的转换为 true. |
String | 空字符串或长度为 0 的字符串转换为 false; 其他的转换为 true. |
Object | true |
示例:
- vartrutheyTester =function(expr) {
- returnexpr ? "truthey" : "falsey";
- }
- trutheyTester({}); //truthey (an object is always true)
- trutheyTester(false);//falseytrutheyTester(newBoolean(false));//truthey (an object!)
- trutheyTester("");//falseytrutheyTester(newString(""));//truthey (an object!)
- trutheyTester(NaN); //falseytrutheyTester(newNumber(NaN));//truthey (an object!)
二、==
会对不同类型的数据进行强制转换以比较,记住两点即可:
Type(x) | Type(y) | Result |
x 和 y 是同一种数据类型 | 和 === 判断原则一样一样 | |
null | Undefined | true |
Undefined | null | true |
Number | String | x == toNumber(y) |
String | Number | toNumber(x) == y |
Boolean | (any) | toNumber(x) == y |
(any) | Boolean | x == toNumber(y) |
String or Number | Object | x == toPrimitive(y) |
Object | String or Number | toPrimitive(x) == y |
otherwise… | false |
toNumber() 的转换规则:
形式参数类型 | 结果 |
Undefined | NaN |
Null | +0 |
Boolean |
true -->1; false-->+0; |
Number | 不变 |
String | "abc" -> NaN"123" -> 123 |
Object |
1. Let primValue be ToPrimitive(input argument, hint Number). 2. Return ToNumber(primValue). |
ToPrimitive() 转换规则:
形式参数 | 结果 |
Object | (在做相等判断进行强制转换时) 先调用 valueOf(), 没有返回值再调用 toString(),还没有返回值则报错。 |
otherwise… | 不变 |
示例:
[0] == true;
- 1 //EQUALITY CHECK...
- 2[0] ==true;
- 3
- 4 //HOW IT WORKS...
- 5 //convert boolean using toNumber
- 6[0] == 1;
- 7 //convert object using toPrimitive
- 8 //[0].valueOf() is not a primitive so use...
- 9 //[0].toString() -> "0"
- 10"0" == 1;
- 11 //convert string using toNumber
- 120 == 1;//false!
"potato" == true;
- //EQUALITY CHECK...
- "potato" == true;
- //HOW IT WORKS...
- //convert boolean using toNumber
- "potato" == 1;
- //convert string using toNumber
- NaN == 1; //false!
"potato" == false;
- //EQUALITY CHECK...
- "potato" == false;
- //HOW IT WORKS...
- //convert boolean using toNumber
- "potato" == 0;
- //convert string using toNumber
- NaN == 0; //false!
object with valueOf;
- //EQUALITY CHECK...
- crazyNumeric = new Number(1);
- crazyNumeric.toString = function() {
- return "2"
- };
- crazyNumeric == 1;
- //HOW IT WORKS...
- //convert object using toPrimitive
- //valueOf returns a primitive so use it
- 1 == 1; //true!
object with toString;
- //EQUALITY CHECK...
- var crazyObj = {
- toString: function() {
- return "2"
- }
- }
- crazyObj == 1;
- //HOW IT WORKS...
- //convert object using toPrimitive
- //valueOf returns an object so use toString
- "2" == 1;
- //convert string using toNumber
- 2 == 1; //false!
三、===
值和类型都必须严格相等:
数据类型 | 值 | 结果 |
二者类型不同 | false | |
Undefined or Null | true | |
Number | 二者值相等,除了 NaN | true |
String | 二者包含相同的字符 | true |
Boolean | 二者都是 true 或 false | true |
Object | 二者引用自同一个对象 | true |
otherwise… | false |
参考资料:
1. 《Truth, Equality and JavaScript 》:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
JavaScript if(x),== 和 === 解析 (翻译整理)
来源: http://www.bubuko.com/infodetail-2069700.html