关于 Undefined
undefined
本质
undefined
是一个原始数据类型,也是一个原始值数据
undefined
是window
对象上的一个属性
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
对象上的
然鹅,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
当作变量哈哈哈哈!
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 尚未定义值!