• [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]

  • 相关阅读:
    mysql常用指令
    mysql数据库文件简介和应用
    redis配置参数简介
    shell输入输出重定向
    memcached添加日志输出
    java 随机数种子
    统计学习方法——第四章朴素贝叶斯及c++实现
    统计学习方法——第二章的c++实现
    python函数带不带括号的问题
    numpy中的range()
  • 原文地址:https://www.cnblogs.com/guanine/p/9261150.html
Copyright © 2020-2023  润新知