资讯专栏INFORMATION COLUMN

用 void 0 代替 undefined

leanote / 277人阅读

摘要:在阅读一些框架源码时,发现都是用的代替,简单的了一下运算符运算符对给定的表达式进行求值,然后返回。在之前,给赋值会覆盖该属性。但是由于不是保留字,依然可以在局部作用域中声明一个的变量,并改变它的值。

在阅读一些框架源码时,发现都是用的 void 0 代替 undefined,简单的 Google 了一下:

void 运算符

void 运算符 对给定的表达式进行求值,然后返回 undefined。

void 0; // undefined
void ("0"); // undefined
void "hello world"; // undefined
void function (){return "foo"}() // undefined
undefined

我们经常会写如下判断

if (foo === undefined) {
  foo = "foo"
}

严格上来说这样的代码是不安全的,我们默认假设了 undefined 的值没有改动过。因为 undefined 不是 JavaScript 的保留字,只是全局变量上的一个属性,属性值是原始值 undefined。在 ECMAScript 5 之前,给 window.undefined 赋值会覆盖该属性。从 ECMAScript 5 开始undefined 是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。

Object.getOwnPropertyDescriptor(window, "undefined");
/* {
  value: undefined, 
  writable: false, 
  enumerable: false, 
  configurable: false
} */

但是由于 undefined 不是保留字,依然可以在局部作用域中声明一个 undefined 的变量,并改变它的值。

function foo () {
  let undefined = "hello world";
 
  return function (v) {
    return v === undefined;
  }
}

let isUndefined = foo();
let bar;
isUndefined(bar); // false
isUndefined(undefined); // false
isUndefined("hello world"); // true
安全的写法

一种是可以用 typeof,对于原始值 undefined , typeof 始终返回字符串 "undefined"

function foo () {
  let undefined = "hello world";
 
  return function (v) {
    return typeof v === "undefined";
  }
}
let isUndefined = foo();
let bar;
isUndefined(bar); // true
isUndefined(undefined); // true
isUndefined("hello world"); // false

另外一种就是 void 运算符,void 运算符始终返回原始值 undefined

function foo () {
  let undefined = "hello world";
 
  return function (v) {
    return v === void 0;
  }
}
let isUndefined = foo();
let bar;
isUndefined(bar); // true
isUndefined(undefined); // true
isUndefined("hello world"); // false

当然,与 void "hello world" 比较也是可以的,但是 void 0 字符数更短,写起来比 typeof 方便。因为框架代码不知道自己的执行上下文,也就不能假定 undefined 标识有没有被重新赋值过,所以用 void 0 来判断是不是原始值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89056.html

相关文章

  • void 0 代替 undefined 说起

    摘要:最近开始看源码,并将源码解读放在了我的计划中。相对于其他源码解读的文章,基本都会从整体设计开始讲起,楼主觉得这个库有点特殊,决定按照自己的思路,从用代替说起。源码没有出现注意,其实有出现一处,是为,而不是,而用代替之。 Why underscore 最近开始看 underscore源码,并将 underscore源码解读 放在了我的 2016计划 中。 阅读一些著名框架类库的源码,就好...

    Cc_2011 评论0 收藏0
  • (void 0)与undefined之间的小九九

    摘要:又是啥是原始类型值之一,也是全局对象的属性,在部分低级别的浏览器中可以被修改,在局部作用域中也可以被修改。所以常见的解决方法是在这个问题中提到用去替代标签的空属性会减少页面请求是否属实有待考证结尾第一篇暂时写完了,欢迎大家吐槽和提意见。 前言 原文链接 源码地址 这是underscore.js源码分析的第一篇文章,为什么选择写这篇文章呢?其实主要有两点 下划线源码中通篇可见这样的判断...

    novo 评论0 收藏0
  • (void 0)与undefined之间的小九九

    摘要:又是啥是原始类型值之一,也是全局对象的属性,在部分低级别的浏览器中可以被修改,在局部作用域中也可以被修改。所以常见的解决方法是在这个问题中提到用去替代标签的空属性会减少页面请求是否属实有待考证结尾第一篇暂时写完了,欢迎大家吐槽和提意见。 前言 原文链接 源码地址 这是underscore.js源码分析的第一篇文章,为什么选择写这篇文章呢?其实主要有两点 下划线源码中通篇可见这样的判断...

    Arno 评论0 收藏0
  • Js基础——数据类型之Null和Undefined

    摘要:原始值就是值本身不可改变,并且没有方法和属性。操作的时候看似操作原始值,其实是操作它的副本。代表空指针,就是没有对象存在,它不是全局对象的属性。这也是为什么需要替代它的原因。别忘了它们是不同的类型栗子参考资料 原始值就是值本身不可改变,并且没有方法和属性。操作的时候看似操作原始值,其实是操作它的副本。 Null 代表空指针,就是没有对象存在,它不是全局对象的属性。Null type对应...

    jubincn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<