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

下面这行是做什么的?

undefined = 'A value'; 

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

undefined是全局对象的一个​​属性,即它是全局范围内的一个variables。 undefined的初始值是undefined的原始值。

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

所以,这只是一个variables,没有什么特别的。 现在,回答你的问题:

  1. undefined = 'A value'; 尝试为undefined的全局variables分配一个string'A value'
  2. 在较旧的浏览器中,值发生变化,即undefined === 'A value'; // true undefined === 'A value'; // true 。 在严格模式下的较新浏览器中,操作会导致错误。

您可以在浏览器控制台中testing以下内容(我正在使用现代浏览器 – 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+)中,根据ECMAScript 5规范,undefined是不可configuration的,不可写属性

严格模式下:

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

不像true123null这样的东西, undefined不是一个文字 。 这意味着使用undefined 标识符不是一个获取未定义值的简单方法。 相反,可以使用void操作符 ,例如void 0

默认情况下, undefined定义了全局对象的一个属性,即全局variables。 在ECMAScript 5之前,这个属性是可写的,所以

 undefined = "A value"; 

replace了window.undefined的值,假设它没有被局部variables所影响。 那么如果你使用"A value" === undefined ,你会得到true 。 和void 0 === undefined会产生false

ECMAScript 5改变了这种行为,现在该属性不可写或不可configuration。 因此, undefined赋值将在非严格模式下被忽略,并且会抛出一个exception是严格模式。 在引擎盖下,

  1. undefined = "A value"; 是一个简单的作业
  2. 它使用PutValue将值"A value"放在引用中,并以全局对象,引用名称"undefined"基准,如果赋值是在严格模式下进行的,则使用严格标志。
  3. 它调用全局对象的[[Put]]内部方法,传递"undefined"作为属性名, "A value"作为值,strict标志作为throw标志。
  4. 它调用全局对象的[[DefineOwnProperty]]内部方法,传递"undefined" ,属性描述符{[[Value]]: "A value"}和throw标志作为参数。
  5. 如果throw标志为true,则拒绝,即引发TypeErrorexception,否则返回false。

但是,您仍然可以声明本地undefinedvariables:

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

我做了一个有点和没有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") } 

现在,正如我所说的,在严格模式下,您可以在删除"use strict"脚本的情况下获得TypeError而且脚本nothing happened

我发现这个Q / A可能是有用的,如果你想知道更多

注意 :我已经使用Node.jstesting了这段代码。