15、ts之void,void(0),void 0

void在ts中的运用

js中没有空值的概念,在ts中用void表达没有任何返回的值的函数。

function alertName(): void {
    
    
	alert('imkaifan')
}

声明一个 void类型的变量没有什么用,因为只能将其赋值为undefined 和 null(只在 --strictNullChecks 未指定时)

 let dd: void = undefined // 正确的
 let cc: void = null // 错误的,只有在strictNullChecks 未指定时正确

// 害,其实我也不知道strictNullChecks 未指定时是啥意思,以后知道了补充一下

void 0 === void(0) === undefined

源码涉及到 undefined 表达都会被编译成 void 0

//源码
const a: number = 6
a === undefined

//上述代码最终的最终,会被编译为(在tsc命令的编译下并不是最终的):
"use strict";
var a = 6;  a === void 0;

为什么不直接写 undefine

undefined 是 js 原始类型值之一,也是全局对象window的属性,在一部分低级浏览器(IE7-IE8)中or局部作用域可以被修改

//IE5.5~8
var strangerUndefined = undefined;
undefined = 1;
console.log(typeof strangerUndefined === 'number') // true 

undefined在js中,全局属性是允许被覆盖的

    //undefined是window的全局属性
	console.log(window.hasOwnProperty('undefined')) // true
    console.log(window.undefined) // undefned
    // 当然可以对其重新赋值

旧版IE 可以改写undefined

在这里插入代码片//旧版IE
var undefined = '666'
console.log(undefined)//666 直接覆盖改写undefined

window.undefined在局部作用域中是可以被修改的

ES5中尝试解决上述问题,但是并没有彻底解决

在ES5开始,undefined就已经被设定为仅可读的,但是在局部作用域内,undefined依然是可变的

//window.undefined在局部作用域中是可以被修改的
    var testUndefined = function () {
    
    
        var obj = {
    
    }
        var undefined = 'underscore'
        var window = {
    
    
            'undefined': 'bb'
        }
        console.log(window)
        console.log(undefined) // underscore
        console.log(window.undefined) // bb
        console.log(obj.name === undefined) // false
        console.log(obj.name === window.undefined) // false
        console.log(obj.name === (void 0)) //true
    }
    testUndefined()

总结:
以上的栗子证明如果想要知道一个变量是否等于undefined的时候,判断不严谨,存在风险;undefined全局属性可以被修改,这样会导致判断undefined存在风险。

void 0

  1. void 是一元运算符: void 运算符对给定的表达式进行求值,然后返回undefined
  2. 语法:void expression
  3. 描述:这个运算符能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。void 运算符通常只用于获取 undefined的原始值,一般使用void(0)(等同于void 0)。在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值)
  4. void 后跟着表达式,表达式中的语句会全部执行
    在这里插入图片描述
    void 66+99没有加括号,代码从左到右执行,void 66 是 undefined—undefined + 99是NaN
  5. void 返回值永远是undefined
  6. void后面跟含有getter属性的函数,会进行调用执行语句,不会返回值
    var dd = {
    
    
        a: 66,
        get view() {
    
    
            console.log(this.a);
            return this.a++;
        }
    }
    var cc = void dd.view // 66  void 会执行计算
    cc // undefined
    dd.a // 67

最后总结 :为什么要用void 0 替代undefined

1、某些情况下用undefined判断存在风险,因undefined有被修改的可能性,但是void 0返回值一定是undefined

2、兼容性上void 0 基本所有的浏览器都支持

3、void 0比undefined字符所占空间少。

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/124898599
今日推荐