underscore.js源码研究(4)
概述
很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以就了结研究underscore源码这一心愿吧。
underscore.js源码研究(1)
underscore.js源码研究(2)
underscore.js源码研究(3)
underscore.js源码研究(4)
underscore.js源码研究(5)
underscore.js源码研究(6)
underscore.js源码研究(7)
underscore.js源码研究(8)
参考资料:underscore.js官方注释,undersercore 源码分析,undersercore 源码分析 segmentfault
类型判断
对于类型判断,大部分元素可以通过Object.prototype.toString的结果进行判断,包括:Arguments, Function, String, Number, Date, RegExp, Symbol, Map, WeakMap, Set, WeakSet。实例如下:
//判断是否为函数,判断其他的只要把下面的Function改成其它的就可以了
function isFunction (obj) {
return Object.prototype.toString.call(obj) === '[object Function]';
}
//建立一个函数
var haha = function haha() {
consolog.log('haha');
}
console.log(isFunction(haha)); //输出true
console.log(isFunction(123)); //输出false
注意,IE9 以前的版本以及早期 V8 引擎对类型判断有一些小bug,underscore.js修复了这些问题,具体可自行查看underscore.js源码。
isElement
判断是否为DOM节点,使用nodeType属性:
function isElement(obj) {
return !!(obj && obj.nodeType === 1);
}
isArray
判断是否为数组,优先使用Array.isArray,不支持则使用Object.prototype.toString
var isArray = Array.isArray || function(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
isObject
使用typeof来判断是否为对象。
function isObject(obj) {
var type = typeof obj;
return type === 'function' || type ==='object' && !!obj;
}
可以看到,函数会被判断为对象,空对象{},undefined,null,NaN 等则不被认为是对象。
isFinite
判断是否有限。主要是使用js全局提供的isFinite函数来判断。
function isFinite(obj) {
return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
}
最后那个!isNaN(parseFloat(obj))是为了排除bool值。
isNaN
判断是否为NaN,主要通过js全局提供的isNaN来判断。
function isNaN(obj) {
return _.isNumber(obj) && isNaN(obj);
}
is Boolean
判断是否为Boolean。
function isBoolean(obj) {
return obj === true || obj === false || Object.prototype.toString.call(obj) === '[object Boolean]';
}
isNull
判断是否是null,直接判断即可。
function isNull(obj) {
return obj === null;
}
isUndefined
判断是否是undefined,利用void 0。
function isUndefined(obj) {
return obj === void 0;
}
相等性判断
很多时候我们都要判断2个元素的相等性,在这个时候我们可以先判断它们的类型,然后再判断它们的值。可以有一些特殊的情况:
- 0 === -0
- null == undefined
- NaN != NaN
- NaN !== NaN
它们的解决方案如下:
- 1/0 === 1/0; 1/-0 !== 1/0
- null === null; null !== undefined;
- if(a !== a) return b !== b;
这里我不打算写一般的比较情况,只是把几个特殊的情况写一下:
正则表达式和字符串
主要是转化为字符串再比较
Eq = function(a, b) {
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) return false;
return '' + a === '' + b;
}
数字
需要排除0和NaN的情况,并且利用+a把a转化为数字。
Eq = function(a, b) {
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) return false;
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
}
日期和布尔值
利用+a把a转化为数字。
Eq = function(a, b) {
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) return false;
return +a === +b;
}
Symbol
利用SymbolProto.valueOf方法。
Eq = function(a, b) {
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) return false;
return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
}
注意:不能直接用''或者'='来判断对象的相等性,原因如下:
var a = new Object();
var b = new Object();
a.name = "mm";
b.name = "mm";
console.log(a == b); //false
underscore.js源码研究(4)的更多相关文章
- underscore.js源码研究(8)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(7)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(5)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(3)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(2)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(1)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码解析(五)—— 完结篇
最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...
- underscore.js 源码
underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...
随机推荐
- NOIP训练测试3(2017081601)
上一波题还是比较水的吧?[?????] 也许吧! 但时间还是比较紧的,所以我从2.5个小时延长至3个小时了. 不管了,做题不能停,今天继续测试. 水不水自己看,我什么也不说(zhe shi zui h ...
- 2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)
传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> ...
- jrebel热部署
一,JRebel 插件 获取与安装 1,JRebel 官网下载地址https://zeroturnaround.com/software/jrebel/download/#!/free-trial P ...
- vue 开发系列(八) 动态表单开发
概要 动态表单指的是我们的表单不是通过vue 组件一个个编写的,我们的表单是根据后端生成的vue模板,在前端通过vue构建出来的.主要的思路是,在后端生成vue的模板,前端通过ajax的方式加载后端的 ...
- (9)How to take a picture of a black hole
https://www.ted.com/talks/katie_bouman_what_does_a_black_hole_look_like/transcript 00:13In the movie ...
- python知识积累
1. 安装requirements.txt依赖: pip install -r requirements.txt 生成requirements.txt文件: pip freeze > requi ...
- boost--function
1.简介 function是一个模板类,它就像一个包装了函数指针或函数对象的容器(只有一个元素).可以把它想象成一个泛化的函数指针,而且他非常适合代替函数指针,存储用于回调的函数.如下定义了一个能够容 ...
- kubeadm 双节点部署k8s v1.13.3+calico v3.3.4
一.部署环境 VMware Workstation 10 centos7 二.主机配置(每台主机都要做) 主机名 ip cpu ram master 192.168.137.10 3G node1 1 ...
- lnmp源码编译安装zabbix
软件安装 Mysql 安装 tar xf mysql-5.7.13-1.el6.x86_64.rpm-bundle.tar -C mysql rpm -e --nodeps mysql-libs-5 ...
- hadoop两大核心之一:MapReduce总结
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序 本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce任务过程被分为两个处理阶段 ...