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

undefined

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

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

/**

* ie8 浏览器

*/

var value;

console.log(value === undefined); //true

// 重写 undefined

undefined = 'hi';

console.log(value === undefined); //false

从上面的例子可知,在旧的浏览器下如果 undefined 被重写为非 undefined 值,那么它就无法用来正确检测一个变量是否被赋值。

这个问题在 ecmascript 5 中被修复了,在实现了 ecmascript 5 规范的浏览器中运行以下代码。

/**

* chrome 浏览器

*/

object.getownpropertydescriptor(window, undefined); //运行结果:{"writable":false,"enumerable":false,"configurable":false}

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

void

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

var value1 = 'hi';

console.log(value1); //"hi"

var value2 = void 'hi';

console.log(value2); //undefined

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

var value;

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

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

结束

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

扩展

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

/**

* 源码

*/

var value;

console.log(value === undefined);

/**

* 使用 uglify 压缩

*/

"use strict";var value;console.log(void 0===value);

参考

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值