Javascript 直接访问原型的值,即Object.prototype.toString.call()
是否有理由直接从原型而不是通过继承引用方法?这些似乎是事实上的标准:Javascript 直接访问原型的值,即Object.prototype.toString.call(),javascript,prototype,Javascript,Prototype,是否有理由直接从原型而不是通过继承引用方法?这些似乎是事实上的标准: var argsArr = Array.prototype.slice.call(arguments); 及 字面意思对我来说更好?它比较短,阅读起来也不那么混乱 var argsArr = [].slice.call(arguments); 及 如果有一个性能增益,它必须可以忽略不计,并且函数很容易缓存。创建一个新对象可能会有很小的开销,但同样可以忽略不计?当然,你的方法会很好地工作。它确实会不必要地创建和丢弃对象,但正
var argsArr = Array.prototype.slice.call(arguments);
及
字面意思对我来说更好?它比较短,阅读起来也不那么混乱
var argsArr = [].slice.call(arguments);
及
如果有一个性能增益,它必须可以忽略不计,并且函数很容易缓存。创建一个新对象可能会有很小的开销,但同样可以忽略不计?当然,你的方法会很好地工作。它确实会不必要地创建和丢弃对象,但正如您所说,这样做的开销非常小。FWIW,可读性是主观的(我发现使用原型的版本更容易阅读。) 我认为这主要是为了避免不必要的创造,不必要的记忆流失。发动机过去比现在慢得多 参与过早的微观优化模式 对于
slice
用例,在Chrome上使用文字在我的机器上大约慢4%,在Firefox上慢9%,在IE10上没有任何区别。很可能在那之后你所做的任何事情都会掩盖这种效果。当然,记忆流失的影响更难衡量
如果您经常这样做,我会绕过整个问题,创建一个Utils
对象(或者将这些对象添加到数组
):
但是
Array.prototype.slice==[].slice
我看不出当调用arguments
时如何重写它以得到不同的结果。您已经解释了在arguments
上调用Arrayslice
的原因,而OP询问是否有一种调用slice
的方法(Array.prototype.slice
)优于另一个([].slice
)。可能的重复不是具体的性能问题。前一个代码如此流行肯定是有原因的。对我来说,它更短,但更令人困惑。此外,显式的.prototype
访问确实是一个很好的选择。
var argsArr = [].slice.call(arguments);
var isArr = {}.toString.call(object) === '[object Array]';
var Utils = (function() {
var arraySlice = Array.prototype.slice; // Or [].slice
var objToString = Object.prototype.toString; // Or {}.toString
function cloneArray(a) {
return arraySlice.call(a);
}
function isArray(a) {
return objToString.call(a) === '[object Array]';
}
return {
cloneArray: cloneArray,
isArray: isArray
};
})();