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

6tr1vspr  于 2023-06-28  发布在  Java
关注(0)|答案(4)|浏览(140)

下面这一行是干什么的?

undefined = 'A value';

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

js81xvg6

js81xvg61#

undefined是全局对象的属性,即它是全局范围内变量。undefined的初始值是原始值undefined
参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
所以,它只是一个变量,没什么特别的。现在,回答你的问题:

  1. undefined = 'A value';尝试将字符串'A value'赋给全局变量undefined
    1.在较旧的浏览器中,该值会发生变化,即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

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
6rqinv9w

6rqinv9w2#

true123null不同,undefined不是文字。这意味着使用undefined标识符并不是获得未定义值的万无一失的方法。可以使用void运算符,例如void 0
默认情况下,undefined定义了全局对象的一个属性,即全局变量。在ECMAScript 5之前,该属性是可写的,所以

undefined = "A value";

替换了window.undefined的值,假设它没有被局部变量隐藏。如果使用"A value" === undefined,则会得到true。而void 0 === undefined会产生false
ECMAScript 5更改了此行为,现在该属性不可写也不可配置。因此,对undefined的赋值在非严格模式下将被忽略,在严格模式下将抛出异常。在引擎盖下

  1. undefined = "A value";是一个简单赋值
    1.它使用PutValue将值"A value"放置在一个引用中,该引用的基础是全局对象,引用名称为"undefined",如果赋值是在严格模式下进行的,则使用strict标志。
    1.它调用全局对象的Put内部方法,传递"undefined"作为属性名,"A value"作为值,strict标志作为throw标志。
    1.它调用全局对象的DefineOwnProperty内部方法,传递"undefined"、属性描述符{[[Value]]: "A value"}和throw标志作为参数。
    1.它拒绝,也就是说,如果throw标志为true,则抛出TypeError异常,否则返回false。
    但是,您仍然可以声明本地undefined变量:
(function() {
  var undefined = "A value";
  alert(undefined); // "A value";
})();
68de4m5k

68de4m5k3#

我已经做了一个有和没有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测试了这段代码。
9rnv2umw

9rnv2umw4#

除了Oriol回答之外
也可以有一个块级未定义变量

{  
    let emptyVar;
    // console.log(emptyVar === undefined); // Cannot access 'undefined' before initialization
    const undefined = "some value";
    console.log(undefined);
    console.log(void 0); // primitive undefined
}

相关问题