Pull to refresh

Array-Like Objects

Reading time1 min
Views2.8K
Что это?
Немногие знают что в JavaScript есть такая сущность как Array-Like Objects.

То есть все знают что есть такие вещи как document.images, document.getElementsByTageName, arguments в контексте вызова функции, и пр…

Но не все знают как эту сущность можно использовать, например — можно приводить такие сущности к полноценным массивам(через копирование), со всеми вытекающими возможностями.

Обычно Array-Like Object отличает «Object» в виде конструктора, и length — который наследуется по прототипу(непонятно причем откуда — для меня пока это остается загадкой) :)

К конкретике:
// Функция копирования с преобразованием
var cloneAsArray = function(arrayLikeObject) {
    var isArrayLikeObject = (
        typeof arrayLikeObject === 'object' &&
        typeof arrayLikeObject.length === 'number'
    );
    
    if (isArrayLikeObject) {
        return Array.prototype.slice.call(arrayLikeObject)
    }
};

// Пример использования
var testFuction = function() {
    // Надо получить во внутреннюю функцию все переданные аргументы кроме первого массивом
    var _args =  cloneAsArray(arguments).slice(1);
    
    return _args;
}

console.log(testFuction(7,1,2,3,4))

Минусы:
Да это копия объекта, что влияет на расходование памяти, естественно.

Плюсы:
Можно избегать больших циклов таким образом, если нужна какая-то трансформация над Array-Like Object-ом.
Типа экономия на CPU

Резюме:
Применять вдумчиво :)
Tags:
Hubs:
Total votes 8: ↑8 and ↓0+8
Comments3

Articles