==和===定义
==
和===
虽然都是关系表达式运算符,但它们的定义是有所不同的:
==
:称作相等运算符(Equality Operator),它用来检测两个操作是否相等,这里的相等的定义非常宽松,可以允许类型的转换===
:称作严格相等运算符(Strict Equality),也被称之为恒等运算符(Identity Operator)或全等运算符,它用来检测两个操作数是否严格相等
== 和 ===运算规则
JavaScript中==
和===
运算符,它们的运算都具有自己的运算规则。
==运算规则
==
运算符对于两个数比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。
在转换不同的数据类型时,其会遵循下列基本原则:
如果两个操作数的类型相同,则会按照严格相等的比较规则一样,如果严格相等,那么比较结果为相等。如果它们不严格相等,则比较结果为不相等。
如果两个操作数的类型不同,==
相等操作符也可能会认为它们相等。检测相等将会遵守下面的规则和类型转换:
如果一个值是null
, 另一个是undefined
,则它们是相等:
null == undefined; // => true
如果一个值是数字,另一个是字符串,先将字符串转换为数值,然后使用转换后的值进行比较:
1 == ‘1‘; // => true
如果其中一个值是true
,则将其转换为1
再进行比较。如果其中一个值是false
,则将其转换为0
再进行比较:
true == 0; // => false
false == 1; // => false
true == 1; // => true
false == 0; // => true
true == ‘1‘; // => true
false == ‘0‘;// => true
如果一个值是对象,另一个值是数字或字符串,将会先使用toString()
和valueOf()
将对象转换为原始值,然后再进行比较。
两个操作数在进行比较时则要遵循下列规则:
null
和undefined
是相等的- 要比较相等性之前,不能将
null
和undefined
转换成其他任何值 - 如果有一个操作是
NaN
,则相等操作符返回false
,而不相等操作符返回true
。重要提示: 即使两个操作数都是NaN
,相等操作符也返回false
,因为按照规则 ,NaN
不等于NaN
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回
true
,否则返回false
来看一下对象的比较:
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // =>false c == d // =>false e == f // =>true
===运算规则
严格相等运算符===
首先要计算其操作数的值,然后比较这两个值,比较过程没有任何类型转换。其运算规则遵循下面的规则:
如果两个值类型不相同,则它们不相等
true === ‘1‘; // => false
其中操作数true
是布尔值,而‘1‘
是字符串值。
如果两个者都是null
或者都是undefined
,则它们相等:
null === null; // => true
undefined === undefined; // => true
null === undefined; // =>false
如果两个值都是布尔值true
或false
,则它们相等:
true === true; // =>true
false === false; // =>true
true === 1; // =>false
true === ‘1‘; // =>false
false === 0; // =>false
false === ‘0‘; // =>false
如果其中一个值是NaN
,或者两个值都是NaN
,则它们不相等。NaN
和其他任何值都是不相等的,包括它本身。通过x !== x
来判断x
是否为NaN
,只有在x
为NaN
的时候,这个表达式的值才为true
。
如果两个值为数字且数值相等,则它们相等。如果一个值为0
,另一个值为-0
,则它们同样的相等。
转载自http://www.w3cplus.com/javascript/which-equals-operator-vs-should-be-used-in-javascript-comparisons.html