资讯专栏INFORMATION COLUMN

由ES规范学JavaScript(一):为什么undefined可以被赋值,而null不可以?

ccj659 / 1999人阅读

摘要:既然是属性,当然可以赋值。然而这三个属性又是不可写的属性,即它们的的内部特性为,所以赋值无效。因为严格模式下,禁止给对象的只读属性赋值。虽然号称是这种原始类型可以取的唯一值,然而输出参考文档

提出问题

如下代码:

undefined = 123;
null = 123; // 报错:Uncaught Reference Error

第一条语句可以执行,尽管赋值并没有成功;第二条语句报错。这是为什么呢?undefinednull有什么区别?

解决问题

读过ES规范后,发现原来是这样的:

undefinedNaNInfinity都是全局对象window的属性。既然是属性,当然可以赋值。然而这三个属性又是不可写的属性,即它们的的内部特性[[writable]]false,所以赋值无效。

null是一个字面量(literal),准确地说叫做Null字面量。与truefalse类似。它们都属于JavaScript的保留字。换句话说它们都是,与数字值123、字符串值"foobar"一样,当然不能被赋值了。

再多说些

既然undefined只是一个属性,并不是语言的保留字,那么它是否可以用来作为变量的名字?当然可以,你完全可以自定义一个叫做undefined的变量或者函数,但是注意不要把它放到全局作用域。例如:

function foo() {
     var undefined = 10;
     console.log(undefined);
}
foo(); // 打印10

通过ES5新增的方法Object.getOwnPropertyDescriptor方法,可以证明undefinedwindow对象的只读属性:

Object.getOwnPropertyDescriptor(window, "undefined");

/** 输出:Object {value: undefined, writable: false,
enumerable: false, configurable: false} **/

在严格模式下,给undefined赋值会报错。因为严格模式下,禁止给对象的只读属性赋值。

null虽然号称是Null这种原始类型可以取的唯一值,然而:

 typeof null; // 输出"object"

参考文档

15.1.1.3 undefined

7.6.1 Reserved Words

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91587.html

相关文章

  • ES规范JavaScript(二):深入理解“连等赋值”问题

    摘要:有这样一个热门问题其实这个问题很好理解,关键要弄清下面两个知识点引擎对赋值表达式的处理过程赋值运算的右结合性一赋值表达式形如的表达式称为赋值表达式。赋值表达式是右结合的。 有这样一个热门问题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...

    JasonZhang 评论0 收藏0
  • 前端习笔记(六)--JavaScript类型有哪些你知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    Lsnsh 评论0 收藏0
  • 前端习笔记(六)--JavaScript类型有哪些你知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    joyvw 评论0 收藏0
  • 前端习笔记(六)--JavaScript类型有哪些你知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    zlyBear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<