Поскольку вы так и не получили полного ответа, я попытаюсь ответить на некоторые из вопросов, которые вы разместили.
Является ли аргумент хост-объектом?
arguments
является частью языка Javascript, а не хост-объектом. Он имеет довольно четко определенное поведение, которое было изменено при работе в режиме strict
. Поскольку arguments
не сохраняется за пределами текущего вызова функции (даже в замыкании) и поскольку он не предназначен для изменения, обычный способ обработки объекта arguments состоит в том, чтобы немедленно сделать копию в реальный массив, где вы затем можете использовать все обычные методы массива на нем, и он может сохраняться в закрытии для доступа к локальной функции.
Документы MDN предупреждают о ‹ IE9. А в других браузерах?
Здесь не очень конкретно обобщать конкретный браузер. Вместо этого вам придется изучить конкретный объект, а затем определенные версии браузера. У старых версий IE была репутация хост-объектов, которые не взаимодействовали с Javsacript (таким образом), но вам действительно нужно было изучить конкретный объект, чтобы узнать, что вы можете, а что нет.
Как насчет нативных объектов nodejs?
node.js — это гораздо более чистая среда Javascript, чем браузер, потому что в нем нет DOM, нет объекта window
и т. д. Были ли у вас какие-либо конкретные объекты node.js, о которых вы хотели спросить? В моем несколько ограниченном опыте работы с node.js я просто вижу настоящие объекты JS, хотя есть много мест, где node.js взаимодействует с ОС, поэтому, возможно, в этих интерфейсах есть некоторые не-JS-объекты (я не встречал никаких объектов). пока, но это возможно).
Так что в плохом случае вы получите TypeError!
Как я сказал в своих комментариях, использование любого объекта массива, который пытается изменить массив, например .splice()
, скорее всего, вызовет проблемы с объектами хоста, поскольку многие объекты хоста не предназначены для прямого изменения. Кроме того, чтение спецификации и предположение, что все старые браузеры следуют спецификации (без обширного тестирования для проверки этого), может быть опасным. В частности, старые версии IE известны тем, что не следуют спецификации. Итак, опять же, вы не можете просто предположить, что получите TypeError
без надлежащего тестирования.
Если вы ищете безопасный способ кодирования общего назначения, вы никогда не ошибетесь, скопировав похожий на массив хост-объект в реальный массив, а затем используя операции над массивом в фактическом массиве. Это гарантированно безопасно. Существует кросс-браузерный полифилл для Array.prototype.slice
, который работает со всеми браузерами для копирования в фактический массив на страница MDN для .slice(). Если вы поддерживаете только IE 9 и выше, вам не нужен полифилл.
И никогда не следует предполагать, что любая операция, которая изменяет подобный массиву объект, в целом безопасна для хост-объекта (могут быть определенные исключения, но вам придется провести много тестов, чтобы быть уверенным). Я предпочитаю писать код, который, как я знаю, будет безопасным и не требует большого количества тестов, чтобы гарантировать это. Копирование в реальный массив дает мне это каждый раз.
person
jfriend00
schedule
05.09.2014
.push()
или.splice()
. Скорее всего, они будут работать, если просто копируют некоторые элементы в новый массив, такой как.slice()
. Что касается node.js, о каких нативных объектах вы спрашиваете, которые еще не являются фактическими массивами? - person jfriend00   schedule 05.09.2014TypeError
тогда и только тогда, когда браузер действительно следует спецификации. Если бы все браузеры идеально следовали всем спецификациям, все было бы намного проще. Я поддерживаю свою рекомендацию, что вам нужно протестировать каждую версию/комбинацию браузера, которую вы хотите поддерживать. Лучшее решение — немедленно сделать копию любого не-массива в реальный массив. В общем, создание копии — довольно безопасная вещь, потому что ВСЕ подобные массиву элементы имеют длину и средства их итерации (обычно с[index]
), и это все, что вам нужно для создания копии. - person jfriend00   schedule 05.09.2014.push()
в объект JS? Вам нужен ключ и значение, чтобы что-то было свойством объекта, и ТОЛЬКО.push()
предоставляет значение. Это кажется несоответствием с самого начала и чем-то, что вы никогда не должны делать или даже пытаться сделать. - person jfriend00   schedule 05.09.2014Arguments
— это собственный объект, и мутирующие методы массива не будут работать как с собственными, так и с хост-объектами, если объект неизменяем. - person cookie monster   schedule 05.09.2014.push()
не лишен смысла. Метод.push()
автоматически предоставляет ключ (новый индекс) на основе анализа текущего.length
, предоставленного его объектом. На самом деле это ничем не отличается от того же, например, для объекта jQuery. - person cookie monster   schedule 05.09.2014.push()
для не-массива. Я все еще думаю, что вся эта цепочка рассуждений об использовании широкого набора методов Array для объектов, не являющихся массивами, — это просто рискованное программирование. Если вы хотите выполнять операции с массивом над чем-то, что не является фактическим массивом, скопируйте его в фактический массив, где у вас есть полностью поддерживаемые методы без вопросов о том, что работает, а что нет, или напишите свой собственный код для выполнения операция способом, который, как вы знаете, гарантированно будет безопасным на основе известных возможностей типа объекта, который у вас есть. - person jfriend00   schedule 05.09.2014