JavaScript 更严格的相等 [译]


Posted in Javascript onSeptember 20, 2012

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 } 
function isNegativeZero(zero){ 
return 1/zero === -Infinity 
}

3.ECMAScript.next中更严格的相等:“is”操作符

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和-0 
return x !== 0 || (1/x === 1/y); 
} // x !== y => 只有在x和y都是NaN时才返回true 
return 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. NaN and Infinity in JavaScript
  4. es6-shim ? ECMAScript 6 functionality on ECMAScript 5
Javascript 相关文章推荐
jquery 可排列的表实现代码
Nov 13 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
Apr 24 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
vue 打包后的文件部署到express服务器上的方法
Aug 09 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
Apr 25 Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 Javascript
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
JavaScript 反科里化 this [译]
Sep 20 #Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 #Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 #Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 #Javascript
javascript分页代码(当前页码居中)
Sep 20 #Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 #Javascript
一个基于jquery的文本框记数器
Sep 19 #Javascript
You might like
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
python内存管理机制原理详解
2019/08/12 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
python range实例用法分享
2020/02/06 Python
python3中编码获取网页的实例方法
2020/11/16 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
排查Tomcat进程假死的问题
2022/05/06 Servers