Это работает кросс-браузер?


При Условии Объекта.прототип не был изменен, будет в следующем фрагменте работы в основных браузерах?

var obj = {length:0};
var push = Array.prototype.push;
push.call(obj,'1st value')
push.call(obj,'2nd value');

Многие ответили, что приведенный выше код-это плохая практика, но то, что делает такой код лучше?

Array.prototype.slice(arguments,0)

Как называют массивом.прототипна номера массиваС.



372
6
задан 21 июля 2011 в 06:07 Источник Поделиться
Комментарии
5 ответов

Я собираюсь сказать "нет", потому что это массив. Это работает, но вы не забиваем винт в этот момент. Просто использовать массив.

4
ответ дан 21 июля 2011 в 06:07 Источник Поделиться

Я не собираюсь вдаваться в глубины внедрения деталь с этим, я просто хотел сказать, что вы, вызывая один массив функций на объекте, который не является массивом.

Это как вы едете по трассе в коробке, которая может иметь любой из: рулевого колеса, шины, мост, пол, сиденья ... и вы не знаете, какой.

В зависимости от того, как массив будет реализовать в любом браузере, это может совершенно не работать вообще. Ломать API в такой манере-это глупая идея.

Так что, нет.

1
ответ дан 21 июля 2011 в 06:07 Источник Поделиться

Вопрос 1:

Что отличается от код а код Б?

Код:

var obj = {length:0};
var push = Array.prototype.push;
push.call(obj,'1st value')
push.call(obj,'2nd value');

Код B:

Array.prototype.slice(arguments,0)


Ответ:

Во-первых, код B, является неправдой и должно быть следующее.

Код Б2:

function test(){
var args = Array.prototype.slice.call(arguments,0);
return args;
}

Если не определены, аргументы существуют в рамках функции. В основном аргументы - это литерал объекта с начального состояния {длина:0}.
Когда функция вызывается с аргументом, аргумент хранится в объекте аргументы на коэффициент, соответствующий довод позицию.

Пример:

function getFirstArgument(){
return arguments[0];
}
console.log( getFirstArgument(1,2,3) === 1 );

Цель код В2 заключается в преобразовании аргументов объект в массив, так что вы можете получить доступ к массиву прототип функции легко.

Пример:

// returns the arguments as an array in reverse order.
function reverseArguments(){
return Array.prototype.slice.call(arguments).reverse();
}
console.log( reverseArguments(1,2,3).join(",") === "3,2,1" );

Так как вы можете видеть, как obj-файлы в код и аргументы в код B имеют один и тот же объект изначально.
Однако, код добавляет значения в obj, а код В2 преобразования аргументов в массив.

Более подробная информация здесь:

Что использование массива.прототип.срез.вызов(аргументов,0)

МДН массива.срез

Вопрос 2:

Будут "кодекс" работает в основных браузерах?

Ответ:
Скорее всего. Однако, если вы хотите гарантировать, что это работает, тогда перепишите пуш фикцию.

var push = function( obj, val ){
if( typeof obj !== "object" ){
return;
}
obj.length = obj.length || 0;
obj[ obj.length ] = val;
return ++obj.length;
};

Использование:

var obj = {};
console.log( push( obj, 1 ) === 1 );
console.log( push( obj, 1 ) === 2 );
console.log( JSON.stringify( obj ) === "{"0":1,"1":1,"length":2}" );

1
ответ дан 28 сентября 2012 в 01:09 Источник Поделиться

Работая с JavaScript как работать с шаблонами в C++. Если он имеет функцию нужно это работает. В этом случае длина может быть недостаточно для каждого браузера. Это правда, что можно использовать встроенные функции, как это, но если эта функция пытается получить доступ к собственности, которая не доступна для вашего объекта будет выполнена.

Теперь что касается второй точки. Насколько мне известно, стандартный сценарий ЕСМА не отталкивают какие-либо внутренние операции и даже если браузеры не используют их как жесткие правила, они принимают его в качестве руководства. Так что вполне возможно, что ваш код не будет работать в любом браузере, но объекта arguments, который реализуется в браузере, чтобы быть совместимым с архитектурой массива. Поэтому, используя массив.прототип.срез.нажимаем(арг, 0); относительно безопаснее, чем использование пользовательского объекта с помощью встроенного в функции массива.

0
ответ дан 24 июля 2011 в 07:07 Источник Поделиться

Он будет работать без сбоев. Точный результат будет объект со свойствами "0", "1" и "длина"==2. Есть сферы, потому что замена функции "звонок", используя. Однако это не очень хорошая практика, чтобы использовать это решение, потому что плохая читаемость и ремонтопригодность. Я предлагаю сделать это excplicitly.

-1
ответ дан 21 июля 2011 в 08:07 Источник Поделиться