[译]JavaScript:更严格的相等
原文: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.参考
- Equality in JavaScript: === versus ==
- ECMAScript.next: the “TXJS” update by Eich
- [译]JavaScript:NaN和Infinity
- es6-shim – ECMAScript 6 functionality on ECMAScript 5
[译]JavaScript:更严格的相等相关推荐
- [译] JavaScript 中的 CSS:基于组件的样式的未来
本文讲的是[译] JavaScript 中的 CSS:基于组件的样式的未来, 原文地址:CSS in JavaScript: The future of component-based styling ...
- [译] JavaScript 的函数式编程是一种反模式
本文讲的是[译] JavaScript 的函数式编程是一种反模式, 原文地址:Functional programming in JavaScript is an antipattern 原文作者:A ...
- [译] JavaScript:回调是什么鬼?
本文讲的是[译] JavaScript:回调是什么鬼?, 原文地址:JavaScript: What the heck is a Callback? 原文作者:Brandon Morelli 译文出自 ...
- [译] JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...
原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...
- 「译」更快的 async 函数和 promises
来源:https://www.yuque.com/es2049/blog 译自:Faster async functions and promises JavaScript 的异步过程一直被认为是不够 ...
- [译]JavaScript中,{}+{}等于多少?
最近,Gary Bernhardt在一个简短的演讲视频"Wat"中指出了一个有趣的JavaScript怪癖:在把对象和数组混合相加时,会得到一些你意想不到的结果.本篇文章会依次讲解 ...
- [译]JavaScript 究竟是如何工作的?(第一部分)
原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 如果你是一个 JS 开发者或者是正在学习这门语言的学生,很大概率上你 ...
- [译]JavaScript async / await:好处、坑和正确用法
原文地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7通过介绍async/await使得JavaScript的异 ...
- [译]JavaScript的新功能将改变正则表达式的编写方式
翻译:第一秩序 原文:www.smashingmagazine.com/2019/02/reg- 摘要:如果你曾用 JavaScript 做过复杂的文本处理和操作,那么你将会对 ES2018 中引入的 ...
最新文章
- 人均月薪 7.5 万,腾讯 Q2 成绩单来了,网友酸了?
- 张志华 机器学习 两门课程正确顺序及视频连接
- Vue团队核心成员开发的39行小工具 install-pkg 安装包,值得一学!
- 单片机搭建环境烧录方法_单片机仿真器的工作原理解析
- 局部敏感哈希(lsh)包安装成功
- PAT甲级 1003 Dijkstra的口诀干货
- python自带sqlite_python内置的sqlite3模块,使用其内置数据库
- web文件上传(三)--webapi后台接收参数和文件
- 人脸检测(十)--强分类器源码分析
- 下载 安装 破解Axure
- 1、节假日万年历API接口,免费好用
- Web模式使用RabbitMQ
- iOS 来电阻止和身份识别
- 2019年全球PC浏览器排行榜!
- 使用 Audacity 录音
- hdu 6608 Fansblog 威尔逊定理+大数阶乘取模
- 详细功能描述及代码带您快速接入百度大脑通用文字识别
- 传输层的主要功能和协议
- ubuntu安装samba共享文件夹并设置匿名用户登陆
- 使用Canvas 实现手机端签名
热门文章
- 对话DeepMap 罗维:COO应该在初创公司扮演什么角色?
- labelshop更改打印机_用labelshop打印流程
- 【STC8学习笔记】STC8A8K64S4A12外部中断配置例程
- OSPF 报文 链路状态更新报文 LSU
- C++ 第13课 进阶面向对象 上 ---- (狄泰软件学院)
- Day770.Redis客户端如何与服务器端交换命令和数据 -Redis 核心技术与实战
- Pure Storage收购容器存储Portworx的背后,原来暗藏这么多玄机
- Python贪心算法解决收银员找零问题
- linux查看用户bashrc,Linux中.bashrc用户环境文件详解
- bashrc java_bashrc添加环境变量 linux怎么配置path环境变量