阅读underscore源码笔记
本文为原创作品,可以转载,但请添加本文连接,谢谢传阅
underscorejs,一个实用的的Javascript函数库,值得推荐,官网地址,Github仓库,有注释的源码
obj.length === +obj.length
判断obj.length是不是一个数字,“+”会吧非number类型的值尝试转换为number类型,如果失败返回NAN。void 0
这个相信大家经常见,但是你明白它是做什么的吗?而且我们遇到的情况大多都是在超链接里写着Javascript:(void 0)
,现在我又遇到了a === void 0
,好吧,不买官子了,其实这个是用来防止undefined
被重置(关于这一点可以点击这里查看),而void是一个修饰参数的前缀关键字,并且永远返回undefined
,因此在超链接里使用void 0就清晰了,返回undefined
就阻止了a
标签的默认事件。例如:1
2
3
4
5void 0
void (0)
void "hello"
void (new Date())
//都将返回undefined为什么使用0,我只想说呵呵,谁让
0
最短小可爱呢。ECMAScript5中的bind,underscore的实现方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18var nativeBind = FuncProto.bind;
var Ctor = function(){};
_.bind = function(func, context) {
var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, Array.prototype.slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
args = Array.prototype.slice.call(arguments, 2);
bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(Array.prototype.slice.call(arguments)));
Ctor.prototype = func.prototype;
var self = new Ctor;
Ctor.prototype = null;
var result = func.apply(self, args.concat(Array.prototype.slice.call(arguments)));
if (_.isObject(result)) return result;
return self;
};
return bound;
};bind很多人不明白为什么在有了call和apply还是要出个bind,看完这段代码大家应该明白了吧,其实就是内存驻留版的apply(更多详情前点击这里)。
好了今天就看到这儿了,其实这个库结构很简单,但是却实现了很多使用的功能函数,下面在copy一段比较实用函数。
1 | _.isEmpty = function(obj) { |
欢迎加入Javascript前端技术,群号为:85088298