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 相关文章推荐
ExtJS 2.0 GridPanel基本表格简明教程
May 25 Javascript
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
javascript数组操作方法小结和3个属性详细介绍
Jul 05 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
Nov 26 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
新入门node.js必须要知道的概念(必看篇)
Aug 10 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
vue或react项目生产环境去掉console.log的操作
Sep 02 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
python动态进度条的实现代码
2019/07/03 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Keras设置以及获取权重的实现
2020/06/19 Python
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
求职简历自荐信
2014/06/18 职场文书
七一建党节演讲稿
2014/09/11 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
Java版 单机五子棋
2022/05/04 Java/Android