JavaScript if(x),==和===解析(翻译整理)

一、if()中的布尔判断

if ( Expression ) 表达式会通过ES5定义的ToBoolean方法强制把Expression 转换成布尔值。

数据类型 转换结果
Undefined false
Null false
Boolean 不变
Number  +0, −0, or NaN 转换为false;
 其他的转换为true.
String 空字符串或长度为0的字符串转换为false;
其他的转换为true.
Object true

示例:

var trutheyTester = function(expr) {
    return expr ? "truthey" : "falsey";
}
 
trutheyTester({}); //truthey (an object is always true)
 
trutheyTester(false); //falsey
trutheyTester(new Boolean(false)); //truthey (an object!)
 
trutheyTester(""); //falsey
trutheyTester(new String("")); //truthey (an object!)
 
trutheyTester(NaN); //falsey
trutheyTester(new Number(NaN)); //truthey (an object!)

 

二、==

 会对不同类型的数据进行强制转换以比较,记住两点即可:

  1. undefined和null永远互相相等
  2. 当两个不同类型的值进行比较,Object会被toPrimitive()转化为原始值,String和Boolean会被toNumber()转换为数字或NaN
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
12 0 == 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!

三、===

值和类型都必须严格相等:

  1. 不同类型永远不相等
  2. 对象必须引用自同一个对象才相等
  3. 字符串必须包含相同的字符集合
  4. 原型(primitives)共享同一个值才相等
  5. NaN, null and undefined永远不和其他类型相等
  6. NaN甚至不会和自己相等
数据类型 值 结果
二者类型不同 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/

 

posted on 2017-05-14 18:04  吴言顺的写字台  阅读(962)  评论(0)    收藏  举报

导航