[void 0]与[undefined]

今天刚开始学ts,看到TypeScript在处理函数的默认参数时,是先判断该参数是否存在(即是否是undefined),不存在的话则给它赋值。不过ts判断undefined并不是直接利用 target === undefined, 而是用void 0来替代undefined,这是为什么呢?

先来说结论: 是因为undefiend可能会被重写

我们得先来简单谈下undefined,它是标识符而非保留字,作为全局对象的一个属性,该属性的初始值表示基本数据类型值undefined,在ES5之前是可以给全局的undefined属性重新赋值,ES5规定将全局的undefined的值为只读

但是!尽管全局的undefined属性值不能再被修改,局部的undefined依旧是可以的,在函数内部申明一个新的undefined,它都是可以被赋值无论是不是在严格模式下

(function changeUndefined() {
  "use strict";
  console.log(undefined); // 全局的undefined,打印undefined
  var undefined = 10;
  console.log(undefined); // 局部的undefined变量,打印10
})()

(function changeUndefined() {
  "use strict";
  undefined = 10; // Uncaught TypeError: Cannot assign to read only property 'undefined' of object '#<Window>', 非严格模式下不会报错
  // console.log(undefined);
  // var undefined = 10; 注释掉是因为var存在变量提升,否则上面那个修改的依旧是局部的undefined变量
  // console.log(undefined);
})()

那为什么void 0就可以了呢,看下MDN对void的简介

The void operator evaluates the given *expression* and then returns undefined.

原来void操作符的作用就是先执行表达式,然后返回undefined,无论表达式是什么都是返回undefined值

void另外一个作用是用作立即执行函数表达式(IIFE)

一个常见的IIFE
(function () {
    // do something
})()

void function fn() {
  console.log('be called')
  return 10;
}(); //执行fn函数,并返回undefined而非10

另外一种判断undefined的方法可以是typeof target === 'undefined'

总的来说用void来表示undefined既可以不用担心undefined的值会被重写,也可以省下几个字节还是挺不错的

MDN JavaScript标准库 void操作符

MDN JavaScript标准库 undefined

hanzichi underscore源码解读-为什么用[void 0 ]代替[undefined]

猜你喜欢

转载自www.cnblogs.com/guanine/p/9261150.html
今日推荐