为什么使用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. 20155308 2016-2017-2 《Java程序设计》第8周学习总结

    20155308 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO(New IO)-from JDK1.4 NIO2 -fr ...

  2. C#基础入门 七

    C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...

  3. 生成Webservice的两种方式(Axis2,CXf2.x)

    一天之中,用了各种方式生成webservice,就是为了node.js能和程序顺利通信.最终还是用axis2成功了.工作基本完成了,现在可以总结一下. 关于生成方式,推荐使用eclipse,比较方便, ...

  4. WebApi 插件式构建方案:重写的控制器获取工厂

    body { border: 1px solid #ddd; outline: 1300px solid #fff; margin: 16px auto; } body .markdown-body ...

  5. 热更新(一) 之Lua语法的学习

    热更新 如热更新果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好).热更新可以在不重新下载客户端的情况下,更新游戏的内容 ...

  6. sharepoint database 操作

    select *from [dbo].[AllLists] where tp_Title='Pages' and tp_WebId='90511126-E1FE-4E4C-8DDF-74DFC89E8 ...

  7. Dapper.Contrib.Extensions问题

    Dapper.Contrib.Extensions问题 Dapper.Extension.1.0.0.1\lib\net45\Dapper.Extension.dll Dapper.Contrib.1 ...

  8. BEAUTIFUL

    DESCRIPTION:一个长度为n 的序列,对于每个位置i 的数ai 都有一个优美值,其定义是:找到序列中最长的一段[l, r],满足l<i<r,且[l, r] 中位数为ai(我们比较序 ...

  9. [php审计实战篇]BlueCms v1.6 Union注入

    非常基础的代码审计练习,适合有php基础的审计新手练习 本文作者:Aedoo 来源:i春秋社区 0×01 代码跟踪 首先,进入首页代码 :index.php 包含了php文件:/include/com ...

  10. 查看npm全局安装位置

    查看npm全局安装位置:npm config get prefix 设置位置:npm config set prefix 填写位置