你应该知道的JavaScript中NaN的秘密
NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱,
一些操作会导致NaN值的产生。这里有些例子:
Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')
对于很多JavaScript的初学者来说,它的第一个陷阱是调用typeof时返回结果的通常是你想不到的:
console.log(typeof NaN); // 'number'
这情情况下,NaN并不意味着是一个数字,它的类型是数字。明白吗?
保持冷静,因为下面还有很多混乱的地方。让我们比较两个NaN:
var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x == y); // false
也许这是因为我们没有使用严格等价(===)操作?显然不是。
var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x === y); // false
好吧!难道是因为这两个NaN是从不同的操作产生出来的?那么这样...
var x = Math.sqrt(-2);
var y = Math.sqrt(-2);
console.log(x == y); // false
再疯狂一点
var x = Math.sqrt(-2);
console.log(x == x); // false
直接比较两个NaN呢?
console.log(NaN === NaN); // false
因为有很多方法来表示一个非数字,所以一个非数字不会等于另一个为NaN的非数字,它还是有一定道理的。不过这也是我为什么时而崩溃的原因:
这是对你的提醒,NaN的意思是“不为NaN".
— Ariya Hidayat (@AriyaHidayat)
为了解决这个问题,本来我打算向ECMAScript 7提交该方案的
GarlicNaN != NaN
但是当然,解决方案现在已经有了。
让我们认识一下全局函数isNaN:
console.log(isNaN(NaN)); // true
唉,不过 isNaN() 也有它自己的很多缺陷呀:
console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true
这样又产生 了很多不同的解决方案。其中一个是利用 了NaN的非反射性质(例如, 看看 Kit Cambridge 的笔记)
var My = {
isNaN: function (x) { return x !== x; }
}
另外一个例子是先检查值的类型(防止强制转换):
My.isNaN = function(x) { return typeof x === 'number' && isNaN(x)};
不过幸运的是,在即将到来的ECMAScript 6中, 有一个Number.isNaN() 方法提供可靠的NaN值检测。(随便说下,你已经可以在最新版的Chrome和firefox中使用这个方法了)。在2014年4月的规范草稿中,有着如下记载:
当传入一个数字参数并调用 Number.isNaN 时,会进行以下几步:
1. 如果Type(number) 不是数字, 返回 false.
2. 如果数字是NaN, 返回true.
3. 其他情况,返回false.
换句话说,只有在参数是真正的NaN时,才会返回true
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false
下一次,当你需要处理NaN时,要格外小心了。
附: Poetro 的评论
这是 IEEE 754 定义的NaN标准, 跟JavaScript无关。
"在计算中, NaN, 代表一个非数字, 是用来呈现未定义(undefined)和不可呈现(unrepresentable)的数据类型, 尤其是在浮点计算中。"
"与NaN的比较会一直返回一个无序的结果,甚至跟它自己比较。"
你应该知道的JavaScript中NaN的秘密的更多相关文章
- 那些必须要知道的Javascript
原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...
- 很少有人知道的c++中的try块函数
c++有一些在现实世界中很少看到的结构.这些结构有着自己的用法,但是要特别小心保守的予以运用.就像是网站 The Old New Thing首页标题上面的说的那样: “代码通常被读的次数原因超过了被写 ...
- [译] 你该知道的javascript作用域 (javascript scope)(转)
javascript有一些对于初学者甚至是有经验的开发者都难以理解的概念. 这个部分是针对那些听到 : 作用域, 闭包, this, 命名空间, 函数作用域, 函数作用域, 全局作用域, 变量作用域( ...
- 今天才知道的JavaScript的真实历史~[转]
JavaScript真的继承自Cmm吗?JavaScript与Java有多少关系?JavaScirpt最初的设计是怎样的?这个文章是从一个叫编程人生的网站上看到的.不知道出处在哪.在许多资料,Java ...
- 你应该要知道的JS中的this
前言 this 是 JavaScript 中不可不谈的一个知识点,它非常重要但又不容易理解.因为 JavaScript 中的 this 不同于其他语言.不同场景下的 this 指向不同(当函数被调用执 ...
- 你需要知道的 JavaScript 类(class)的这些知识
作者: Dmitri Pavlutin译者:前端小智来源:dmitripavlutin 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经 ...
- javaScrpit中NaN的秘密
NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...
- 你可能不知道的 JavaScript 中数字取整
网上方法很多,标题党一下,勿拍 ^_^!实际开发过程中经常遇到数字取整问题,所以这篇文章收集了一些方法,以备查询. 常用的直接取整方法 直接取整就是舍去小数部分. 1.parseInt() parse ...
- 5种你未必知道的JavaScript和CSS交互的方法
随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需要相互密切的合作.我们的网页中都有.js文件和.css ...
随机推荐
- JavaScript对象(窗口对象 定时器对象 )
1:窗口时间 confirm(str):确认对话框,确认返回trun,取消返回false,但是必须要有两个return:不然就算按下取消也会提交 第一个return:用于保证确认按钮运行 <sc ...
- word添加页码
问:在Word里面,分两栏插入页码,怎么使两栏都有页码? 可以通过插入域来实现分两栏后两栏都有页码.左边一栏页码为 当前页页码×2-1 :右边一栏页码为 当前页页码×2.在页眉页脚视图中,分别在左右两 ...
- C++模板详解
参考:C++ 模板详解(一) 模板:对类型进行参数化的工具:通常有两种形式: 函数模板:仅参数类型不同: 类模板: 仅数据成员和成员函数类型不同. 目的:让程序员编写与类型无关的代码. 注意:模板 ...
- xshell 上传 下载文件
借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. sz用法: 下载一个文件 sz filename 下载多个文件 sz file ...
- asp.net mvc下文件上传
典型的文件上传表单 <form action="/File" enctype="multipart/form-data" method="pos ...
- HDU-3401 Trade 单调队列优化DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 DP方程容易想出来,f[i][j]表示第i天拥有j个股票的最优解,则: 1.不买不卖,f[i][ ...
- SharePoint咨询师之路:设计之前的那些事三:体系结构
提示:本系列只是一个学习笔记系列,大部分内容都可以从微软官方网站找到,本人只是按照自己的学习路径来学习和呈现这些知识.有些内容是自己的经验和积累,如果有不当之处,请指正. 咨询师更多的时候是解决方案提 ...
- jQuery Callback 函数
@(编程) Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题 许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数. ...
- SUSE linux ,liveUSB制作方法
下载了ubuntu 11.04,ubuntu11.10,fedora15,kubuntu 11.04,linuxmint-11,还有suse的kde和gnome的桌面版镜像,其他的都很方便的做成了li ...
- mac电脑Coding显示/隐藏文件
苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法,最简单的要算在Mac终端输入命令.显示/隐藏Mac隐藏文件命令如下(注意其中的空格并且区分大小写): 显示Mac隐藏文件的命令:def ...