资讯专栏INFORMATION COLUMN

void关键字有个毛用?

sherlock221 / 2070人阅读

摘要:如果你有印象,甚至是中的个关键字之一,根据官方标准,它是一个一元操作符,它的唯一作用就是返回一个,不管这个操作符后面传的操作数是什么。关于数组中的,还有一些很奇怪的地方,比如,如何区分下面这两个数组中的各项是不是相同下次再说。

恩,这是个问题。如果你有印象,void甚至是js中的26个关键字之一,根据ECMA官方标准,它是一个一元操作符,它的唯一作用就是返回一个undefined,不管这个操作符后面传的操作数是什么。
在标准里对void的执行细节是这么说的:

  

Let expr be the result of evaluating UnaryExpression.--》把表达式的值赋给expr;

Call GetValue(expr).--》调用expr的内部函数获取它的值;

Return undefined. --》返回undefined

这有点像那个很有意思的笑话:

  

客官你吃啥?
啊,我要一碗牛肉面,面给我多煮会少放点葱多放点辣肉给我放多一点汤给我多盛点。
哦,一碗牛肉面。

void可以像下面这样使用:

javascriptvoid 0;
void "you are useless?";
void false;
void [];
void /(useless)/ig;
void function(){ console.log("you are so useless?"); }
//... always return undefined

后面可以是任何表达式,返回的永远是undefined!很明显,在你想获得undefined的时候,可以用这个操作符。通常有如下使用场景:

一、Javascript URIs
html
  Click here to do nothing



  Click here for green background

这是MDN文档中给出的例子,我之前看到不少远古时代的网页应用这样的写法,就是直接在a标签的href属性里写js代码,比如link,这样写跟link的区别是后者在点击的时候页面会跳到最顶部去,如果这不是你要的效果一定要注意;在href里写javascript:void(0);则可以避免上述问题。

不过现在这样写javascript:是不提倡的。

二、用于闭包避免解析错误

你们一定已经看到过闭包的这种写法:

javascript!function fn(){
  console.log("I will show immediately.")
}()

上述这段代码中的!可以换成其他操作符,比如+-~,加上这些前缀的作用是避免js解析器讲函数体解析为函数声明。

  

解析器在遇到代码function fn(){ /*...*/}时会把这解析成函数声明,在函数声明后面再跟着一对括号会产生语法错误,前面加上一个操作符,解析器就会把这段代码当成函数表达式,从而可以顺利执行。

在前面这个场景中,这个操作符也可以用void,效果与上述代码一致。

javascriptvoid function fn(){
  console.log("I will show immediately.")
}()

那么问题是,为什么不直接使用undefined这个值的字面量形式呢?
我在stackoverflow上找到一个解释:
因为undefined既不是保留字,也不是关键字,它可以作为变量标识符赋值,所以你手写出来的undefined有可能被覆盖的!比如:

javascriptvar undefined="oops";
alert(undefined);

上述代码在一些原始社会的浏览器中会成功弹出oops,说到原始社会的浏览器,我们来试试IE吧。经过测试,这段代码在IE9以下的浏览器中真的会弹出oops! oops! 你也可以试试。
不过,在现代浏览器中,已经不能这么做了,仍然可以给undefined赋值,但这个是无效的。试试跟undefined很类似的null,给它赋值就会报错。

所以,当我们要获得真正的undefined值的时候,用void操作符吧。void后面可以是任何操作数(注意:如果后面没有操作数也会报错的),那使用时用什么呢?良心推荐还是写void 0吧,毕竟这是最简短的。

关于数组中的undefined,还有一些很奇怪的地方,比如,如何区分下面这两个数组中的各项是不是相同:

javascriptvar arr1=[1,2,undefined,4];
var arr2=[1,2,,4];
arr1[2]===arr2[2]; //true

下次再说。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85782.html

相关文章

  • 【Vue原理】VModel - 源码版 之 select 详解

    摘要:写文章不容易,点个赞呗兄弟专注源码分享,文章分为白话版和源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于版本如果你觉得排版难看,请点击下面链接或者拉到下面关注公众号也可以吧原理源码版之详解今天我们来看看处 写文章不容易,点个赞呗兄弟专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于 ...

    lsxiao 评论0 收藏0
  • 你造 Promise 就是 Monad 吗

    摘要:但有时候,所有的鸟都会想要停在同一边,皮尔斯就失去了平衡,就会让他从钢索上掉下去。我们这边假设两边的鸟差异在三个之内的时候,皮尔斯仍能保持平衡。 Monad 这个概念好难解释, 你可以理解为一个 Lazy 或者是状态未知的盒子. 听起来像是薛定谔猫(估计点进去你会更晕了). 其实就是的, 在你打开这个盒子之前, 你是不知道里面的猫处在那种状态. Monad 这个黑盒子, 里面到底卖的神...

    张率功 评论0 收藏0
  • 【Copy攻城狮日志】聊聊JavaScript heap out of memory

    摘要:当时,如果老生区大小超过设定的值时,就会报错。一般是无限制增长的数组无限制设置属性和值大循环等出处林小新。这部分由于攻城狮并为深入,可以参考如何定位的内存泄漏内存泄漏以及定位 showImg(https://segmentfault.com/img/bVbnysD?w=649&h=658);↑开局一张图,故事全靠编↑ 从一次宕机说起 这是一个很狗血的故事,故事的开头是一个项目,这个项...

    paulquei 评论0 收藏0
  • 我是如何获取到前端用户的IP,并根据IP来获取地理定位的

    摘要:故事的经过是这样的有一天,产品同学突发奇想,他想获取到下单用户的地理位置分布,以便来统计用户群的分布,进而为后期的按地区精确推广活动来做准备。 大家好,我是冰茶,容我开场先讲个故事。故事的经过是这样的: 有一天,产品同学突发奇想,他想获取到下单用户的地理位置分布,以便来统计用户群的分布,进而为后期的按地区精确推广活动来做准备。 me:这个简单啊,下单的时候,给个地理定位的请求,来获取...

    CastlePeaK 评论0 收藏0
  • 人人都会设计模式:代理模式--Proxy

    摘要:话说谁还干类似的事,就在文章末尾点个赞代销店等其实就是现在的商店,以前小的时候听家乡人叫代销店,也是一种代理模式。可以说是系统中最重要的架构之一。 showImg(https://segmentfault.com/img/remote/1460000012278678?w=1240&h=469); PS:转载请注明出处作者: TigerChain地址: http://www.jians...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<