如果我们设置undefined的值会发生什么?
下面这行是做什么的?
undefined = 'A value';
如果它不改变undefined
的值,那么幕后会发生什么?
undefined
是全局对象的一个属性,即它是全局范围内的一个variables。undefined
的初始值是undefined
的原始值。
见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
所以,这只是一个variables,没有什么特别的。 现在,回答你的问题:
-
undefined = 'A value';
尝试为undefined
的全局variables分配一个string'A value'
- 在较旧的浏览器中,值发生变化,即
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
不像true
, 123
或null
这样的东西, 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是严格模式。 在引擎盖下,
-
undefined = "A value";
是一个简单的作业 - 它使用PutValue将值
"A value"
放在引用中,并以全局对象,引用名称"undefined"
基准,如果赋值是在严格模式下进行的,则使用严格标志。 - 它调用全局对象的[[Put]]内部方法,传递
"undefined"
作为属性名,"A value"
作为值,strict标志作为throw标志。 - 它调用全局对象的[[DefineOwnProperty]]内部方法,传递
"undefined"
,属性描述符{[[Value]]: "A value"}
和throw标志作为参数。 - 如果throw标志为true,则拒绝,即引发TypeErrorexception,否则返回false。
但是,您仍然可以声明本地undefined
variables:
(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.js
testing了这段代码。
- PHP错误信息“注意:使用undefined常量”是什么意思?
- “types'double'的input参数的未定义函数'function_name'”。
- JavaScript – 确定一个属性是否被定义,并设置为“未定义”,或者是未定义的
- variables===未定义与typeofvariables===“undefined”
- JavaScript检查variables是否存在(被定义/初始化)
- 有没有一个标准的函数来检查JavaScript中的空,未定义或空白variables?
- 什么时候在JavaScript中使用null或undefined?
- 如何在JavaScript中检查未定义的variables
- 数组(len)初始值设定项中未定义的值