博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
undefind和null的区别
阅读量:6964 次
发布时间:2019-06-27

本文共 1403 字,大约阅读时间需要 4 分钟。

在常见的强类型语言中,通常有一个表示“空”的值,比如null。但是在Javascript中,空(或者叫“无值”)有两种选择:undefined和null。在Javascript中除了这两个值其他都是对象。其他的基本类型都有其对象的包装类型。但是,typeof null返回的是object,这是一个一直未修复的bug。

undedind

undefined实际上代表了不存在的值(non-existence of a value)。
有许多的方法产生一个undefined值的代码。它通常遇到当试图访问一个不存在的值时。在这种情况下,在JavaScript这种动态的弱类型语言中,只会默认返回一个undefined值,而不是上升为一个错误:
  • 任何声明变量时没有提供一个初始值,都会有一个为undefined的默认值
  • 当试图访问一个不存在的对象属性或数组项时,返回一个undefined值
  • 如果省略了函数的返回语句,返回undefined
  • 函数调用时未提供的值结果将为undefined参数值
  • void操作符也可以返回一个undefined值。像Underscore的库使用它作为一个防御式的类型检查,因为它是不可变的,可以在任何上下文依赖返回undefined
  • undefined是一个预定义的全局变量(不像null关键字)初始化为undefined值

null

通常用作一个空引用一个空对象的预期,就像一个占位符。typeof的这种行为已经被确认为一个错误,虽然提出了修正,出于后兼容的目的,这一点已经保持不变。 这就是为什么JavaScript环境从来没有设置一个值为null;它必须以编程方式完成。
使用null的情况:
  • DOM,它是独立于语言的,不属于ECMAScript规范的范围。因为它是一个外部API,试图获取一个不存在的元素返回一个null值,而不是undefined。
  • 如果你需要给一个变量或属性指定一个不变值,将它传递给一个函数,或者从一个函数返回null,null几乎总是最好的选择。
  • JavaScript使用undefined并且程序员应该使用null。
  • 通过分配null值,有效地清除引用,并假设对象没有引用其他代码,指定垃圾收集,确保回收内存。

相似之处

都是完全不可变的,没有属性和方法,也不能给其属性赋值。事实上,试图访问或定义一个属性将会引发一个类型错误(TypeError)。正如他们的名字暗示的那样,他们是完全无效的值。

不同之处

一个重要的区别,服务于不同的目的和理由。区分这两个值,你可以认为undefined代表一个意想不到的没有值而null作为预期没有值的代表。
使用Object.prototype.toString.call()形式可以具体打印类型。

Object.prototype.toString调用过程
  • 如果值是undefined,返回“[object Undefined]”。
  • 如果这个值为null,则返回“[object Null]”。
  • 让O作为调用ToObject同时传递this值作为参数的结果值。
  • 让class是O的内部属性[[Class]]的值。
  • 返回的结果连接三个字符串“[object ”,class,和“]”的结果的字符串值。 

转载于:https://juejin.im/post/5cee4e9f518825375324f4d8

你可能感兴趣的文章
优先队列 如何使用
查看>>
笔记本打字不知道按了什么键,打字老出现数字?
查看>>
每日英语:Can Going In and Out of Air Conditioning Cause Colds?
查看>>
Linux系统下查看目录大小
查看>>
对称加密DES和TripleDES
查看>>
Activity的启动模式总结
查看>>
平台化软件的设计与应用前景分析
查看>>
Maven3路程(三)用Maven创建第一个web项目(1)
查看>>
Android 获取屏幕尺寸与密度
查看>>
jquery 实现iframe 自适应高度
查看>>
Linux(Ubuntu)下如何解压 .zip 文件
查看>>
&和&&的一点区别
查看>>
UI设计实战篇——利用Bootstrap框架制作查询页面的界面
查看>>
如何提高分布式系统的可用性
查看>>
在asp.net中使用jQuery实现类似QQ网站的图片切割效果
查看>>
苹果笔记本只有电源键能用的解决办法
查看>>
Android在Gallery中每次滑动只显示一页
查看>>
OpenCV 脸部跟踪(1)
查看>>
Table嵌套去掉子table的外边框
查看>>
解决Sqlite UTF-8中文数据格式在DOS窗口下中文乱码
查看>>