为什么使用void 0代替undefined?

  在很多框架的源码以及webpack打包出来的bundle.js中,我们都可以看到void 0的身影,如下:

function generateRandomKey() {
var key = void ;
while (key === undefined || seenKeys.hasOwnProperty(key) || !isNaN(+key)) {
key = Math.floor(Math.random() * MULTIPLIER).toString();
}
seenKeys[key] = true;
return key;
}

  

module.exports = function shallowEqual(objA, objB, compare, compareContext) {

    var ret = compare ? compare.call(compareContext, objA, objB) : void ;

    if(ret !== void ) {
return !!ret;
}

  在浏览器中运行,可以发现,void 0的返回值就是undefined,即通过这种方式将某个变量赋值为 undefined,但是为什么不直接赋值呢? 为什么需要使用 void 0 这种方式呢?我认为有以下几点原因:

  • 在IE中,直接给变量赋值为undefined后,这个变量还可以重写,但是chrome等浏览器不会。
  • 在chrome下的某个全局变量直接赋值为undefined,不会被重写,但是在局部作用域中如何也被赋值为 undefined,那么这个值还可以被重写。
  • void 0在大量使用的时候,一定会比 undefined 所占用的字节少。

类型判断的常用方法

  比如判断数组可以使用下面的方法:

function isArray(a) {
Array.isArray ? Array.isArray(a) : Object.prototype.toString.call(a) === '[object Array]';
}

  其中 Array.isArray() 方法是ES5内置的判断数组的方法,如果支持就使用;如果不支持,就使用通用的 Object.prototype.toString.call() 。 因为前者更为简洁,效率更高,后者更为通用。

  

  当判断对象时,我们可以认为function也是对象,但是null一般需要排除掉,那么判断的方式可以是下面这样的:

_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};

   可以看到,比较通用的方式就是使用 typeof,之所以数组不这么使用,是因为数组使用 typeof 得到的也是对象,所以才需要通过一些其他方法。

   类似的,如果我们希望判断  'Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'  这些类型时,也都可以通过使用 Object.prototype.toString.call() 这种比较通用的方式进行判断,使用understore的方式如下:

_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});

  其中,_each就是underscore中对each方法的一个封装,而toString.call()实际上就是Object.prototype.toString.call()方法。

  而在IE9以下的浏览器中,对于argument我们得到的时[object Object],所以,我们还需要再添加一层判断,就是是否具有callee属性。

  

  另外,如果我们希望判断DOM元素时,只需要知道这个元素不是空的,并且其nodeType为1即可,如下所示:

_.isElement = function(obj) {
return !!(obj && obj.nodeType === );
};

  

  

   那么如何判断NaN类型呢? 通过Object.prototype.toString.call(),我们可以判断出来NaN类型得到的时[object Number], 而NaN又是Number中唯一一个自己不等于自己的数,所以:

isNaN = function(obj) {
return _.isNumber(obj) && obj !== +obj;
};

  另外我们是可以首先判断是否支持 isNaN() 方法,如果支持,就可以先用 isNaN 来判断,然后再使用上面的方法。

  

  

underscore相关记录的更多相关文章

  1. [Android学习笔记]理解焦点处理原理的相关记录

    焦点处理相关记录 以下所涉及的焦点部分,只是按键移动部分,不明确包含Touch Focus部分 需解决问题 控件的下一个焦点是哪? 分析思路 当用户通过按键(遥控器等)触发焦点切换时,事件指令会通过底 ...

  2. 关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset)

    关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset) 2018-01-22  21:49:17 ...

  3. Linux系列笔记 - vim相关记录

    一.常用到的vim命令 这里只简单记录常用到的命令,后面会有自己记录的命令,但有些可能不常用. 常规模式: gg 跳到文件头 shift+g 跳到文件尾 行数+gg 跳到指定行 如:123gg 跳到1 ...

  4. web app 相关记录

    今天在手机浏览器上运行cocos2d-html5的sample, crystalcraze运行起来只有10~20帧, moonwarrior只有20~30帧,很不理想的数据: 记录下几个web app ...

  5. UnderScore.jsAPI记录

    Collection Functions (Arrays or Objects) each         _.each(list, iterator, [context]) 遍历list中的所有元素 ...

  6. quartz相关记录

    1.http://www.quartz-scheduler.org/api/2.3.1-SNAPSHOT/ api地址 2.https://www.jianshu.com/p/3c3e166a7da1 ...

  7. Jexus使用的相关记录

    前言 本文是零零散散的记录,部分内容是我在平时工作中用到的,部分是从群里"偷"来的,所以难免会有一些错误. 主要还是希望能帮到部分使用Jexus的朋友. 安装 curl https ...

  8. powerdesigner相关记录

    背景 项目逐步开始规范化,表设计直接用designer来,然后生成语句,到oracle数据库,把相关的操作等记录一下, designer版本:15.1 oracle版本:11.2,64位 oracle ...

  9. git使用相关记录

    上传github操作记录:https://blog.csdn.net/pql925/article/details/72772660 git提交仓库相关:https://blog.csdn.net/M ...

随机推荐

  1. Web图片编辑控件开发文档-Xproer.ImageEditor

    版权所有 2009-2014 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com 产品首页:http://www.ncmem.com/webplug/image-e ...

  2. ZOJ3696 Alien's Organ 2017-04-06 23:16 51人阅读 评论(0) 收藏

    Alien's Organ Time Limit: 2 Seconds      Memory Limit: 65536 KB There's an alien whose name is Marja ...

  3. Opengl的TOOL收集

    1. http://my.oschina.net/sweetdark 不错的opengl学习网站 2, 优秀博客 网址: http://www.zwqxin.com/archives/opengl/s ...

  4. C# defualt关键字默认值用法

    默认值表达式生成类型的默认值. 默认值表达式在泛型类和泛型方法中非常有用. 使用泛型类和泛型方法时出现的一个问题是,如何在无法提前知道以下内容的情况下将默认值赋值给参数化类型 T: T 是引用类型还是 ...

  5. Visual Studio效率神器——超级扩展ReSharper安装和破解

    Visual Studio效率神器--超级扩展ReSharper安装和破解   ReSharper的使用方法网络上有文章Resharper安装和破解极其简单,2分钟就搞定了.安装ReSharper官方 ...

  6. Jenkins+.Net Core+Git集成发布 - SkyMallCore快速开发平台

    准备工作:安装 Jenkins+java 直接百度安装,在此忽略 dotnet sdk(iis部署已经安装) 一:windows 部署到IIS 首先搭建IIS,站点应用程序池选择 ‘无托管代码’ 安装 ...

  7. C#获取图片扩展名

    代码: private string GetImageExtension(MemoryStream ms) { try { Image image = Image.FromStream(ms); if ...

  8. 手动开发PHP模板引擎 一 (35)

    模板叫做TPL,模仿于smarty模板引擎. 我们所说的模板是Web模板,是主要由HTML标记组成的语言来编写的页面,但也有如何表示包含动态生成内容的方式(解析标签).模板引擎是一种软件库,允许我们从 ...

  9. .Net开发工程师笔试试题

    第一部分[数据库技能] 附上自己做的答案,提出不足之处 现在有一个SQL Server 2000版本的数据库,里面包含有三个表Info.InfoReply.User,分别表示信息.信息评论和用户表,包 ...

  10. CentOS7.x安装时的分区方案

    -------------------------------------------------分区方案描述--------------------------------------------- ...