前言
本文讲述了 JavaScript 中 undefined的规范定义与一些场景下的小知识,以及 void()与的它的区别
什么是 undefined
undefined 既是一个原始数据类型,也是一个原始值数据
undefined 属性表示变量没有被赋值,或者根本没有被声明
undefined 是全局对象上的一个属性 window.undefined
undefined 四大不
不可写 writable:false
window.undefined == 1;
console.log(window.undefined); // undefined
不可配置 configurable:false;
delete window.undefined;
console.log(window.undefined);// undefined
不可枚举 enumerable:false
for(var k in window){
if(k === undefined){
console.log(k); //undefined
}
}
不可重新定义
Object.defineProperty(window,'undefined',{
enumerable:true,
writable:true,
configurable:true
// Cannot redefine property:undefined
})
作用域下的undefined
虽然全局作用域下的 undefined 是不可写,打印出来还是undefined,但是局部作用域下的 undefined 相对于一个变量,它在局部作用域下不被识别为JavaScript中的保留字与关键字
`全局`
window.undefined == 1;
console.log(window.undefined); // undefined
`作用域`
function test(){
var undefined = 1;
console.log(undefined);
}
test(); // 1
'use strict'
`严格模式下 函数内外也是如此`
未定义的undefined (小知识)
funny one
function test(a){
console.log(typeof a); //undefined
return a; //undefined
}
console.log(test());
log1: 形参没有传递相应的值 就为undefined
log2: 类型返回值 同为undefined
funny two
var a = null;
console.log(a == undefined); //true
console.log(a === undefined); //false
log1: null == undefined,因为 undefined 值是由 null 值派生而来的
log2: null !=== undefined, 因为严格判断undefined只等于本身
funny three
console.log(b); // b is not defined
console.log(typeof b); // undefined
log1: b未声明 报错
log2: 因为未声明未赋值 b类型为undefined
funny four
document.all == undefined //true
log1: 根据文档说明 document.all()可以查阅IE浏览器版本; 不为IE浏览器的其他浏览器,类型均为undefined。 ƪ(˘⌣˘)ʃ
funny five
var a;
if ('a' in window) {
console.log(true);
} else {
console.log(false);
} // true
log1: 虽然a的类型为undefined,但a并不在window中
void (expression)
void()不管输入什么 始终返回undefined
ps:void不会像 undefined 一样被局部作用域而改动,类型与返回值始终为undefined
funny one
var a,b,c;
a = void(b = 1,c =2);
console.log(a,b,c);
//log1:
log1: undefined 1 2;
funny two
<a href="JavaScript:void(0)"> or <a href="JavaScript:;">
log1: return: undefined
log2: 这种写法称为阻止 伪协议;也叫无效链
funny three
console.log(void(0) === window.undefined); // true
log1: void(0) 等同与 undefined
funny four(重点)
function test(){
var undefined = 1;
console.log(undefined); // 1
console.log(void(0) === void(999)); // undefined
console.log(undefined === void(0)); // false
}
test();
log1: undefined被声明为局部变量
log2: 不管 void() 数值多少 始终等于 undefined
log3: undefined 已为局部变量,值并不为 undefined
总结
- undefined 的禁忌规范 不可写,不可配置,不可枚举,不可重新定义
- 全局作用域下与局部作用域的
undefined - void的好处就是在需要定义undefined时候可灵活性比undefined本身要好
- 用
void(0)来代替undefined进行赋值更安全