Js中==与===
JavaScript
中提供==
相等运算符与===
严格相等运算符,建议是只要变量的数据类型能够确定,一律使用===
,各种类型的值的比较可以参考Js
真值表
==相等运算符
==
在判断相等时会进行隐式的类型转换, 其比较遵循一些原则,即先转换类型再比较。
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,即是调用Number()
方法。
如果一个操作数是字符串,另一个是数值,在比较相等性之前先将字符串转换为数值,同样调用Number()
方法。
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()
和toString()
方法把对象转换成基础类型的值再比较,除Date
对象外,会优先尝试使用valueOf()
方法,用得到的基本类型按照前面的规则进行比较。
以及null == undefined
,此外任何其他组合,都不相等。
1 == true //true // Number Boolean
2 == true //false
1 == "1" //true // Number String
[ ] == "" //true // Object String
[ ] == false // true // Object Boolean
[ ] == 0 //true // Object Number
[ ] == { } //false
[ ] == [ ] //false
{ } == { } //false
null == undefined //true
在使用的时候可能会出现一些问题。
0 == "0" //true
0 == [ ] //true
"0" == [ ] // false
如果是直接实现了valueOf()
与toString()
的方法,而不是调用原型链上的Object.prototype.valueOf()
与Object.prototype.toString()
方法,甚至能够产生异常。
var obj = { valueOf : function ( ) { return { } } , toString : function ( ) { return { } } }
console . log ( obj == 0 ) // Uncaught TypeError: Cannot convert object to primitive value
===严格相等运算符
===
先判断类型再比较,类型不同直接不相等。
ES6
数据类型有Number
、String
、Boolean
、 Object
、Symbol
、null
和undefined
。
1 === true //false
1 === "1" //false
[ ] === "" //false
null === undefined //false
if
if()
也可以看作是一个单独的运算符类别。
if ( true ) console . log ( "exec" ) ; //exec
if ( false ) console . log ( "exec" ) ;
if ( 1 ) console . log ( "exec" ) ; //exec
if ( 0 ) console . log ( "exec" ) ;
if ( - 1 ) console . log ( "exec" ) ; //exec
if ( "true" ) console . log ( "exec" ) ; //exec
if ( "1" ) console . log ( "exec" ) ; //exec
if ( "0" ) console . log ( "exec" ) ; //exec
if ( "" ) console . log ( "exec" ) ;
if ( null ) console . log ( "exec" ) ;
if ( undefined ) console . log ( "exec" ) ;
if ( "null" ) console . log ( "exec" ) ; //exec
if ( "undefined" ) console . log ( "exec" ) ; //exec
if ( [ ] ) console . log ( "exec" ) ; //exec
if ( { } ) console . log ( "exec" ) ; //exec
if ( [ 0 ] ) console . log ( "exec" ) ; //exec
if ( NaN ) console . log ( "exec" ) ;
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://www.zhihu.com/question/31442029
https://thomas-yang.me/projects/oh-my-dear-js/
https://dorey.github.io/JavaScript-Equality-Table/#three-equals