[].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/
Они похожи на меня; первый синтаксис используется чаще, но второй, безусловно, короче. Есть ли недостатки при использовании более короткого синтаксиса?
Ответы
Ответ 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
, или вам просто нужен более короткий синтаксис.