为什么有的编程规范要求用 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);
参考
- 《JavaScript 权威指南》
- 极客时间《重学前端》
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void
- https://segmentfault.com/a/1190000007015757
为什么有的编程规范要求用 void 0 代替 undefined的更多相关文章
- void 0 与 undefined
偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined? 如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼? void 0 void是JavaScript的一 ...
- 【跟着子迟品underscore】从用 `void 0` 代替 `undefined` 说起
Why underscore 最近开始看 underscore源码,并将 underscore源码解读 放在了我的 2016计划 中. 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多 ...
- 为什么js中要用void 0 代替undefined
这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...
- js 用 void 0 替代 undefined
underscore 源码没有出现 undefined,而用 void 0 代替之.为什么要这么做?我们可以从两部分解读,其一是 undefined 哪里不好了,你非得找个替代品?其二就是替代品为毛要 ...
- void 0 或者 undefined
Problem 在检查一个值是否为undefined的时候.你们是假设去測试的? 要是之前的我会这样子測试 function isUndefined(obj){ return obj === unde ...
- 你真的知道为什么要使用void(0)代替undefined吗?
我们平时用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)对象下的一个属性. Object.getOwnPropertyDes ...
- JS - What does `void 0` mean?
语法 void expression // or void(expression) MDN的描述 能向期望一个表达式的值是 undefined 的地方插入会产生副作用的表达式.也就是为了避免产生某种副 ...
- undefined 与void 0
参考:https://segmentfault.com/a/1190000000474941 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值.void 操作符用法 ...
- 源码学习之void 0
今天看源码的时候看到 void 0 这样的写法,平时在业务代码里基本没有这样的写法,于是学习了一下. 在控制台运行了一下void 0,得到返回值是undefined. 在MDN上搜了一下void,了解 ...
随机推荐
- 10.Go-goroutine,waitgroup,互斥锁和channel
10.1.goroutine goroutine的使用 //Learn_Go/main.go package main import ( "fmt" "time" ...
- mongoDB的CRUD的总结
今天开始接触非关系型数据库的mongoDB,现在将自己做的笔记发出来,供大家参考,也便于自己以后忘记了可以查看. 首先,mongoDB,是一种数据库,但是又区别与mysql,sqlserver.orc ...
- C语言之左移和右移运算符
C语言中的左移和右移运算符移位后的结果老是忘记,最近在刷有关位操作的题目,正好整理下: 1. 左移运算符(<<) 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指 ...
- JavaScript 数组、字符串、Map、Set 方法整理
在线阅读 https://www.kancloud.cn/chenmk/web-knowledges/1080519 数组 isArray():Array.isArray(value) 用于检测变量是 ...
- java优雅注释原则和代码格式列举
一.java的三种注释类型 单行注释:// ...... 块注释:/* ...... */ 文档注释:/** ...... */ 二.指导原则 注释不能美化糟糕的代码,碰到糟糕的代码就重新写吧. 用代 ...
- c#Winform自定义控件-目录
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- gcd 和 同余方程(Exgcd)
求关于x的同余方程 ax≡1(mod b) 的最小正整数解. 对于 100%的数据,2≤a,b≤2*109. NOIP 2012 提高组 第二天 第一题 (只看Exgcd的自行跳过这段文字) 先撇开扩 ...
- Python 数据科学-Numpy
NumPy Numpy :提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是由C语 ...
- Unity 自定义Inspector面板时的数据持久化问题
自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...
- Egret白鹭开发微信小游戏排行榜功能
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 最近事情特别多,今天终于实现了排行榜功能,记录下来大家一起学习学习. 一.调用默认排行榜 首先我们需要了解: 1.白鹭开 ...