一、前言                                    

当使用coffeescript书写如下代码时 name = person?.name 会被预编译为 var name = typeof person !== "undefined" && person !== null ? person.name : void ; ,那么void 0到底是什么意思呢?运行得知void 0===undefined为true。那为什么不直接使用undefined而要使用void 0呢?而一元运算符void具体又有什么作用呢?下面将展开来说明。

二、为什么不直接用undefined                          

undefined在JavaScript中并不属于保留字/关键字,因此在IE5.5~8中我们可以将其当作变量那样对其赋值(IE9+及其他现代浏览器中赋值给undefined将无效)

var undefinedBackup = undefined;
undefined = ;
// 显示"undefined"
console.log(typeof undefinedBackup);
// 在IE5.5~8中显示"number",其他浏览器中则显示"undefined"
console.log(typeof undefined);

于是采用void方式获取undefined则成了通用准则。

三、一元运算符void的作用                         

void在ECMAScript 262规范如下:

The void Operator

The production UnaryExpression : void UnaryExpression is evaluated as follows:

  • Let expr be the result of evaluating UnaryExpression.
  • Call GetValue(expr).
  • Return undefined.

NOTE: GetValue must be called even though its value is not used because it may have observable side-effects.

void的行为特点为:

  1. 不管void后的运算数是什么,只管返回纯正的undefined;

  2. void会对其后的运算数作取值操作,因此若属性有个getter函数,那么就会调用getter函数(因此会产生副作用)

var article = {
_view: ,
get view(){
console.log(this._view);
return this._view++;
}
};
var test = void article.view; // 显示0
console.log(test); // 显示undefined
console.log(article._view); // 显示1

通过一元运算符 delete 作对比,delete的其中一个行为特点是不对其运算数进行取值操作(delete的其他行为特点比我们想的复杂得多,这里就不详细记录了)

var article = {
_view: ,
get view(){
console.log(this._view);
return this._view++;
}
};
var ret = delete article.view;
console.log(ret); // 显示true
console.log(article._view); // 显示0

四、还有啥方式可以得到纯正的undefined?                

除了通过一元运算符void获取纯正的undefined,其实我们还有如下方法来获取:

  1. 未赋值的变量

var myUndefined;
console.log(typeof myUndefined); // 显示"undefined"

  2. 未赋值的实参(和未赋值的变量同理)

var getUndefined = function(undefined){
return undefined;
};
var myUndefined = getUndefined();
// 或通过arguments获取
var getUndefined = function(){
return arguments[arguments.length];
};

3. 无返回值函数

var getUndefined = function(){};
var myUndefined = getUndefined();

  4. 未定义的属性

var myUndefined1 = {}[''];
var myUndefined2 = [][];

五、总结                              

一个小小的void和undefined就这么好玩,前端的世界还有很多事情要深入研究哦!!

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4146506.html^_^肥子John

六、参考                              

谈谈Javascript中的void操作符

JS魔法堂:从void 0 === undefined说起的更多相关文章

  1. JS魔法堂:LINK元素深入详解

    一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css&quo ...

  2. JS魔法堂:属性、特性,傻傻分不清楚

    一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...

  3. JS魔法堂:那些困扰你的DOM集合类型

    一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...

  4. JS魔法堂:追忆那些原始的选择器

    一.前言                                                                                                 ...

  5. JS魔法堂:不完全国际化&本地化手册 之 实战篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  6. JS魔法堂:IMG元素加载行为详解

    一.前言 在<JS魔法堂:jsDeferred源码剖析>中我们了解到img元素加载失败可以作为函数异步执行的优化方案,本文打算对img元素的加载行为进行更深入的探讨. 二.资源加载的相关属 ...

  7. JS魔法堂:jsDeferred源码剖析

    一.前言 最近在研究Promises/A+规范及实现,而Promise/A+规范的制定则很大程度地参考了由日本geek cho45发起的jsDeferred项目(<JavaScript框架设计& ...

  8. JS魔法堂:doctype我们应该了解的基础知识

    一.前言 什么是doctype?其实我们一直使用,却很少停下来看清楚它到底是什么,对网页有什么作用.本篇将和大家一起探讨那个默默无闻的doctype吧! 二.什么是doctype doctype或DT ...

  9. JS魔法堂:判断节点位置关系

    一.前言 在polyfill querySelectorAll 和写弹出窗时都需要判断两个节点间的位置关系,通过jQuery我们可以轻松搞定,但原生JS呢?下面我将整理各种判断方法,以供日后查阅. 二 ...

随机推荐

  1. 【源码分享】WPF漂亮界面框架实现原理分析及源码分享

    1 源码下载 2 OSGi.NET插件应用架构概述 3 漂亮界面框架原理概述 4 漂亮界面框架实现  4.1 主程序  4.2 主程序与插件的通讯   4.2.1 主程序获取插件注册的服务   4.2 ...

  2. [教程]怎么用百度云观看和下载"磁力链接"无需下载直接观看.

    1, 打开网址 http://okbt.net/  输入你想要看的电影名字, 点搜索,鼠标右键点击拷贝磁力链接.或者 电脑装了迅雷的话.可以直接点击.用迅雷下载. 磁力链接都是这种格式的.例: mag ...

  3. STC12C5A60S2笔记6(中断)

    1. 基本特性 1) 中断源 STC12C5A60S2共有十个中断源,每个中断源可设置4类优先级:当相同优先级下各中断优先级由高到低依次如下: 1.1)INT0(外部中断0) 中断向量地址 0003H ...

  4. 团队项目——站立会议 DAY8

    第八次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:在反复修改和审查后,处理功能模块代码出错处,完善并运行. 2.钟灵毓秀:再次检查代码,运行报错处的代码修改 ...

  5. java算法(一)

    最近在看各种经典算法,自己写起来: 一.判断素数问题: 知识点:素数即为质数,一个数n若不是质数则一定在2-n/2之间内有因数. package JingDian; public class sush ...

  6. ssh/openssh

    http://www.cnblogs.com/wwufengg/articles/ssh-openssh-detail.html http://www.cnblogs.com/jjkv3/archiv ...

  7. Vue API阅读的小细节

    #后面是表达式,下面是参数列表,参数列表每行说明一个参数.每行的参数说明,最后边对应表达式的参数,左边是该参数的类型一类的说明.

  8. javascript之-深入事件机制

    作者:yuyuyu链接:https://zhuanlan.zhihu.com/p/24620643来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.1 事件绑定的方式 ...

  9. DDD~Unity在DDD中的使用

    回到目录 上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控 ...

  10. MVVM架构~Knockoutjs系列之js接收C#数据集合的方式

    返回目录 在controller里将数据拿到,并且存储到ViewBag对象里,最后在View上显示出来,这是传统的MVC开发方式,事实上引入Knockoutjs以后,这种方式还是适合的,Knockou ...