Вопрос о части JavaScript и методах соединения встык

Я вошел в контакт с Восьмеричным до PDP-11, и таким образом, по-видимому, сделал язык C:)

23
задан scottt 29 January 2019 в 12:11
поделиться

3 ответа

<Примечание>
Фактический код из этого связанного ответа :

var args = Array.prototype.slice.call(arguments, 1);

то есть «срез», а не «сращивание»

Прежде всего, метод slice часто используется для создания копии массива, который он вызывает :

var a = ['a', 'b', 'c'];
var b = a.slice();  // b is now a copy of a
var c = a.slice(1); // c is now ['b', 'c']

Итак, краткий ответ заключается в том, что код в основном эмулирует:

arguments.slice(1); // discard 1st argument, gimme the rest

Однако вы не можете сделать это напрямую. специальный arguments объект (доступен внутри контекста выполнения всех функций JavaScript), хотя Array- похож на в том смысле, что он поддерживает индексацию с помощью оператора [] с цифровые клавиши, на самом деле не является массивом; Вы не можете .push на него, .pop с него или .slice it, и т. Д.

Код выполняет это следующим образом: "обман" функция slice (которая снова недоступна в объекте arguments ) для запуска в контексте arguments через Function.prototype .call :

Array.prototype.slice // get a reference to the slice method
                      // available on all Arrays, then...
  .call(              // call it, ...
    arguments,        // making "this" point to arguments inside slice, and...
    1                 // pass 1 to slice as the first argument
  )

Array.prototype.slice.call (arguments) .splice (1) выполняет то же самое, но выполняет посторонний вызов splice (1) , который удаляет элементов из массива, возвращенного из Array.prototype.slice.call (arguments) , начиная с индекса 1 и продолжая до конца массива. splice (1) не работает в IE (технически отсутствует 2-й параметр, указывающий, сколько элементов требуется удалить для IE и ECMAScript).

splice (1) выполняет то же самое, но делает посторонний вызов splice (1) , который удаляет элементов из массива, возвращенного из Array.prototype. slice.call (arguments) , начиная с индекса 1 и продолжая до конца массива. splice (1) не работает в IE (технически отсутствует 2-й параметр, указывающий, сколько элементов требуется удалить для IE и ECMAScript).

splice (1) выполняет то же самое, но делает посторонний вызов splice (1) , который удаляет элементов из массива, возвращенного из Array.prototype. slice.call (arguments) , начиная с индекса 1 и продолжая до конца массива. splice (1) не работает в IE (технически отсутствует 2-й параметр, указывающий, сколько элементов требуется удалить для IE и ECMAScript).

40
ответ дан 29 November 2019 в 01:55
поделиться

Возвращаемое значение соединения представляет собой массив элементов, которые были удалены, но исходный массив (или подобный массиву объект) усекается по индексу склейки.

Создание копии с помощью slice сохраняет исходный массив аргументов, предположительно для использования позже в функции.

В этом случае тот же результат может быть получен с помощью args = [] .slice.call (arguments, 1)

function handleArguments(){
 var A= [].slice.call(arguments).splice(1);
 //arguments is unchanged
 var s= 'A='+A+'\narguments.length='+arguments.length;

 var B= [].splice.call(arguments, 1);
 // arguments now contains only the first parameter
 s+= '\n\nB='+B+'\narguments.length='+arguments.length;
 return s;
}

// test
alert(handleArguments(1, 2, 3, 4));

returned value:
//var A= [].slice.call(arguments).splice(1);
A=2,3,4
arguments.length=4

//var B= [].splice.call(arguments, 1);
B=2,3,4
arguments.length=1
0
ответ дан 29 November 2019 в 01:55
поделиться
var args = Array.prototype.slice.call(arguments).splice(1);

Сначала берет копию arguments (*), затем удаляет из нее все, кроме первого элемента (нестандартным способом), и назначает эти удаляемые элементы to args .

Дополнительный массив, который создается, затем изменяется и отбрасывается, является избыточным. Было бы лучше сказать - поскольку версия в ответе, на который вы ссылаетесь, действительно делает:

var args = Array.prototype.slice.call(arguments, 1);

Приложение с частичной функцией также является функцией метода function.bind , который стандартизирован ECMAScript Fifth Edition. Пока браузеры не реализовали это, вы можете выбрать резервную JS-версию в нижней части этого ответа .

*: array.slice () - это нормальная идиома для копирования массива и array.slice (1) для взятия хвоста. Он должен вызываться явно через массив . prototype , потому что arguments не является массивом, даже если он выглядит точно так же, поэтому не имеет обычных методов массива. Это еще одна странная ошибка JavaScript.

Вы довольно часто видите людей, использующих методы Array.prototype для объектов, не являющихся массивами; стандарт ECMAScript Third Edition изо всех сил старается сказать, что это нормально для arguments типа массива, но не , что вы также можете сделать это с другими подобными массивами, которые могут быть хост-объектами, такими как NodeList или HTMLCollection. Хотя сегодня во многих браузерах можно обойтись вызовом методов Array.prototype для не-Array, единственное место, где это действительно безопасно, - это arguments .

поэтому не имеет обычных методов массива. Это еще одна странная ошибка JavaScript.

Вы довольно часто видите людей, использующих методы Array.prototype для объектов, не являющихся массивами; стандарт ECMAScript Third Edition изо всех сил старается сказать, что это нормально для arguments типа массива, но не , что вы также можете сделать это с другими подобными массивами, которые могут быть хост-объектами, такими как NodeList или HTMLCollection. Хотя сегодня во многих браузерах можно обойтись вызовом методов Array.prototype для не-Array, единственное место, где это действительно безопасно, - это arguments .

поэтому не имеет обычных методов массива. Это еще одна странная ошибка JavaScript.

Вы довольно часто видите людей, использующих методы Array.prototype для объектов, не являющихся массивами; стандарт ECMAScript Third Edition изо всех сил старается сказать, что это нормально для arguments типа массива, но не , что вы также можете сделать это с другими подобными массивами, которые могут быть хост-объектами, такими как NodeList или HTMLCollection. Хотя сегодня во многих браузерах вы можете обойтись вызовом методов Array.prototype не-Array, единственное место, где это действительно безопасно сделать, - это arguments .

методы prototype для объектов, не являющихся массивами; стандарт ECMAScript Third Edition изо всех сил старается сказать, что это нормально для arguments типа массива, но не , что вы также можете сделать это с другими подобными массивами, которые могут быть хост-объектами, такими как NodeList или HTMLCollection. Хотя сегодня во многих браузерах вы можете обойтись вызовом методов Array.prototype не-Array, единственное место, где это действительно безопасно сделать, - это arguments .

методы prototype для объектов, не являющихся массивами; стандарт ECMAScript Third Edition изо всех сил старается сказать, что это нормально для arguments типа массива, но не , что вы также можете сделать это с другими подобными массивами, которые могут быть хост-объектами, такими как NodeList или HTMLCollection. Хотя сегодня во многих браузерах вы можете обойтись вызовом методов Array.prototype не-Array, единственное место, где это действительно безопасно сделать, - это arguments .

3
ответ дан 29 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: