JavaScript 中你不知道的 undefined
undefined 既是一个原始数据类型,也是一个原始值数据
javascript
// undefined 全局对象上的一个属性 window.undefined
console.log(window.undefined) // undefined
不可写 writable: false
javascript
window.undefined = 1
console.log(window.undefined) // undefined
不可配置 configurable: false
javascript
delete window.undefined
console.log(window.undefined)
不可枚举 enumerable: false
javascript
for (var k in window) {
if (k === undefined) {
console.log(k)
}
}
var a
if ('a' in window) {
// true
console.log(true)
} else {
console.log(false)
}
不可重新定义
javascript
Object.defineProperty(window, 'undefined', {
enumerable: true,
writable: true,
configurable: true,
})
系统会给一个未赋值的变量自动赋值为 undefined,类型也是 undefined
在对未初始化的变量调用 typeof 时,返回的结果是"undefined",但对未声明的变量调用它时,返回的结果还是"undefined"
javascript
var a
console.log(a)
console.log(typeof a)
function test(a) {
console.log(typeof a)
return a
}
console.log(test())
typeof b
解释 JavaScript 中 "undefined" 和 "not defined" 之间的区别。
在 JavaScript 中,如果你试图使用一个不存在且尚未声明的变量,JavaScript 将抛出错误“var name is not defined”,让后脚本将停止运行。但如果你使用 typeof undeclared_variable,它将返回 undefined。
在进一步讨论之前,先让我们理解声明和定义之间的区别。
var x
表示一个声明,因为你没有定义它的值是什么,你只是声明它的存在。javascriptvar x // 声明 x console.log(x) // 输出: undefined
var x = 1
既是声明又是定义(我们也可以说它是初始化),x 变量的声明和赋值相继发生。在 JavaScript 中,每个变量声明和函数声明都被带到了当前作用域的顶部,然后进行赋值,这个过程被称为提升(hoisting)。当我们试图访问一个被声明但未被定义的变量时,会出现 undefined 错误。
javascriptvar x // 声明 console.log(typeof x === 'undefined') // 将返回 true
当我们试图引用一个既未声明也未定义的变量时,将会出现 not defined 错误。
javascriptconsole.log(typeof y) // undefined console.log(y) // 输出: ReferenceError: y is not defined
函数内部没有显示返回一个值的时候,系统默认给函数返回 undefined
javascript
function test() {
console.log(123)
}
console.log(test())
undefined 不是 JS 的保留字和关键字
javascript
function test() {
var undefined = 1
console.log(undefined) // 1
}
test()
void(0) ->对 0 进行求值 返回 undefined
javascript
var a, b, c
a = void ((b = 1), (c = 2))
console.log(a, b, c)
console.log(void 0 === window.undefined)
function test() {
var undefined = 1
console.log(undefined)
console.log(window.undefined === void 100)
console.log(undefined === void 0)
}
test()