JS魔法堂:从void 0 === undefined说起-阿里云开发者社区

开发者社区> 小麋鹿666> 正文

JS魔法堂:从void 0 === undefined说起

简介:
+关注继续查看

一、前言                                    

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

 

二、为什么不直接用undefined                          

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

复制代码
var undefinedBackup = undefined;
undefined = 1;
// 显示"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: 0,
    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: 0,
    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 = [][0];

 

五、总结                              

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

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

 

六、参考                              

谈谈Javascript中的void操作符

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

posted @ 2014-12-05 16:22 ^_^肥仔John 阅读(5880) 评论(2) 编辑 收藏
  
#1楼 2016-12-20 09:37 b4b4  
get 新技能

var article = {
_view: 0,
get view(){
console.log(this._view);
return this._view++;
}
};

是时没懂

var article = {
_view: 0,
get view(){
console.log(this._view);
return this._view++;
}
};

get 是什么作用?

对象一般不是这种方式么?
{a:1}
  
#2楼[楼主]36223862017/2/20 16:32:30 2017-02-20 16:32 ^_^肥仔John  
@ b4b4
ES5特性的getter
http://pic.cnblogs.com/face/347002/20141205140116.png

公告

本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/p/4146506.html,如需转载请自行联系原作者
 
 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4111 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
7208 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4557 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5508 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
641 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3454 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
1151 0
+关注
385
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载