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

提出问题

如下代码:

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

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

解决问题

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

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

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

再多说些

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

    function foo() {
         var undefined = 10;
         console.log(undefined);
    }
    foo(); // 打印10
  2. 通过ES5新增的方法Object.getOwnPropertyDescriptor方法,可以证明undefinedwindow对象的只读属性:

    Object.getOwnPropertyDescriptor(window, 'undefined');
    
    /** 输出:Object {value: undefined, writable: false,
    enumerable: false, configurable: false} **/
  3. 在严格模式下,给undefined赋值会报错。因为严格模式下,禁止给对象的只读属性赋值。

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

     typeof null; // 输出"object"

参考文档

  1. 15.1.1.3 undefined

  2. 7.6.1 Reserved Words

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值