为什么有的编程规范要求用 void 0 代替 undefined?

来源:http://www.chinese-glasses.com 作者:Web前端 人气:96 发布时间:2020-04-29
摘要:原文: 阮一峰老师的文章: http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html StackOverFlow上问题: http://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript ECMAScrip

原文:

阮一峰老师的文章:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

Stack OverFlow上问题:http://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript

ECMAScript规范:http://www.ecmascript.org/

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

/** * 源码 */var value;console.log(value === undefined);

/** * 使用 uglify 压缩 */"use strict";var value;console.log(void 0===value);

从上面的运行结果可知,全局变量 undefined 的 writable 属性是 false,也就是不可写。

parseInt // NaNparseInt(undefined) // NaN
/** * Chrome 浏览器 */ Object.getOwnPropertyDescriptor(window, undefined); //运行结果:{"writable":false,"enumerable":false,"configurable":false}
var a;console.log // undefined

void 运算符对给定的表达式进行求值,会忽略计算结果并始终返回 undefined。

图片 1null And undefined

任何变量在被赋值前它的值都是 undefined,但是在 JavaScript 引擎中,undefined 是一个变量而非关键字。在旧的浏览器中,全局变量 undefined 可以被重写。

许多 JavaScript 压缩工具,已经帮助我们针对 undefined 的这个问题做出了处理。

console.log; // Uncaught ReferenceError: a is not defined 

Undefined 类型表示未定义,它的类型只有一个值,就是 undefined。

上面提示很具有迷惑性,说a not defined,那就是undefined喽?NONONO!这里是指a未被声明,称之为undeclared更为准确。

var value;console.log(value === void 0); //trueconsole.log(value === void(0)); //true

4.3.9 Undefined ValueThe undefined value is a primitive value used when a variable has not been assigned a value.// undefined是一个原始值,一个变量尚未被分配一个值时会使用到它

4.3.11 Null ValueThe null value is a primitive value that represents the null, empty, or non-existent reference.// null是一个原始值,被用来表示零、空或者不存在的引用

var value1 = 'hi';console.log(value1); //"hi"var value2 = void 'hi';console.log(value2); //undefined

参考资料:

void

  • typeof null === 'object'这是ECMAScript中的一个bug,不是代表null是一个对象。曾经有人提议改变这一点,但如果改变结果的话,将使很多旧的脚本无法运行,所以没有采纳。null只是被用来说明这里可以放一个对象的地址,但是当前什么都没放,是个空指针。

因此,我们可以利用这一点准确地获取预期的 undefined 值。

ECMAScript-262 5th Edition And 6th Edition(相较于3th版基本没有变动):

扩展

这么考虑下来在JS当中参与数字运算的时候,把null值转换成0也不是没有道理,而undefined就没有这层含义了,所以不能参与和数字的运算,但是值得注意的是:

从上面的测试结果来看,有的编程规范要求使用 void 0 代替 undefined,主要原因在于避免 undefined 值被重写带来的风险。现代浏览器中,全局变量 undefined 是不可写的,如果不考虑兼容旧的浏览器,那么这个问题就不用太过在意。

typeof null // object (bug in ECMAScript, should be null)typeof undefined // undefinednull === undefined // falsenull == undefined // true
/** * IE8 浏览器 */var value;console.log(value === undefined); //true// 重写 undefinedundefined = 'hi';console.log(value === undefined); //false

本文由10bet发布于Web前端,转载请注明出处:为什么有的编程规范要求用 void 0 代替 undefined?

关键词:

最火资讯