Your Search Results

    Array

    Аннотация

    Глобальный объект JavaScript Array — это конструктор для массивов, которые на высоком уровне представляют собой спископодобные объекты.

    Синтаксис

    [element0, element1, ..., elementN]
    new Array(element0, element1, ..., elementN)
    new Array(arrayLength)
    
    element0, element1, ..., elementN
    Массив в JavaScript инициализируется с помощью элементов, за исключением случая когда один аргумент передается в конструктор Array и аргумент является числом (см. ниже). Стоит обратить внимание, что это особый случай применимый только в JavaScript массивах созданных с помощью Array конструктора, без использования скобочного синтаксиса.
    arrayLength
    Если только аргумент переданный Array конструктору число между 0 и 232-1 (включительно), новый пустой JavaScript массив и длина устанавливается этим числом. Если аргумент любое другое число то возникает исключение RangeError .

    Описание

    Массивы — это спископодобные объекты, в которые изначально включены методы для обхода и изменения. Ни размер массива JavaScript, ни типы элементов не являются фиксированными. Так как размер массива и типы его элементов могут измениться в любое время, то нет гарантии, что массив окажется плотным. То есть при работе с массивом может возникнуть ситуация, что элемент массива, к которому вы обратитесь будет пустым и вернёт undefined. В целом, это удобная характеристика, но если эта особенность массива не желательна в вашем специфическом случаи, вы можете использовать типизированные массивы WebGL.

    Стоит обратить внимание, что использовать массив как ассоциативный массив не желательно. Вы можете использовать простой объект вместо этого, но там есть и свои особенности. Смотрите пост «Lightweight JavaScript dictionaries with arbitrary key» как пример.

    Доступ к элементам массива

    Массивы в JavaScript индексируются с нуля, то есть первый элемент массива имеет индекс равный 0, а индекс последнего элемента эквивалентен значению свойства массива length минус 1.

    var arr = ["Первый элемент", "Второй элемент"];
    console.log(arr[0]);              // напечатает «Первый элемент»
    console.log(arr[1]);              // напечатает «Второй элемент»
    console.log(arr[arr.length - 1]); // напечатает «Второй элемент»
    

    Элементы массива — это свойства объекта, например как toString. Однако попытка доступа к первому элементу массива вызовет синтаксическую ошибку:

    console.log(arr.0);
    

    Однако, это не особенность массивов или их свойств, поскольку в JavaScript к начинающимся с цифры свойствам невозможно обратиться по средствам точечной нотации. Доступ к таким свойствам осуществляется с помошью скобочной натации.

    Например, если у вас есть объект со свойством "3d", то сослаться на него можно будет только при помоши скобочной натации. Это видно в следующих двух примерах:

    var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010];
    try {
      console.log(years.0);
    } catch (ex) {
      console.log("Используя скобочную нотацию:");
      console.log(years[0]);
    }
    
    try {
      renderer.3d.setTexture(model, "character.png");
    } catch (ex) {
      console.log("Используя скобочную нотацию:");
      renderer["3d"].setTexture(model, "character.png");
    }
    

    Обратите внимание, что во втором примере 3d заключено в кавычки "3d". Индексы можно заключать в кавычки (например years['2'] вместо years[2]), то в этом нет необходимости, поскольку значение индекса будет приведено к строке движком JavaScript в любом случае через неявное преобразование toStringИменно по этой причине "2" и "02" будут относится к двум различным элементам объекта years и в следующем примере получаем true:

    console.log(years["2"] != years["02"]);
    

    Relationship between length and numerical properties

    Свойство JS массивовlength и числовое свойство взаимосвязаны. Различные методы встроенные в массив (e.g., join, slice, indexOf, etc.) take into account the value of an array's length property when they're called. Результатом действий остальных методов также является обновление свойства length.

    var fruits = [];
    fruits.push("banana", "apple", "peach");
    
    console.log(fruits.length); // 3

    При установке свойства JS массива когда свойство доступно через индекс массива и индекс выходит за текущие границы массива, массив будет расти до размера достаточно большого чтобы разместить элемент с этим индексом, а движок будет обновлять свойство массива length соответственно:

    fruits[3] = "mango";
    console.log(fruits[3]);
    console.log(fruits.length); // 4

    Установка свойства length , напрямую также привод к к расширению массива до указанной длинны.

    fruits.length = 10;
    console.log(fruits);        // The array gets padded with undefined
    console.log(fruits.length); // 10
    

    Все особенности поведения объясняются на странице посвященной length.

    Создаем массив, используя результат совпадения

    Результат совпадения между регулярным выражением и строкой может создать JavaScript массив. Этот массив имеет свойства и элементы что дает избыточную информацию о совпадении. Массив здесь это возвращенное значение RegExp.exec, String.match и String.replace. Чтобы проще было понять откуда какие появились  свойства и элементы посмотрите следующий пример и обратитесь к таблице ниже:

    // Match one d followed by one or more b's followed by one d
    // Remember matched b's and the following d
    // Ignore case
    
    var myRe = /d(b+)(d)/i;
    var myArray = myRe.exec("cdbBdbsbz");
    

    Свойства и элементы возвращаемые из данного совпадения описаны ниже:

     

    Свойство/Элемент Описание Пример
    input

    Свойство только для чтения отражает оригинальную строку к которой подбиралось регулярной выражение.

    cdbBdbsbz
    index

    Свойство только для чтения, в нулевом индексе расположено совпадения со строкой.

    1
    [0] A read-only element that specifies the last matched characters. dbBd
    [1], ...[n]

    Элемент только для чтения в них доступны совпавшие подстроки которые совпали с регулярным выражением. Число доступных подстрок не ограничено.

    [1]: bB
    [2]: d

    Свойства

    For properties available on Array instances, see Properties of Array instances.

    prototype
    Allows the addition of properties to all objects.
    Properties inherited from Function:

    Методы

    For methods available on Array instances, see Methods of Array instances.
    isArray Requires JavaScript 1.8.5

    Возвращает true если переменная это массив, если нет то false

    Array instances

    Array instances inherit from Array.prototype. As with all constructors, you can change the constructor's prototype object to make changes to all JavaScript Array instances.

    Properties

    constructor

    Определяет функцию что создает прототип объекта.

    length

    Отражает число элементов в массиве.

    Methods

    Mutator methods

    Эти методы модифицируют массив:

    pop

    Удаляет последний элемент из массива и возвращает его.

    push

    Добавляет один или более элементов в конец массива и возвращает новую длину массива.

    reverse

    Переворачивает порядок элементов в массиве -- первый элемент становиться последним и последний первым.

    shift

    Удаляет первый элемент из массива и возвращает его.

    sort

    Сортирует элементы в массиве.

    splice

    Добавляет и/или удаляет элементы из массива.

    unshift

    Добавляет один или более элементов в начало массива и возвращает новую длину массива.

    Accessor methods

    Эти методы не модифицируют массив, а просто возвращают его в ином представлении.

    concat

    Возвращает новый массив который состоит из массива соединенного с другим массивом и/или значением (списком значений)

    join

    Объединение всех элементов массива в строку.

    slice

    Извлекает диапазон значений и возвращает в виде нового массива.

    toSource

    Возвращает массив в литеральном виде. Вы можете использовать это значение для создания нового массива. Переопределяет метод Object.prototype.toSource.

    toString

    Возвращает элементы массива в виде строки. Переопределен метод Object.prototype.toString.

    indexOf Requires JavaScript 1.6

    Возвращает первый (наименьший) индекс элемента равный указанному значению, или -1 если значение не найдено.

    lastIndexOf Requires JavaScript 1.6

    Полностью аналогичен методу выше только поиск элемента начинает с конца массива.

    Iteration methods

    Several methods take as arguments functions to be called back while processing the array. When these methods are called, the length of the array is sampled, and any element added beyond this length from within the callback is not visited. Other changes to the array (setting the value of or deleting an element) may affect the results of the operation if the method visits the changed element afterwards. While the specific behavior of these methods in such cases is well-defined, you should not rely upon it so as not to confuse others who might read your code. If you must mutate the array, copy into a new array instead.

    forEach Requires JavaScript 1.6

    Вызывает функцию для каждого элемента в массиве.

    every Requires JavaScript 1.6

    Возвращает true если каждый элемент в массиве удовлетворяет условию проверяющей функции.

    some Requires JavaScript 1.6

    Возвращает true если хотя бы один элемента в этом массиве удовлетворяет условию проверяющей функции.

    filter Requires JavaScript 1.6

    Создает новый массив со всеми элементами этого массива для которого функция проверки возвращает true.

    map Requires JavaScript 1.6

    Создает новый массив с результатом вызова функции для каждого элемента в этом массиве.

    reduce Requires JavaScript 1.8

    Применение функции одновременно к двум значениям массива (слева-направо), сведение к одному значению.

    reduceRight Requires JavaScript 1.8

    Применение функции одновременно к двум значениям массива (справа-налево), сведение к одному значению.

    Array generic methods

    Время от времени вы захотите применить методы массива к строке или массив-подобному объекту (такому как аргумент функции). Делая это вы обрабатываете строку как массив символов (иначе относитесь к не массиву как массиву). Для примера, в порядке проверки что каждый символ в переменной str это буква, вы пишите:

    function isLetter(character) {
      return (character >= "a" && character <= "z");
    }
    
    if (Array.prototype.every.call(str, isLetter))
      alert("The string '" + str + "' contains only letters!");
    

    Эта запись довольно расточительна и в JavaScript 1.6 введен общий сокращенный вид:

    if (Array.every(str, isLetter))
      alert("The string '" + str + "' contains only letters!");
    

    Generics are also available on String.

    These are currently not part of ECMAScript standards (though the ES6 Array.from() can be used to achieve this). The following is a shim to allow its use in all browsers:

    /*globals define*/
    // Assumes Array extras already present (one may use shims for these as well)
    (function () {
        'use strict';
    
        var i,
            // We could also build the array of methods with the following, but the
            //   getOwnPropertyNames() method is non-shimable:
            // Object.getOwnPropertyNames(Array).filter(function (methodName) {return typeof Array[methodName] === 'function'});
            methods = [
                'join', 'reverse', 'sort', 'push', 'pop', 'shift', 'unshift',
                'splice', 'concat', 'slice', 'indexOf', 'lastIndexOf',
                'forEach', 'map', 'reduce', 'reduceRight', 'filter',
                'some', 'every', 'isArray'
            ],
            methodCount = methods.length,
            assignArrayGeneric = function (methodName) {
                var method = Array.prototype[methodName];
                Array[methodName] = function (arg1) {
                    return method.apply(arg1, Array.prototype.slice.call(arguments, 1));
                };
            };
    
        for (i = 0; i < methodCount; i++) {
            assignArrayGeneric(methods[i]);
        }
    }());

    Examples

    Example: Creating an array

    Следующий пример создает массив msgArray с длиной равно 0, затем присваивается значение msgArray[0] и msgArray[99] , что изменяет длинну массива до 100.

    The following example creates an array, msgArray, with a length of 0, then assigns values to msgArray[0] and msgArray[99], changing the length of the array to 100.

    var msgArray = new Array();
    msgArray[0] = "Hello";
    msgArray[99] = "world";
    
    if (msgArray.length == 100)
       print("The length is 100.");
    

    Example: Creating a two-dimensional array

    Следует создание шахматной доски из двумерного массива строк. Первый ход сделан и копирует 'p' в 4,4 из 6,4. Старая позиция 6,4 будет пустой.

    var board = 
    [ ['R','N','B','Q','K','B','N','R'],
      ['P','P','P','P','P','P','P','P'],
      [' ',' ',' ',' ',' ',' ',' ',' '],
      [' ',' ',' ',' ',' ',' ',' ',' '],
      [' ',' ',' ',' ',' ',' ',' ',' '],
      [' ',' ',' ',' ',' ',' ',' ',' '],
      ['p','p','p','p','p','p','p','p'],
      ['r','n','b','q','k','b','n','r']];
    print(board.join('\n') + '\n\n');
    
    // Move King's Pawn forward 2
    board[4][4] = board[6][4];
    board[6][4] = ' ';
    print(board.join('\n'));
    

    Ниже показан вывод:

    R,N,B,Q,K,B,N,R
    P,P,P,P,P,P,P,P
     , , , , , , , 
     , , , , , , , 
     , , , , , , , 
     , , , , , , , 
    p,p,p,p,p,p,p,p
    r,n,b,q,k,b,n,r
    
    R,N,B,Q,K,B,N,R
    P,P,P,P,P,P,P,P
     , , , , , , , 
     , , , , , , , 
     , , , ,p, , , 
     , , , , , , , 
    p,p,p,p, ,p,p,p
    r,n,b,q,k,b,n,r
    

    Browser compatibility

    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
    Feature Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes)

    See also

    Document Tags and Contributors

    Contributors to this page: yakovlevigorek, icw82, BedyNN, teoli, dbruant
    Last updated by: teoli,