如果我们设置undefined的值会发生什么?

时间:2016-04-09 16:55:43

标签: javascript undefined

下面这行是做什么的?

undefined = 'A value';

如果它没有改变undefined的值,那么幕后会发生什么?

3 个答案:

答案 0 :(得分:53)

  

undefined是全局对象的属性,即它是全局范围内的变量。 undefined的初始值是原始值undefined

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

所以,它只是一个变量,没有什么特别之处。现在,回答你的问题:

  1. undefined = 'A value';尝试将字符串'A value'分配给全局变量undefined
  2. 在较旧的浏览器中,值会发生变化,即undefined === 'A value'; // true。在严格模式下的较新浏览器中,操作会导致错误。
  3. 您可以在浏览器控制台中测试以下内容(我在这里使用现代浏览器 - Google Chrome):

    undefined = true;
    console.log(undefined); // undefined
    // in older browsers like the older Internet Explorer it would have logged true
    

    undefined的值在上例中没有变化。这是因为(强调我的):

      

    在现代浏览器(JavaScript 1.8.5 / Firefox 4+)中,undefined是符合ECMAScript 5规范的不可配置,不可写属性

    在严格模式下:

    'use strict';
    undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object
    

答案 1 :(得分:24)

true123null不同,undefined不是literal。这意味着使用undefined identifier并不是获得undefined value的简单方法。相反,可以使用void operator,例如void 0

默认情况下,undefined定义了global object的属性,即全局变量。在ECMAScript 5之前,该属性是可写的,所以

undefined = "A value";

替换了window.undefined的值,假设它没有被局部变量遮蔽。然后,如果您使用"A value" === undefined,则会获得true。而void 0 === undefined会产生false

ECMAScript 5改变了这种行为,现在该属性不可写也不可配置。因此,在非严格模式下将忽略对undefined的赋值,并且将在严格模式下抛出异常。引擎盖下,

  1. undefined = "A value";Simple Assignment
  2. 使用PutValue将值"A value"放在引用中,基于全局对象,引用名称为"undefined",如果在严格模式下进行赋值,则使用strict flag。
  3. 它调用全局对象的[[Put]]内部方法,将"undefined"作为属性名称,"A value"作为值,将strict标志作为throw标志。
  4. 它调用全局对象的[[DefineOwnProperty]]内部方法,传递"undefined",属性描述符{[[Value]]: "A value"}和throw标志作为参数。
  5. 如果throw标志为true,则拒绝,即抛出TypeError异常,否则返回false。
  6. 但是,您仍然可以声明本地undefined变量:

    (function() {
      var undefined = "A value";
      alert(undefined); // "A value";
    })();
    

答案 2 :(得分:3)

我在有strict mode的情况下做了一点POC。

效果是,如果你不使用strict mode,一切都会好起来的。如果你正在使用strict mode,那么你会很高兴:

  

TypeError:无法分配给只读属性' undefined'

现在让我们进入POC:

"use strict"
var c;

if (c === undefined) {
  console.log("nothing happened")
}

undefined = "goofy"

c = "goofy"

if (c === undefined) {
  console.log("c is 'goofy' and it's equal to undefined.. gosh.. we broke js")
}

现在,正如我所说,使用严格模式,您获得TypeError,同时删除"use strict"脚本正常,输出只是nothing happened

如果您想了解更多信息,我发现this Q/A可能很有用

注意:我已使用Node.js测试了此代码。