你不知道的undefined

516 阅读2分钟

前言

本文讲述了 JavaScript 中 undefined的规范定义与一些场景下的小知识,以及 void()与的它的区别

什么是 undefined

undefined 既是一个原始数据类型,也是一个原始值数据

undefined 属性表示变量没有被赋值,或者根本没有被声明

undefined 是全局对象上的一个属性 window.undefined

undefined 四大不

  1. 不可写 writable:false
window.undefined == 1;
console.log(window.undefined); // undefined
  1. 不可配置 configurable:false;
delete window.undefined;
console.log(window.undefined);// undefined
  1. 不可枚举 enumerable:false
for(var k in window){
  if(k === undefined){
    console.log(k);  //undefined
  }
}
  1. 不可重新定义
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进行赋值更安全