原文:http://www.2ality.com/2012/03/stricter-equality.html


大部分JavaScript程序员都知道:应该使用严格相等(===)来代替"普通"的相等操作(==).但是,有时候你的确需要一个比严格相等===更严格的运算符,比如说:在你想检查某个值是否是NaN的时候,又或者你想区分-0和+0的时候.本文解释了相关的知识以及ECMAScript.next中的解决办法:"is"运算符.

1.检测NaN

在数学上,任意值x总是与自己相等:

x = x 

但这条规则并不适用于 ===NaN:

> NaN === NaN
false

导致的结果就是,你不能通过使用indexOf方法在一个包含了NaN的数组中找到这个NaN,因为该方法在内部是使用了===来判断一个元素是否和参数中指定的值相等的:

> [ NaN ].indexOf(NaN)
-1

译者注:switch语句同理

switch (NaN) {case NaN:alert(NaN);
}

如果你不能使用 === 来检测NaN,那该使用什么呢?有一个全局函数isNaN(),但这个函数有个问题,就是它总会隐式的将参数中的值转换成数字再做判断,这样就在判断很多明显不是NaN的值的时候也返回了true:

> isNaN("foo")
true

解释:"foo"被转换成了数字NaN.

> Number("foo")
NaN

另外一个检测NaN的方法就是利用NaN是唯一一个与自身严格不相等的值:

function myIsNaN(value) {return value !== value;
}

另外一个更易懂的方法是在使用isNaN()之前先检查一下这个值是不是数字类型.这样就避免了隐式转换的问题.

function myIsNaN2(value) {return typeof value === 'number' && isNaN(value);
}

ECMAScript.next中将会有一个新的Number.isNaN()方法,它是一个修正版的isNaN()函数.

2.区分-0和+0

这样的需求很少见,但有时候你的确需要区分+0(正零)和-0(负零),在JavaScript中,这是两个不同的值.但===不能判断出来:

> -0 === +0
true

那到底该怎么来区分呢?在JavaScript中.如果让一个正数除以−0,结果是-Infinity.如果除以+0,则结果是Infinity.这两个无穷大值是可以使用===来判断的:

> 1 / -0
-Infinity> 1 / +0
Infinity> Infinity === -Infinity
false

译者注:写成函数就是

function isPositiveZero(zero){return 1/zero === Infinity && zero === 0}
function isNegativeZero(zero){return 1/zero === -Infinity && zero === 0}

3.ECMAScript.next中更严格的相等:"is"运算符

译者注:is和isnt运算符被拒绝了,ES6中不会有了.

ECMAScript.next会有一个"is"运算符,它的作用就是"更严格的相等”:它能把NaN看作等于自身,还能区分开-0和+0.还有一个相反的操作符称为"isnt".例如:

> NaN is NaN
true> -0 isnt +0
true

目前这个运算符可以由Object.is()方法来弥补.这个方法可以这样实现:

Object.is = function(x, y) {if (x === y) {// x === 0 => 比较+0和-0return x !== 0 || (1/x === 1/y);}// x !== y => 只有在x和y都是NaN时才返回truereturn x !== x && y !== y;
};

3.1 尝试Object.is()

如果你想尝试一下Object.is(),你可以使用es6-shim,它可以将ECMAScript.next(ECMAScript 6)中的一些特性移植到ECMAScript 5中.

译者注:如果想在ES3的环境上使用,则还得使用es5-shim

4.参考

  1. Equality in JavaScript: === versus ==
  2. ECMAScript.next: the “TXJS” update by Eich
  3. [译]JavaScript:NaN和Infinity
  4. es6-shim – ECMAScript 6 functionality on ECMAScript 5

[译]JavaScript:更严格的相等相关推荐

  1. [译] JavaScript 中的 CSS:基于组件的样式的未来

    本文讲的是[译] JavaScript 中的 CSS:基于组件的样式的未来, 原文地址:CSS in JavaScript: The future of component-based styling ...

  2. [译] JavaScript 的函数式编程是一种反模式

    本文讲的是[译] JavaScript 的函数式编程是一种反模式, 原文地址:Functional programming in JavaScript is an antipattern 原文作者:A ...

  3. [译] JavaScript:回调是什么鬼?

    本文讲的是[译] JavaScript:回调是什么鬼?, 原文地址:JavaScript: What the heck is a Callback? 原文作者:Brandon Morelli 译文出自 ...

  4. [译] JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  5. 「译」更快的 async 函数和 promises

    来源:https://www.yuque.com/es2049/blog 译自:Faster async functions and promises JavaScript 的异步过程一直被认为是不够 ...

  6. [译]JavaScript中,{}+{}等于多少?

    最近,Gary Bernhardt在一个简短的演讲视频"Wat"中指出了一个有趣的JavaScript怪癖:在把对象和数组混合相加时,会得到一些你意想不到的结果.本篇文章会依次讲解 ...

  7. [译]JavaScript 究竟是如何工作的?(第一部分)

    原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 如果你是一个 JS 开发者或者是正在学习这门语言的学生,很大概率上你 ...

  8. [译]JavaScript async / await:好处、坑和正确用法

    原文地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7通过介绍async/await使得JavaScript的异 ...

  9. [译]JavaScript的新功能将改变正则表达式的编写方式

    翻译:第一秩序 原文:www.smashingmagazine.com/2019/02/reg- 摘要:如果你曾用 JavaScript 做过复杂的文本处理和操作,那么你将会对 ES2018 中引入的 ...

最新文章

  1. 人均月薪 7.5 万,腾讯 Q2 成绩单来了,网友酸了?
  2. 张志华 机器学习 两门课程正确顺序及视频连接
  3. Vue团队核心成员开发的39行小工具 install-pkg 安装包,值得一学!
  4. 单片机搭建环境烧录方法_单片机仿真器的工作原理解析
  5. 局部敏感哈希(lsh)包安装成功
  6. PAT甲级 1003 Dijkstra的口诀干货
  7. python自带sqlite_python内置的sqlite3模块,使用其内置数据库
  8. web文件上传(三)--webapi后台接收参数和文件
  9. 人脸检测(十)--强分类器源码分析
  10. 下载 安装 破解Axure
  11. 1、节假日万年历API接口,免费好用
  12. Web模式使用RabbitMQ
  13. iOS 来电阻止和身份识别
  14. 2019年全球PC浏览器排行榜!
  15. 使用 Audacity 录音
  16. hdu 6608 Fansblog 威尔逊定理+大数阶乘取模
  17. 详细功能描述及代码带您快速接入百度大脑通用文字识别
  18. 传输层的主要功能和协议
  19. ubuntu安装samba共享文件夹并设置匿名用户登陆
  20. 使用Canvas 实现手机端签名

热门文章

  1. 对话DeepMap 罗维:COO应该在初创公司扮演什么角色?
  2. labelshop更改打印机_用labelshop打印流程
  3. 【STC8学习笔记】STC8A8K64S4A12外部中断配置例程
  4. OSPF 报文 链路状态更新报文 LSU
  5. C++ 第13课 进阶面向对象 上 ---- (狄泰软件学院)
  6. Day770.Redis客户端如何与服务器端交换命令和数据 -Redis 核心技术与实战
  7. Pure Storage收购容器存储Portworx的背后,原来暗藏这么多玄机
  8. Python贪心算法解决收银员找零问题
  9. linux查看用户bashrc,Linux中.bashrc用户环境文件详解
  10. bashrc java_bashrc添加环境变量 linux怎么配置path环境变量