javascript-void keyword

写在前面

ECMA-262定义了ECMAScript所支持的关键字(keyword),关键字不能用作ECMAScript程序的标识符(Indetifiers)。ECMA-262标准定义了以下关键字:

break do instanceof typeof
case else new var
catch finally return void
continue for switch while
debugger function this with
default if throw delete
in try

void

根据ECMA-262定义,void是javascript中的26个关键字之一,那么在javascript中void有什么用,和其他语言中的void有什么不一样呢。根据ECMA官方标准定义,void是一个一元操作符并返回undefined,无论表达式后面是什么。

在ECMA-262规范中有如下描述:

void后可以是任意表达式(UnaryExpression),返回值有且只有undefined:

注:不要写成void 1 + 1等这种形式,由于void比+优先级高,那就变成了(void 1) + 1

基本用法

1、void 0

依据ECMA-262规范,void运算符返回并且只返回undefined,由于undefined在ECMA-262官方标准中既不是关键字也不是保留字,它可以作为变量名被赋值,因此undefined有可能作为变量被覆盖,所有使用void 0代替undefined就成了常用的方法。

function joke() {
var undefined = "hello world";
console.log(undefined); //会输出"hello world"
} var property = function (key) {
return function (obj) {
return obj == null ? void 0 : obj[key];
};
};

2、javascript:void(0)

可以用javascript:void(0),来阻止链接默认的跳转行为,下面是MDN文档的示例:

<a href="javascript:void(0);">Click here to do nothing</a>

<a href="javascript:void(alert('hello word!'))">Click me!</a>

注:无论void(UnaryExpression)延伸出多少种用法,其本质就在于执行UnaryExpression并返回undefined这一点。

疑问

回到void的ECAM-262官方标准定义处,既然void的返回值永远是undefined,那么为什么还需要调用GetVale(expr)。其实void设计来实现执行后边的表达式并忽略表达式结果返回undefined,如果表达式的结果是一个Reference,并没有进行取值,而取值这个过程有可能有副作用(side-effect),所以要多一个GetValue步骤。

参考

ECMAScript 5.1
MDN

javascript-void keyword的更多相关文章

  1. [Javascript] Avoid Accidental Returns of New State by using the void Keyword

    For example we have a 'useState' function, which takes a state and a function to update the state: c ...

  2. js中 javascript:void(0) 用法详解

    点击链接不做任何事情: <a href="#" onclick="return false">test</a> <a href=& ...

  3. html 空链接 href="#"与href="javascript:void(0)"的区别

    #包含了一个位置信息 默认的锚是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#但跳动到了页首 而javascrip ...

  4. a href=#与 a href=javascript:void(0) 的区别

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...

  5. href使用 javascript:;与javascript:void(0)防跳到顶部

    有时候我们在编写js过程中,需要触发事件而不需要返回值,那么就可能需要这样的写法   href=”#”,包含了一个位置信息.默认的锚是#top,也就是网页的上端,当连续快速点击此链接时会导致浏览器巨慢 ...

  6. javascript:void(0)

    这是不是一个设计缺陷呢 void(0)这种用法巧妙利用void关键字的特性返回undefined(且没有副作用).因为不是关键字,比如直接使用undefined,内容可能被改写. 再来看为啥使用0,而 ...

  7. <a href=”#”>与 <a href=”javascript:void(0)” 的区别

    <a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...

  8. 超级链接a中javascript:void(0)弹出另外一个框问题

    转字:http://my.oschina.net/castusz/blog/68186 结果在IE.Firefox.Chrome都是先执行的onclick事件,在项目中我们尽量不要同时使用这两种方式. ...

  9. javascript:void(0) ,设置a链接无效,设置点击a页面不刷新,不跳动

    http://www.cnblogs.com/opper/archive/2009/01/12/1373971.html 我想使用过ajax的都常见这样的代码: <a href="ja ...

  10. IE6与 javascript:void(0)

    遇到过几次这种问题,现在总结一下. 代码: <a onclick="window.location.href='http://www.google.com'" href=&q ...

随机推荐

  1. Android ListView批量选择(全选、反选、全不选)

    APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? ...

  2. css3 word-wrap属性

    允许长单词换行到下一行: word-wrap:break-word

  3. 详解ThinkPHP支持的URL模式有四种普通模式、PATHINFO、REWRITE和兼容模式

    URL模式     URL_MODEL设置 普通模式    0 PATHINFO模式     1 REWRITE模式     2 兼容模式     3 如果你整个应用下面的模块都是采用统一的URL模式 ...

  4. ajax上传文件 基于jquery form表单上传文件

    <script src="/static/js/jquery.js"></script><script> $("#reg-btn&qu ...

  5. Python--day66--内容回顾

    3,python中的大小比较和js中的大小比较规则: python中a>b>c,就是先比较a>b,然后再比较b>c,都为true的话就返回true: js中的a>b> ...

  6. vector容器、

    一.  vector  向量容器1. 创建   vector  对象(1)不指定容器大小vector<int> V;(2)指定容器大小vector<int> V(10);(3) ...

  7. POJ 2488 深搜dfs、

    题意:模拟国际象棋中马的走棋方式,其实和中国象棋的马走的方式其实是一样的,马可以从给定的方格棋盘中任意点开始,问是否能遍历全部格子,能的话输出字典序最小的走棋方式,否则输出impossible 思路: ...

  8. hadoop的6个进程启动不全,请试 比如datanode没有启动

      赋给hadoop用户hadoop-1.2.1读写权限 [root@master usr]# chown -R hadoop121:hadoop121 hadoop-1.2.1/   折腾了两个小时 ...

  9. 2018-8-10-如何入门-C++-AMP-教程

    title author date CreateTime categories 如何入门 C++ AMP 教程 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...

  10. java TCP传输

    两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流.该流中既有读取,也有写入. tcp的两个端点:一个是客户端,一个是服务端. 客户端:对应的对 ...