特别声明: 此篇文章内容来源于 @Kuba Michalski http://codeburst.io/@kubamichalski 的 Understanding null, undefined and NaN http://codeburst.io/understanding-null-undefined-and-nan-b603cb74b44c 一文.
当您开始学习 JavaScript 时, 首先需要学习的是数据类型. 只要我们讨论 Number , String , Boolean 和 Object 时, 一旦涉及到 null 和 undefined 出现时, 作为初学者要理解清楚他们就可能会有点混乱.
如果你和我一样是位 JavaScript 的初学者, 建议您花点时间阅读变量值的数据类型一文.
null
null 值表示一个指向不存在或无效的 对象 http://developer.mozilla.org/en-US/docs/Glossary/object 或地址 (DMN http://developer.mozilla.org/en-US/docs/Glossary/Null) 引用. 即使它指向不存在的东西, 也没什么, 它是一个全局对象(也是 JavaScript 的原始值之一).
否定 null 值返回 true , 但将其与 false (或 true )进行比较则会给出 false .
在基础数学运算中, null 值将被转换为 0 .
undefined
全局属性 nundefined 表示原始值 undefined . 它也是 JavaScript 的原始数据类型( MDN http://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Global_Objects/undefined ). undefined 是全局作用域的一个变量. undefined 的最初值就是原始数据类型 undefined . 一个没有被赋值的变量的类型是 undefined . 如果方法或者是语句中操作的变量没有被赋值, 则会返回 undefined .
当你声明一个变量但没有声明它的值时, JavaScript 会给它赋值 undefined .
如果你尝试在任何运算中使用 undefined , 你会得到 NaN 的值. 与 null 相似, 否定 undefined 值返回 true , 但将其与 true 或 false 作比较则为 false .
null vs undefined
那么 null 和 undefined 两者之间有什么区别呢? 通过上面的内容, 我们来比较一下他们之间的相似点和不同之处.
相似之处:
当被否定时, 两者的值都是 true
代表了一些不存在的东西...
差异之处:
null 表示无, 完全不存在的; undefined 表示东西没有定义
undefined 有自己的数据类型( undefined ), null 只是一个对象
在基本算术运算中, null 被视为 0 , undefined 返回的 NaN
还有一些事情需要指出来:
undefined == null 返回的值是 true , 因为 JavaScript 会尽力将两个值转换为相同类型.
第二个语句, undefined === null 和第一个语句有点不同, 他们还在比较数据类型(除了比值, 还要比两者数据类型), 加上 JavaScript 很聪明, 可以看出他们之间的区别, 所以返回的值是 false .
第三个和最后一个语句, !undefined == !null 和
!undefined === !null
实际上已经非常的简单. 由于两个都是否定的返回值(否定的返回值都是 true , 而且其数据类型也相同), 所以最终返回的值是 true .
NaN (Not a Number)
通过前文的学习, 我们知道了什么是 undefined 和 null , 以及它们之间的差异性, 接下来我们来讨论一下 NaN 的值.
全局 NaN 属性是一个表示非数字的值( MDN http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN ).
我认为这个定义很清楚. 当我们要得到的数字不是数字时, JavaScript 会返回这个值. 例如, 当你试图用 cucumber 减去
10
或者用
12
除以 R2D2 时, 它们返回的值为 NaN .
在某些情况下, 你可能期望得到这个值, 但事实不如你预期.
当你在字符串中添加一些东西的时候. 如果 JavaScript 看到 + 符号和一个字符串, 它会自动将第二个元素添加到字符串中.
当你用数字和布尔值一起运算的时候, 布尔值会转换为 1 和 0 . true 转为 1 , false 转换为 0 .
现在, 棘手的 (或者最棘手的) 部分. NaN 实际上是一个数字 .
嗯, 所以我们可以说它代表了自身的缺失, 对吗? 更进一步, 我们得出结论, 它本质上是相反的.
所以 NaN 和它自身值作比较返回的值是 false . 幸运的是, 我们有一个函数可以检查参数是否为 NaN : isNaN() http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN .
总结
null 表示无, 不存在或无效的对象或地址引用. 它在简单的数学运算中会转换为 0 , 它是一个全局对象. null == false 返回的值是 false .
undefined 是一个全局属性, 原始值 undefined . 它告诉我们有些东西没有赋值, 没有定义. undefined 不能转换成任何数字, 因此在数学计算中使用它, 返回的是 NaN .
NaN 表示一个不是数字的东西, 尽管它实际上是一个数字. 它不等于它本身, 如果要检查是否有东西是 NaN 时, 需要借助 isNaN() 函数.
JavaScript 中喜欢转换值, 因此你需要使用三重等号 ( === ) 来确保两个元素是否相同.
大漠
常用昵称 "大漠",W3CPlus 创始人, 目前就职于手淘. 对 html5,CSS3 和 Sass 等前端脚本语言有非常深入的认识和丰富的实践经验, 尤其专注对 CSS3 的研究, 是国内最早研究和使用 CSS3 技术的一批人. CSS3,Sass 和 Drupal 中国布道者. 2014 年出版 图解 CSS3: 核心技术与案例实战 http://www.w3cplus.com/book-comment.html .
来源: http://www.tuicool.com/articles/iqMVfei