JavaScript 中 undefined 的使用

定义

Undefined 是 JavaScript 中的一种基本数据类型,该类型有一个唯一值 undefined

6种基本类型: Undefined Null Number String Boolean Symbol

// typeof 操作符指示操作数的类型
typeof undefined; // "undefined"
typeof 2; // "number"

使用

通常情况下,使用 undefined 是指 window 对象下的 undefined 属性。
即在浏览器端使用 undefined 时,其实使用的是 window.undefined,而恰巧 window.undefined 的初始值为 undefined

如何证实使用 undefined 时,是使用 window.undefined , 而不是具体值 undefined

请看下面的例子:

null = 10; // 报错,因为不能给具体的值进行赋值操作
undefined = 11; // 不报错,因为 undefined 指的是 window 对象下的 undefined 属性
'undefined' in window; // true

如果还有怀疑,可以再举一个栗子:

"use strict";
undefined = 11; 
// Script snippet #1:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object '#<Window>'
// 严格模式下,给对象的只读属性赋值会报错

window.undefined 在 ES3 中可修改为任意值,但在 ES5 中是不可写、不可配置的属性,其值永远是 undefined

所以在全局环境下,如果 window 对象没有被覆盖,可以放心使用 undefinedwindow.undefined),因为它是不可修改的。

window.undefined 是不可修改的,但 window 对象是可修改的

let a;
a === undefined;         // true
a === window.undefined;  // true

// window.undefined 属性不可修改
window.undefined = 11;
window.undefined; // undefined

但是,在函数内部使用 undefined 可能并不可靠,虽然 undefined 是一种数据类型,但它并不是关键字,所以它可以作为标识符,例如:

(function () {
    let a;
     let undefined = '123';
     console.log(a === undefined); // false
     console.log(a); // undefined
     console.log(undefined); // 123
     console.log(window.undefined) // undefined
})()

正如之前所说,使用 window.undefined 也并不一定可靠,再看下面的例子:


function fun() {
   let undefined = 'hello world',
       f = {},
       window = {
           'undefined': 'abc'
       };
   console.log(undefined);// hello world
   console.log(window.undefined); //abc
   console.log(f.a === undefined); //false
   console.log(f.a === void 0); //true
}
fun();

可以看出,如果某段代码复写了 window 对象,在使用 undefined 时会出现一些问题,但总会有解决办法的。

例如 jQuery 源码里是这样是使用的:

// 自执行函数里定义了两个参数,但在调用时只传了一个参数,所以第二个参数 undefined 的值为 undefined
(function( window, undefined ) { 
    // 构造 jQuery 对象 
    var jQuery = (function() { 
        var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context, rootjQuery );
        };
         // 省略其他模块的代码
     }); 
     window.jQuery = window.$ = jQuery; 
 })( window );

underscore 源码里是这样是使用的:

// 无论 void 操作符后面的表达式是什么,其返回值都为 undefined
_.isUndefined = function(obj) {
    return obj === void 0;
};

赋值

给变量赋值为 undefined ,可以用以下几种方式:

  • 变量被声明了,但没有赋值时,该变量就等于 undefined

  • 调用函数时,应该提供的参数没有提供,该参数等于 undefined

  • 对象没有赋值的属性,该属性的值为 undefined

  • 函数没有返回值时,默认返回 undefined

  • 执行 void(0),返回值为 undefined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值