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多线程的实现方法
May 08 Javascript
js 颜色选择器(兼容firefox)
Mar 05 Javascript
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
Nov 26 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
Dec 04 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
webpack构建换肤功能的思路详解
Nov 27 Javascript
vue自定义指令directive的使用方法
Apr 07 Javascript
VUE实现图片验证码功能
Nov 18 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序列化反序列化的方法
2015/10/27 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python查看微信撤回消息代码
2018/06/07 Python
python 字符串和整数的转换方法
2018/06/25 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Python与C/C++的相互调用案例
2021/03/04 Python
毕业生在校学习的自我评价分享
2013/10/08 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
广播体操口号
2014/06/18 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
室外天线与收音机天线杆接合方法
2022/04/05 无线电