相等运算符

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

undefinednull与自身严格相等。

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

最新文章

  1. google tensorflow guide
  2. SQL学习整理_1
  3. CentOS 6.6编译安装Nginx1.6.2+MySQL5.6.21+PHP5.6.3
  4. 打开现有的pdf,并插入一个图片
  5. [No000026]365种创业、办公、和生活成长的精华资源
  6. ubuntu mysql 更改IP导致mysql无法启动
  7. angular $resource模块
  8. Swift - 懒加载(lazy initialization)
  9. ppt打不出中文
  10. 从0,1,2...n中统计0,1,2...9各出现了多少次【SWUN1597】
  11. linux ubuntu关于U盘的安装 开机启动u盘的时候出现/casper/vmlinuz.efi: file not found
  12. android开发中遇到的问题
  13. ProGuard 代码混淆
  14. VS2008中Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted 错误解决方法
  15. ITU-T G.1080 IPTV的体验质量(QoE)要求 (Quality of experience requirements for IPTV services)
  16. 第一次java作业
  17. 菜鸟学IT之第一次作业
  18. 学习笔记之The Intelligent Investor, Rev. Ed
  19. Redis 缓存设计原则
  20. 使用Python创建MySQL数据库实现字段动态添加以及动态的插入数据

热门文章

  1. springboot2.X整合mybatis
  2. B-树学习笔记
  3. TensorFlow进阶(四)---名称域和共享变量
  4. jquery ajax方式直接提交整个表单
  5. 性能调优的Windows窗体DataGridView控件
  6. 换掉Tomcat默认图标
  7. Android_三种菜单介绍
  8. 使用System.getProperty方法,如何配置JVM系统属性 (转载)
  9. 算法笔记_018:旅行商问题(Java)
  10. selenium webdriver 的三种等待方式