[void 0]与[undefined]

今天刚开始学ts,看到TypeScript在处理函数的默认参数时,是先判断该参数是否存在(即是否是undefined),不存在的话则给它赋值。不过ts判断undefined并不是直接利用 target === undefined, 而是用void 0来替代undefined,这是为什么呢?

先来说结论: 是因为undefiend可能会被重写

我们得先来简单谈下undefined,它是标识符而非保留字,作为全局对象的一个属性,该属性的初始值表示基本数据类型值undefined,在ES5之前是可以给全局的undefined属性重新赋值,ES5规定将全局的undefined的值为只读

但是!尽管全局的undefined属性值不能再被修改,局部的undefined依旧是可以的,在函数内部申明一个新的undefined,它都是可以被赋值无论是不是在严格模式下

(function changeUndefined() {
  "use strict";
  console.log(undefined); // 全局的undefined,打印undefined
  var undefined = 10;
  console.log(undefined); // 局部的undefined变量,打印10
})()

(function changeUndefined() {
  "use strict";
  undefined = 10; // Uncaught TypeError: Cannot assign to read only property ‘undefined‘ of object ‘#<Window>‘, 非严格模式下不会报错
  // console.log(undefined);
  // var undefined = 10; 注释掉是因为var存在变量提升,否则上面那个修改的依旧是局部的undefined变量
  // console.log(undefined);
})()

那为什么void 0就可以了呢,看下MDN对void的简介

The void operator evaluates the given *expression* and then returns undefined.

原来void操作符的作用就是先执行表达式,然后返回undefined,无论表达式是什么都是返回undefined值

void另外一个作用是用作立即执行函数表达式(IIFE)

一个常见的IIFE
(function () {
    // do something
})()

void function fn() {
  console.log(‘be called‘)
  return 10;
}(); //执行fn函数,并返回undefined而非10

另外一种判断undefined的方法可以是typeof target === ‘undefined‘

总的来说用void来表示undefined既可以不用担心undefined的值会被重写,也可以省下几个字节还是挺不错的

MDN JavaScript标准库 void操作符

MDN JavaScript标准库 undefined

hanzichi underscore源码解读-为什么用[void 0 ]代替[undefined]

原文地址:https://www.cnblogs.com/guanine/p/9261150.html

时间: 2024-10-13 11:26:29

[void 0]与[undefined]的相关文章

void 0 或者 undefined

Problem 在检查一个值是否为undefined的时候,你们是如果去测试的? 要是之前的我会这样子测试 function isUndefined(obj){ return obj === undefined; } 但是最近在看<javascript框架设计>这本书的时候,他用了另外一种方法,我就有点纳闷了. function isUndefined(obj){ return obj === void 0; } 两者谁比较好点呢?如何比较呢?应该从它的适用性.浏览器兼容性来比较!然后我就在M

JavaScript中void 0和undefined

众所周知,Undefined是JS语言中的7大基本类型之一,表示未定义,它的值只有一个,就是undefined.任何变量在赋值前都是undefined. 1 typeof Undefined //"undefined" 而在一些框架源码中,会出现一些这样的表达式: if (context === void 0) return func; function foo() { var a = arguments[0] !== (void 0 ) ? arguments[0] : 2; ret

javascript 中 void 0的含义及undefine于void 0区别

undefined是一个全局属性,表示未定义或定义了没有赋值. void是一个一元运算符,不管传入什么参数都会返回undefined.  void操作符是在ECMAScript v1中定义的,而undefined是在ECMAScript v5中定义的. 我们知道undefined不是javascript的保留字,所以我们可以用undefined作为变量名.这时,我们定义的 undefined就会影响到使用undefined作为判断的地方.看下面例子: 测试了主流浏览器IE7-IE11.opera

【JS基础】JavaScript中的void 0

众所周知,Undefined是JS语言中的7大基本类型之一,表示未定义,它的值只有一个,就是undefined.任何变量在赋值前都是undefined. 而在一些框架源码中,会出现一些这样的表达式: if (context === void 0) return func; function foo() { var a = arguments[0] !== (void 0 ) ? arguments[0] : 2; return a; } if (array == null) return voi

javascript void 0替换掉不靠谱的 undefined

标识符 undefined 并不能真正反映 "未定义", 因为undefined 并不是JavaScript 保留词 JavaScript 提供了 void 运算符,该运算符会对指定的表达式求值,并返回受信的 undefined: void expression  通过以下运算来获得 undefined,表达式为 0 时的运算开销最小:void 0或者void(0); 1.在 underscore 中,所有需要获得 undefined 地方,都通过 void 0 进行了替代. 2 .引

javascript中argument1 === void 0的意思

今天看代码时看到 if (argument1 === void 0 || typeof argument1 === 'object') { 啥意思? 概述 void 运算符会对它的操作数表达式进行求值,然后忽略掉求值的结果,直接返回 undefined. 语法 void expression 描述 我们经常会在一个期望得到 undefined 返回值的地方使用 void 运算符,这样就可以忽略掉它后面的表达式的真实返回值.我们只去利用那个表达式执行时的副作用. 经常会有人用 void(0) 或者

a标签的href=&quot;javascript:void(0)&quot;和href=&quot;#&quot;的区别

好文要推:a标签的href="javascript:void(0)"和href="#"的区别 张鑫旭这篇文章也挺风趣的,作为一个轻微代码洁癖的程序员,该纠结时就纠结:是习惯还是规范!?   疑问:为什么要使用href="javascript:void(0);"? a 标签要写href属性!~有了href属性,天然鼠标手型,以及可以被键盘focus以及focus时候回车模拟点击行为(支持回车点击和默认可以获取焦点). href="#&qu

href=&quot;javascript:void(0)&quot;

自己亲自测了以下:<a href="javascript:void(0) " onclick="on(this)">链接</a>:先执行on函数,页面不动 <a href="#" onclick="on(this)">链接</a>:先执行on函数,回到顶部 <a href="https://www.baidu.com" onclick="on(

22.&quot;javascript:;&quot; 和 &quot;javascript:void(0)&quot; 有区别?

void 运算符会对给定的表达式进行求值,然后直接返回 undefined void 运算符通常只用于获取 undefined 的原始值,一般使用 void(0)(等同于 void 0).在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值). <script> console.log(void(console.log("OK"))); </script> 这段代码的运行结果为: OK undefined 一般我个人称 javascrip