zoukankan      html  css  js  c++  java
  • 为什么有的编程规范要求用 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);
    

    参考文档

  • 相关阅读:
    111
    关于Node.js中安装完express后不能使用express命令
    vscode tab转空格
    【终端使用】rm命令,删除文件获目录
    WebStorage是什么?
    Vue路由传参
    --save 和 --save-dev的区别
    第五篇,理解JS模块化编程思想
    第四篇,JavaScript面试题汇总
    第三篇,ajax 和 axios、fetch的区别
  • 原文地址:https://www.cnblogs.com/xiaoyucoding/p/11976238.html
Copyright © 2011-2022 走看看