js-undefined和void

特性

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

  1. 运算符

  2. 能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。

  3. 作用:

    1. 立即调用的函数表达式,立即执行,而不是函数声明
    void function iife() {
      console.log(1)
    }()
    // 等同于闭包function iife() {
      console.log(1)
    })()
    
    1. 常用于地址上阻止链接跳转
    <a href="javascript:void(0);">百度</a>
    <!-- 以前也用下面的写法-->
    <a href="javascript:;">百度</a>
    
    1. 函数箭头中避免泄露
    <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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值