2

是否有理由直接从原型引用方法而不是通过继承?这些似乎是事实上的标准:

var argsArr = Array.prototype.slice.call(arguments);

var isArr = Object.prototype.toString.call(object) === '[object Array]';

文字对我来说似乎更好?阅读起来更短,更不容易混淆。

var argsArr = [].slice.call(arguments);

var isArr = {}.toString.call(object) === '[object Array]';

如果有性能提升,它必须可以忽略不计,并且函数很容易缓存。也许创建一个新对象的开销很小,但又可以忽略不计?

4

1 回答 1

1

当然,你的方法会非常好用。它确实会不必要地创建和丢弃对象,但是正如您所说,这样做的开销将是微不足道的。FWIW,可读性是主观的(我发现使用原型的版本更容易阅读。)

我认为这主要是为了避免不必要的创造,不必要的记忆流失。发动机过去比现在慢很多。

使用过早的微优化模式...

看起来对于slice用例,在我的机器上使用文字的 Chrome 上大约慢 4%,在 Firefox 上它更慢 9%,在 IE10 上完全没有区别。之后你所做的任何事情很可能会淹没这种效果。当然,记忆流失的影响更难衡量。

如果你经常这样做,我会绕过整个问题并有一个Utils对象(或将这些添加到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
    };
})();
于 2013-09-12T09:58:26.917 回答