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 相关文章推荐
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
读jQuery之二(两种扩展)
Jun 11 Javascript
js变量以及其作用域详解
Jul 18 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
JavaScript按值删除数组元素的方法
Apr 24 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
vue中使用ueditor富文本编辑器
Feb 08 Javascript
Node.js Express安装与使用教程
May 11 Javascript
Element Dialog对话框的使用示例
Jul 26 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技术开发技巧分享
2010/03/23 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
微信小程序实现留言板
2018/10/31 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Django内容增加富文本功能的实例
2017/10/17 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
利用python求积分的实例
2019/07/03 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
护士辞职信范文
2014/01/19 职场文书
个性与发展自我评价
2014/02/11 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
财务人员担保书
2014/05/13 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
HAM-2000摩机图
2021/04/22 无线电
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Go遍历struct,map,slice的实现
2021/06/13 Golang