关于 Undefined

JavaScript/前端
564
0
0
2022-07-30

关于 Undefined

undefined本质

undefined是一个原始数据类型,也是一个原始值数据

undefinedwindow对象上的一个属性

image-20211129141128516

undefined不可写

/*
    window.undefined 不可写(writable=false)
*/
window.undefined = 1
console.log(window.undefined) //undefined

undefined不可配置

/*
    undefined`不可配置 configurable=false
*/
delete window.undefined 
console.log(window)
console.log(window.undefined)

你会发现window上还是有undefined这个属性

undefined不可枚举

let enumTheUndefinedFlag = false //是否有枚举到undefined
for(let key in window){
    if(key===undefined){
        enumTheUndefinedFlag = true
    }
}
console.log(enumTheUndefinedFlag) //false

undefined属性不可被重新定义

/*
   ❌ERROR: Uncaught TypeError: Cannot convert undefined or null to object at Function.defineProperties
*/
Object.defineProperties(window,undefined,{
    writable:true,
    enumerable:true,
    configurable:true
})

undefined在全局和局部的使用

首先 undefined 不是javascript的保留字或者关键字
var undefined = 1
console.log(undefined) //undefined

上面代码在全局定义了一个undefined变量值为1,但是本质上使用var在全局定义的变量终究是绑定在window对象上的

image-20211129144157305

​ 然鹅,Windows.undefined是不可写的,所以值不会变

你用const,let在全局声明undefined只会报错,因为全局作用域已经存在了undefined

有了上面的知识,应该就能猜到,undefined在局部作用域应该是可以当作变量名的

function scoped(){
    let undefined = 1 
    console.log(undefined) //1 
    return undefined;
}
console.log(scoped()); //1

扩展 void

void(x:any)return undefined

console.log(void(0)===undefined)  //true

局部作用域,为什么有些人常用 void(0)当作undefined,因为不知道这个作用域会不会有人用undefined当作变量哈哈哈哈!

img

function scoped(){
    let a
    const b = 1 
    const undefined = 2 
    if(a===undefined){
        console.log("a 尚未定义值!")
    }else{
        console.log("a 定义值了!")
    }
}
scoped() //a 定义值了!

是不是就有点蛋疼了~,但是你用void(x:any)就没有问题啦!

function scoped(){
    let a
    const b = 1 
    const undefined = 2 
    if(a===void(0)){ //或者用window.undefined也是可以的! 
        console.log("a 尚未定义值!")
    }else{
        console.log("a 定义值了!")
    }
}
scoped() //a 尚未定义值!