underscore.js原始碼解析2
- _.isNull(object)
如果object的值是null,返回true。
_.isNull(null);
=> true;
_.isNull(undefined);
=> false;
_.isNull =function(obj){
return obj === null;
}
undefined派生自null,所以兩者相等(==),但是不全等(===),所以這裡如果obj是undefined則會返回false。
2.isArray(object)
如果object是一個陣列,返回true
(function() {return _.isArray(arguments);}();
=> false 這裡的arguments是一個類陣列,所以返回false
_.isArray([1,2,3])
=> true
var ObjProto = Object.prototype;
var toString = ObjProto.toString;
var nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === `[object Array]`
}
如果有es5原生的isArray()方法,就用原生的;如果沒有就呼叫經典的陣列判斷方法,通過Object.prototype.toString()方法,判斷某個物件值屬於哪種內建型別。
3.isArguments、isFunction、isString、isNumber、isDate、isRegExp、isError這些方法放到一起講,因為這些方法的的原始碼實現都是放到了一個each函式中遍歷每一個方法名然後實現的布林值判定。原始碼:
_.each([`Arguments`, `Function`, `String`, `Number`, `Date`, `RegExp`, `Error`], function(name) {
_[`is` + name] = function(obj) {
//呼叫Object原生的toString()方法,實現安全的型別檢測
return toString.call(obj) === `[object ` + name + `]`;
};
});
- _.isBoolean(object)
如果object是一個布林值,返回true,否則返回false
_.isBoolean(null)
=> false
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) === `[object Boolean]`;
}
- _.isNaN(object)
如果object是NaN,返回true
注意:這和原生的isNaN函式不一樣,如果變數是undefined,原生的isNaN函式也會返回true。
_.isNaN(NaN);
=> true
isNaN(undefined);
=> true
_.isNaN(undefined);
=> false
_.isNaN = function(obj) {
return _.isNumber(obj) && obj !== +obj; //"+obj"是把其他型別轉換成Number型別的快捷方式
}
- isFinite(object)
如果object是一個有限數字,返回true
_.isFinite(-101);
=> true
_.isFinite(-Inifinity);
=> false
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
- isObject(value)
如果object是一個物件,返回true。
需要注意的是js陣列和函式是物件,字串和數字不是。
_.isObject({})
=> true
_.isObject(1)
=>false
_.isObject = function(obj) {
var type = typeof obj;
return type === `function` || type === `object` && !!obj;
};
“!!obj”是為了排除null以及undefined
- isElement(object)
如果object是一個DOM元素,返回true
_.isElement(document.body);
=> true
_.isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
}
- _.has(object,key)
物件是否包含給定的鍵嗎?等同與object.hasOwnProperty(key),但是使用hasOwnProperty函式的一個安全引用,以防止意外覆蓋。
_.has({a: 1 , b: 2,c: 3}, “b”);
=> true
var ObjProto = Object.prototype;
var hasOwnProperty = Object.hasOwnProperty;
_.has = function(obj,key) {
return obj != null &&hasOwnProperty.call(obj,key);
}
hasOwnProperty() 方法會返回一個布林值,指示物件是否具有指定的屬性作為自身(不繼承)屬性。
學習參考:
http://www.qdfuns.com/house/17398/note/class/id/bb6dc3cabae6651b94f69bbd562ff370/page/2.html
https://github.com/hanzichi/underscore-analysis/blob/master/underscore-1.8.3.js/underscore-1.8.3-analysis.js
http://www.css88.com/doc/underscore/#isEmpty
http://www.css88.com/doc/underscore/docs/underscore.html
這是我學習underscore受益匪淺的幾個網站和大神寫得博文,想學好underscore的話就去看看吧
相關文章
- 深入解析Underscore.js原始碼架構JS原始碼架構
- koa2原始碼解析原始碼
- Retrofit2原始碼解析原始碼
- 【原始碼SOLO】Retrofit2原始碼解析(一)原始碼
- 【原始碼SOLO】Retrofit2原始碼解析(二)原始碼
- RxJava2 原始碼解析(一)RxJava原始碼
- Retrofit2原始碼解析(一)原始碼
- Promise-Polyfill原始碼解析(2)Promise原始碼
- RxJava2 原始碼解析(二)RxJava原始碼
- ptmalloc2原始碼解析初探原始碼
- mina2原始碼解析原始碼
- myBatis原始碼解析-快取篇(2)MyBatis原始碼快取
- Netty原始碼解析2-ReactorNetty原始碼React
- 深入RxJava2 原始碼解析(一)RxJava原始碼
- Mybatis原始碼解析2—— 例項搭建MyBatis原始碼
- 深入RxJava2 原始碼解析(二)RxJava原始碼
- RxDownload2 原始碼解析(三)原始碼
- RxDownload2 原始碼解析(二)原始碼
- AFNetworking原始碼解析系列(2)原始碼
- gulp原始碼解析(2):vinyl-fs原始碼
- Struts2 原始碼分析-----攔截器原始碼解析 --- ParametersInterceptor原始碼
- 友好 RxJava2.x 原始碼解析(三)zip 原始碼分析RxJava原始碼
- django-rest-framework原始碼分析2—認證(Authentication)原始碼解析DjangoRESTFramework原始碼
- React原始碼解析(2):元件的掛載React原始碼元件
- python2 traceback模組原始碼解析Python原始碼
- OKHttp原始碼解析(2)----攔截器RetryAndFollowUpInterceptorHTTP原始碼
- YARN原始碼解析(3)-作業提交2Yarn原始碼
- SpringMVC原始碼解析系列2-DispatcherServletSpringMVC原始碼Servlet
- Retrofit2使用方式和原始碼解析原始碼
- Android進階:五、RxJava2原始碼解析 2AndroidRxJava原始碼
- RxJava2 原始碼解析及設計思想RxJava原始碼
- [原始碼解析] PyTorch 分散式(2) ----- DataParallel(上)原始碼PyTorch分散式Parallel
- vue2原始碼解析(重構版)(1)Vue原始碼
- freeRTOS原始碼解析4--task.c 2原始碼
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- Spark原始碼-SparkContext原始碼解析Spark原始碼Context
- 追蹤解析Spring ioc啟動原始碼(2)Spring原始碼
- spring cloud gateway 原始碼解析(2)動態路由SpringCloudGateway原始碼路由