關於 Undefined

村望老弟發表於2021-11-29

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

相關文章