javascript 相等运算符
相等运算符
JavaScript提供两个相等运算符:==
和===
。
简单说,它们的区别是相等运算符(==
)比较两个值是否相等,严格相等运算符(===
)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===
)直接返回false
,而相等运算符(==
)会将它们转化成同一个类型,再用严格相等运算符进行比较。
严格相等运算符的算法如下。
(1)不同类型的值
如果两个值的类型不同,直接返回false
。
1 === "1" // false
true === "true" // false
上面代码比较数值的1
与字符串的“1”、布尔值的true
与字符串“true”,因为类型不同,结果都是false
。
(2)同一类的原始类型值
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true
,值不同就返回false
。
1 === 0x1 // true
上面代码比较十进制的1
与十六进制的1
,因为类型和值都相同,返回true
。
需要注意的是,NaN
与任何值都不相等(包括自身)。另外,正0
等于负0
。
NaN === NaN // false
+0 === -0 // true
(3)同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
{} === {} // false
[] === [] // false
(function (){} === function (){}) // false
上面代码分别比较两个空对象、两个空数组、两个空函数,结果都是不相等。原因是对于复合类型的值,严格相等运算比较的是,它们是否引用同一个内存地址,而运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false
。
如果两个变量引用同一个对象,则它们相等。
var v1 = {};
var v2 = v1;
v1 === v2 // true
注意,对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。
new Date() > new Date() // false
new Date() < new Date() // false
new Date() === new Date() // false
上面的三个表达式,前两个比较的是值,最后一个比较的是地址,所以都返回false
。
(4)undefined 和 null
undefined
和null
与自身严格相等。
undefined === undefined // true
null === null // true
由于变量声明后默认值是undefined
,因此两个只声明未赋值的变量是相等的。
var v1;
var v2;
v1 === v2 // true
(5)严格不相等运算符
严格相等运算符有一个对应的“严格不相等运算符”(!==
),两者的运算结果正好相反。
1 !== '1' // true
转自:http://javascript.ruanyifeng.com/grammar/operator.html#toc8
最新文章
- google tensorflow guide
- SQL学习整理_1
- CentOS 6.6编译安装Nginx1.6.2+MySQL5.6.21+PHP5.6.3
- 打开现有的pdf,并插入一个图片
- [No000026]365种创业、办公、和生活成长的精华资源
- ubuntu mysql 更改IP导致mysql无法启动
- angular $resource模块
- Swift - 懒加载(lazy initialization)
- ppt打不出中文
- 从0,1,2...n中统计0,1,2...9各出现了多少次【SWUN1597】
- linux ubuntu关于U盘的安装 开机启动u盘的时候出现/casper/vmlinuz.efi: file not found
- android开发中遇到的问题
- ProGuard 代码混淆
- VS2008中Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted 错误解决方法
- ITU-T G.1080 IPTV的体验质量(QoE)要求 (Quality of experience requirements for IPTV services)
- 第一次java作业
- 菜鸟学IT之第一次作业
- 学习笔记之The Intelligent Investor, Rev. Ed
- Redis 缓存设计原则
- 使用Python创建MySQL数据库实现字段动态添加以及动态的插入数据