JS undefined

🌙
手机阅读
本文目录结构

全局属性 undefined 表示原始值 undefined。它是一个 JavaScript 的 原始数据类型 。

undefined 属性的属性特性:

writable | false enumerable | false configurable | false

语法

undefined

描述

undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。

undefined 的最初值就是原始数据类型undefined

在现代浏览器(JavaScript 1.8.5/Firefox 4+),自 ECMAscript5 标准以来 undefined 是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。即便事实并非如此,也要避免去重写它。

一个没有被赋值的变量的类型是 undefined。如果方法或者是语句中操作的变量没有被赋值,则会返回 undefined

function test(a){
    console.log(typeof a);    // undefined
    return a;
}

test();                       // 返回"undefined"

一个函数如果没有使用 return 语句指定返回值,就会返回一个 undefined 值。

但是它有可能在非全局作用域中被当作标识符(变量名)来使用(因为 undefined 不是一个保留字)),这样做是一个非常坏的主意,因为这样会使你的代码难以去维护和排错。

// 不要这样做!

// 打印 'foo string' PS:说明undefined的值和类型都已经改变
(function() {
var undefined = 'foo';
console.log(undefined, typeof undefined)
})()

// 打印 'foo string' PS:说明undefined的值和类型都已经改变
(function(undefined) {
console.log(undefined, typeof undefined)
})('foo')

示例

严格相等和 undefined

你可以使用 undefined 和严格相等或不相等操作符来决定一个变量是否拥有值。在下面的代码中,变量 x 是未定义的,if 语句的求值结果将是 true

var x;

if (x === undefined) {
// 执行这些语句
} else {
// 这些语句不会被执行
}

注意:这里是必须使用严格相等操作符(===)而不是标准相等操作符(==),因为 x == undefined 会检查 x 是不是 null,但是严格相等不会检查(有点饶人,其实 === 会严格判断双方的类型、值等是否相等)。null 不等同于 undefined。移步比较操作符查看详情。

Typeof 操作符和 undefined

或者,可以使用 typeof:

var x;
if(typeof x === 'undefined') {
    // 执行这些语句
}

使用 typeof 的原因是它不会在一个变量没有被声明的时候抛出一个错误。

// 这里没有声明y
if(typeof y === 'undefined') {       // 没有错误,执行结果为true
   console.log("y is " + typeof y )  // y is undefined
}

if(y === undefined) {                // ReferenceError: y is not defined

}

但是,技术方面看来这样的使用方法应该被避免。JavaScript 是一个静态作用域语言,所以,一个变量是否被声明可以通过看它是否在一个封闭的上下文中被声明。唯一的例外是全局作用域,但是全局作用域是被绑定在全局对象上的,所以要检查一个变量是否在全局上下文中存在可以通过检查全局对象上是否存在这个属性(比如使用 in 操作符)。

Void 操作符和 undefined

void 操作符是第三种可以替代的方法。

var x;
if(x === void 0) {
    // 执行这些语句
}

// 没有声明y
if(y === void 0) {
    // 抛出一个RenferenceError错误(与`typeof`相比)
}

规范

Specification Status Comment
ECMAScript 1st Edition (ECMA-262)
undefined
Standard Initial definition. Implemented in JavaScript 1.3.
ECMAScript 5.1 (ECMA-262)
undefined
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
undefined
Standard
ECMAScript Latest Draft (ECMA-262)
undefined
Draft

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了