Undefined
是 JavaScript 中的一种基本数据类型,该类型有一个惟一值 undefined
。javascript
6种基本类型:
Undefined
Null
Number
String
Boolean
Symbol
java
// typeof 操做符指示操做数的类型 typeof undefined; // "undefined" typeof 2; // "number"
一般状况下,使用 undefined
是指 window
对象下的 undefined
属性。
即在浏览器端使用 undefined
时,其实使用的是 window.undefined
,而恰巧 window.undefined
的初始值为 undefined
。浏览器
如何证明使用 undefined
时,是使用 window.undefined
, 而不是具体值 undefined
。函数
请看下面的例子:code
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
。ip
因此在全局环境下,若是 window
对象没有被覆盖,能够放心使用 undefined
(window.undefined
),由于它是不可修改的。underscore
window.undefined
是不可修改的,但window
对象是可修改的源码
let a; a === undefined; // true a === window.undefined; // true // window.undefined 属性不可修改 window.undefined = 11; window.undefined; // undefined
可是,在函数内部使用 undefined 可能并不可靠,虽然 undefined 是一种数据类型,但它并非关键字,因此它能够做为标识符,例如:it
(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
;