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
"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")
}
4条答案
按热度按时间js81xvg61#
undefined
是全局对象的属性,即它是全局范围内变量。undefined
的初始值是原始值undefined
。参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
所以,它只是一个变量,没什么特别的。现在,回答你的问题:
undefined = 'A value';
尝试将字符串'A value'
赋给全局变量undefined
1.在较旧的浏览器中,该值会发生变化,即
undefined === 'A value'; // true
。在较新的浏览器中,在严格模式下,该操作会导致错误。您可以在浏览器控制台中测试以下内容(我在这里使用的是现代浏览器- Google Chrome):
undefined
的值在上面的例子中没有改变。这是因为(强调我的):在现代浏览器(JavaScript 1.8.5 / Firefox 4+)中,undefined是一个不可配置,不可写的属性根据ECMAScript 5规范。
在严格模式下:
6rqinv9w2#
与
true
、123
或null
不同,undefined
不是文字。这意味着使用undefined
标识符并不是获得未定义值的万无一失的方法。可以使用void
运算符,例如void 0
。默认情况下,
undefined
定义了全局对象的一个属性,即全局变量。在ECMAScript 5之前,该属性是可写的,所以替换了
window.undefined
的值,假设它没有被局部变量隐藏。如果使用"A value" === undefined
,则会得到true
。而void 0 === undefined
会产生false
。ECMAScript 5更改了此行为,现在该属性不可写也不可配置。因此,对
undefined
的赋值在非严格模式下将被忽略,在严格模式下将抛出异常。在引擎盖下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
变量:68de4m5k3#
我已经做了一个有和没有
strict mode
的POC。效果是,如果你不使用
strict mode
,一切都很好。如果你使用的是strict mode
,你会有一个很好的:TypeError:无法赋值给只读属性“undefined”
现在让我们来看看POC:
现在,正如我所说的,在严格模式下,你会获得一个
TypeError
,同时删除"use strict"
,脚本运行正常,输出只是nothing happened
。我发现了this Q/A,如果您想了解更多信息,可能会很有用
Node.js
测试了这段代码。9rnv2umw4#
除了Oriol回答之外
也可以有一个块级未定义变量