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