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 相关文章推荐
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
Nov 17 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
Jun 11 Javascript
详解react关于事件绑定this的四种方式
Mar 09 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
Jul 25 jQuery
微信小程序实现分享商品海报功能
Sep 30 Javascript
Element-UI+Vue模式使用总结
Jan 02 Javascript
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内核解析:PHP中的哈希表
2014/01/30 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
react路由配置方式详解
2017/08/07 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python中处理unchecked未捕获异常实例
2015/01/17 Python
python机器人行走步数问题的解决
2018/01/29 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
Python爬虫与反爬虫大战
2020/07/30 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
学校司机岗位职责
2013/11/14 职场文书
测试工程师岗位职责
2013/11/28 职场文书
趣味比赛活动方案
2014/02/15 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
应届生找工作求职信
2014/06/24 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
一年级下册数学教学反思
2016/02/16 职场文书