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 相关文章推荐
js汉字转拼音实现代码
Feb 06 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
javascript实现下拉提示选择框
Dec 29 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
vue 如何添加全局函数或全局变量以及单页面的title设置总结
Jun 01 Javascript
Angular4实现图片上传预览路径不安全的问题解决
Dec 25 Javascript
layui表格数据重载
Jul 27 Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 18 Javascript
angular异步验证器防抖实例详解
Mar 31 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中处理模拟rewrite 效果
2006/12/09 PHP
解析isset与is_null的区别
2013/08/09 PHP
PHP内核探索:变量概述
2014/01/30 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
this关键字的作用
2016/01/30 面试题
师范生自我鉴定范文
2013/10/05 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
个人授权委托书模板
2014/09/14 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技