原文链接: js null undefine

上一篇: dom 2 xlsx

下一篇: js new 运算符 自定义实现

https://www.cnblogs.com/qyzy1024/p/4036661.html

二、历史原因

最近,我在读新书 《Speaking JavaScript》 时,意外发现了这个问题的答案!

原来,这与JavaScript的历史有关。1995年 JavaScript诞生 时,最初像Java一样,只设置了null作为表示"无"的值。

根据C语言的传统,null被设计成可以自动转为0。


Number(null)
// 05 + null
// 5

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。

首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。

其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。

因此,Brendan Eich又设计了一个undefined。

三、最初设计

JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。


Number(undefined)
// NaN5 + undefined
// NaN

四、目前的用法

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示"没有对象",即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。


Object.getPrototypeOf(Object.prototype)
// null

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。


var i;
i // undefinedfunction f(x){console.log(x)}
f() // undefinedvar  o = new Object();
o.p // undefinedvar x = f();
x // undefined

然后来看下JS中几个空值的类型:

1

2

3

4

5

typeof (undefined) == 'undefined'

typeof ( null ) == 'object'

typeof ( "" ) == 'string'

typeof (0) == 'number'

typeof ( false ) == 'boolean'

这五个值的共同点是,在if语句中做判断,都会执行false分支。当然从广义上来看,是说明这些数值都是其对应数据类型上的无效值或空值。还有这五个值作!运算,结果全为:true。

最后来我们看下这五个值做字符串转换时的差异

1

2

3

4

5

String(undefined) -> "undefined"

String( null ) -> "null"

String( "" ) -> ""

String(0) -> "0"

String( false ) -> "false"

js null undefine相关推荐

  1. js null ,null没有typeof返回值为undefine 即 null没有返回类型的

    var user="<%=session.getAttribute("username")%>"; alert(user); alert(user. ...

  2. js null加法的处理

    首先看一段JS高级编程中,有关加法(+)操作符的解释: 一个简单的测试: alert(3 + null); // 3 alert('3' + null); // 3null 可见对于null的处理,并 ...

  3. 前端学习(3265):js中undefine中3相关属性

  4. 前端学习(3264):js中undefine中二相关属性

  5. 前端学习(3263):js中undefine

  6. php的对象和数组应该学js,JavaScript数组与对象的常用方法及 json 的序列化

    一.JavaScript数据类型: 1- 原始类型:number(数值),string(字符串),boolean(布尔值)var age = 18; var username = "admi ...

  7. JavaScript/Js 大全

    尊重原创,原文链接 Java Script 基础 一. JS的简介 JavaScript是一种网页编程技术,经常用于创建动态交互网页  JavaScript是一种基于对象和事件驱动的解释性脚本语言,类 ...

  8. JavaScript检查null与undefined以及==和===之间的差异

    如何检查变量是否为null或undefined并且null和undefined什么区别? ==和===什么区别(很难在Google上搜索" ===")? #1楼 区别是微妙的. 在 ...

  9. JavaScript使用localStorage缓存Js和css文件

    对于WebApp来说,将js css文件缓存到localstorage区可以减少页面在加载时与HTTP请求的交互次数,从而优化页面的加载时间.特别是当移端信号不好高延迟时优化效果还是很显见的 下面的代 ...

最新文章

  1. linux用echo重定向到文件,Linux – Bash将String重定向到文件
  2. sharepoint列表EventHandle的开发 -转
  3. 儿童吹泡泡水简单配方_儿童吹泡泡水简单配方[组图]
  4. linux进程间的通信(C): 共享内存
  5. ipython是一个交互式计算机系统_IPython 1.0发布,强大的Python交互式Shell
  6. php 5.6 zend opcache,使用Zend OpCache 提高 PHP 5.5+ 性能
  7. linux查看CPU高速缓存(cache)信息
  8. Unity3d大会的部分总结
  9. maven依赖冲突以及解决方法
  10. animate改变背景颜色_3D MAX2016视口背景设置里各参数的含义详解 - 3dmax基础操作入门教程-3dmax材质教程,3d材质贴图教程参数,vray材质参数,3dmax贴图教程...
  11. pyqt5优秀项目python_基于Pyqt5打造量化系统GUI
  12. win10打开蓝牙_win10动态锁,只要你离电脑远一点,电脑就自动锁定
  13. SVM多分类的几种方式
  14. 手机怎么修改浏览器的html,手机设置默认浏览器
  15. 如何利用linux解除手机bl锁,小米手机解BL锁教程(小米手机详细图文详解解锁Bootloader教程)...
  16. 中小企业(OA)办公系统方案 huangai[VA]
  17. 免费地图资源(持续更新)
  18. FFMPEG+SDL播放音频流
  19. 常用的算法(PHP 版)
  20. 推荐3个游戏小程序,让你整个暑假都充实!

热门文章

  1. Android双卡双待编程识别
  2. MTK 平台sensor arch 介绍-kernel
  3. 算法训练营学习笔记1
  4. 用人单位订立哪些规章制度必须与职工协商
  5. 跟老男孩儿学习LINUX运维
  6. win7(windows7旗舰版)声卡High Definition Audio驱动(安装失败)解决方案(Thinkpad)
  7. 快速乘法算法原理及实现
  8. 图像相似性匹配 快速算法
  9. 简单数位dp及对前导0的理解
  10. Java基础学习笔记(3)