关于 Undefined

关于 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 尚未定义值!
本作品采用《CC 协议》,转载必须注明作者和本文链接
CunWang@Ch