arguments是一个字面量
用arguments可以实现未知参数数目的函数
function addAll(){
return _.reduce(arguments,function(left,right){
return left+right;
},0)
}
console.log(addAll(1,2,3,4,4,5));
_.bindAll也是这个方法实现的
_.bindAll = function(obj) {
var i, length = arguments.length, key;
if (length <= 1) throw new Error('bindAll must be passed function names');
for (i = 1; i < length; i++) {
key = arguments[i];
obj[key] = _.bind(obj[key], obj);
}
return obj;
};
使用call的时候函数本体是不会变的,传入的参数是会改变this值的。并不会调用传入参数的这个方法
var a = 123;
console.log(a.toString());//'123'
console.log(toString.call(a));//[Object Number]
其实调用的是Object.prototype.toString方法
通过这个方法还可以判定变量的类型。
isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.都可以
underscore内部实现类型判断
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});
underscore内部判定Array
var nativeIsArray = Array.isArray,
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
先看有没有nativeIsArray方法,因为是ES5的新增方法。不然就用其他办法。
判定undefined的方法
_.isUndefined = function(obj) {
return obj === void 0;
};
Null
_.isNull = function(obj) {
return obj === null;
};
for里面可以不只写一句话
函数返回值可以是数组
写函数默认值的写法可以写成 值||默认值
_.range = function(start, stop, step) {
if (stop == null) {
stop = start || 0;
start = 0;
}
step = step || 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
var range = Array(length);
for (var idx = 0; idx < length; idx++, start += step) {
range[idx] = start;
}
return range;
};
Javascript中,所有在函数体内部var声明的都会隐式移到顶部,这个动作叫做吊装(hoisting)
使用_.clone
可以复制一个global对象