特性
undefined:只读,不可配置,不可重写。
虽然在全局中重写会被报错,然而,在函数中:
let undefined = 1
// Uncaught SyntaxError: Identifier 'undefined' has already been declared
// But
function testUndefined(){
let undefined = "666";
console.log(undefined); // "666"
}
这是因为,undefined不是一个保留字,它挂在window下,即window.undefined
。
undefined 不仅仅是一种原始数据类型, 它还是全局属性,undefined 表示原始值undefined。
也就是说它是可以被改变的。
But,这里可以使用void 0 来解决undefined可能被改写的问题。参考-源码学习之void 0
第二个知识点是:使用void 0可以优化代码,同样是返回undefined,但在判断的时候,undefined是需要取window下作查找的,这里就会增加查找时间。而使用void 0是直接运行表达式,速度更快。
第三个知识点是void 0 字节占用比undefined更小,这样可以在库里面减少整体代码量,使包体积更小。
function testUndefined(){
let undefined = "666";
console.log(undefined); // "666"
console.log(void 0); // undefined
// 可以用来这样做
if(text === void 0) text = ''
// 极致吝啬的古老程序员思想,那时候空间很宝贵。
// 6个字节,用void 0代替undefined能节省3个字节,优化小技巧get(v)
}
猫咪好奇眼:那null也可以吗?
function testNull(){
let null = '111'
// Uncaught SyntaxError: Unexpected token 'null'
console.log(null)
}
值 null 是一个字面量,不像 undefined,它不是全局对象的一个属性。参考-null
null布尔运算中是false。
另外,注意到一个点
typeof null // "object" (因为一些以前的原因而不是'null')
未定义返回值'undefined'
字符串
看个例子:
function test(a){
console.log(typeof a); // undefined, 这是类型
return a;
}
test(); // 返回"undefined", 这是字符串
原文:
一个没有被赋值的变量的类型是undefined。如果方法或者是语句中操作的变量没有被赋值,则会返回
undefined
修正:
一个没有被赋值的变量的类型是undefined。如果方法或者是语句中操作的变量没有被赋值,则会返回undefined字符串
另外:一个函数如果没有使用return语句指定返回值,就会返回一个undefined字符串值
。
判断
typeof v === ‘undefined’ // 记住是字符串,以后别再想是类型判断了
// 这里没有声明y
if(typeof y === 'undefined') { // 没有错误,执行结果为true
console.log("y is " + typeof y ) // y is undefined
}
if(y === undefined) {// ReferenceError: y is not defined
}
推荐使用 void 0
来替代 typeof v === 'undefined'
的做法
void
-
运算符
-
能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。
-
作用:
- 立即调用的函数表达式,立即执行,而不是函数声明
void function iife() { console.log(1) }() // 等同于闭包 (function iife() { console.log(1) })()
- 常用于地址上阻止链接跳转
<a href="javascript:void(0);">百度</a> <!-- 以前也用下面的写法--> <a href="javascript:;">百度</a>
- 函数箭头中避免泄露
<a href="javascript:void 0;" id="link">click me</a> <script> let link = document.getElementById('link') var a = undefined setTimeout(() => { a = 1 }, 3000); link.onclick = () => void function() { console.log(a) } </script>
确保返回undefined,从而阻止了点击事件,而不会一直执行函数去返回 undefined。可在浏览器查看效果。
ps:这个泄露验证不出来T T
相关知识点:undefined, null, void