[].slice или Array.prototype.slice - программирование
Подтвердить что ты не робот

[].slice или Array.prototype.slice

Iv сталкивается с обоими способами применения прототипов Array к собственному объекту:

arr = Array.prototype.slice.call(obj);
arr = [].slice.call(obj);

Аналогичным образом, получение истинного типа собственного массива-подобного объекта:

type = Object.prototype.toString.call(obj);
type = {}.toString.call(obj);

Простой тест:

function fn() {
    console.log(
        Array.prototype.slice.call(arguments),
        [].slice.call(arguments),
        Object.prototype.toString.call(arguments), 
        {}.toString.call(arguments)
    );
}

fn(0,1);

Fiddle: http://jsfiddle.net/PhdmN/

Они похожи на меня; первый синтаксис используется чаще, но второй, безусловно, короче. Есть ли недостатки при использовании более короткого синтаксиса?
4b9b3361

Ответ 1

Они идентичны по функциональности.

Однако объект Array может быть перезаписан, что приведет к сбою первого метода.

//Example:
Array = {};
console.log(typeof Array.prototype.slice); // "undefined"
console.log(typeof [].slice);    // "function"

Метод literal создает новый экземпляр Array (напротив метода Array.prototype.). Бенчмарк обоих методов: http://jsperf.com/bbarr-new-array-vs-literal/3

Когда вы собираетесь использовать этот метод много раз, наилучшей практикой является кэширование метода:

  • var slice = Array.prototype.slice; //Commonly used
  • var slice = [].slice; - Если вас беспокоит существование Array, или вам просто нужен более короткий синтаксис.