JS中的=、==、===是不同的
“=”表示赋值,
把后面的值赋给前面
var a=1 // 赋值
“==”相等运算符,
宽松的比较两个数据,如果两个数据类型相同,就直接比较,如果两个数据类型不同,则会先转化数据类型相同,再比较
- 原始类型间的比较
// 原始类型的数据会转换成数值类型再比较
1 == true // true
// 等同于 1 === 1
0 == false // true
// 等同于 0 === 0
2 == true // false
// 等同于 2 === 1
2 == false // false
// 等同于 2 === 0
'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1
'' == 0 // true
// 等同于 Number('') === 0
// 等同于 0 === 0
'' == false // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0
'1' == true // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1
'\n 123 \t' == 123 // true
// 因为字符串转为数字时,省略前置和后置的空格
- 对象与原始类型比较
// 对象与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
[1] == 1 // true
// 等同于 Number([1]) == 1
[1] == '1' // true
// 等同于 String([1]) == Number('1')
[1] == true // true
// 等同于 Number([1]) == Number(true)
- undefined 和 null
false == null // false
false == undefined // false
0 == null // false
0 == undefined // false
// undefined 和 null与其他类型的值比较时,结果都为false
undefined == null // true
undefined 和 null 比较时,结果为 true
“===” 严格相等运算符
严格相等运算符(===)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===)直接返回false
- 不同类型的值
1 === "1" // false
true === "true" // false
// 不同类型的值直接返回 false
- 同一类的原始类型值
1 === 0x1 // true
// 十进制和十六进制的 1 ,是相同的值,同一类型
- 同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
{} === {} // false
[] === [] // false
(function (){} === function (){}) // false
// 严格相等运算比较的是,它们是否引用同一个内存地址