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

C g*_*ics 58 javascript undefined

这一行在下面做了什么?

undefined = 'A value';
Run Code Online (Sandbox Code Playgroud)

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

Ole*_*leg 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.在严格模式下的较新浏览器中,操作会导致错误.

您可以在浏览器控制台中测试以下内容(我在这里使用现代浏览器 - Google Chrome):

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

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
Run Code Online (Sandbox Code Playgroud)

  • 在"非严格"模式下的新浏览器中怎么样?它没有显示任何错误.它有什么用吗?因为它也没有改变价值 (2认同)

Ori*_*iol 24

不像是true,123或者null,undefined不是文字.这意味着使用undefined 标识符不是获取未定义值的万无一失的方法.相反,可以使用void运算符,例如void 0.

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

undefined = "A value";
Run Code Online (Sandbox Code Playgroud)

取代它的值window.undefined,假设它没有被局部变量遮蔽.然后,如果你使用"A value" === undefined,你会得到true.并void 0 === undefined会产生false.

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

  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,它拒绝,即抛出TypeError异常,否则返回false.

但是,您仍然可以声明局部undefined变量:

(function() {
  var undefined = "A value";
  alert(undefined); // "A value";
})();
Run Code Online (Sandbox Code Playgroud)

  • "但是,您仍然可以声明本地未定义的变量:" - 好点! (3认同)