- slice
- Отправить комментарий
- Учебник javascript
- Основные элементы языка
- Сундучок с инструментами
- Интерфейсы
- Все об AJAX
- Оптимизация
- Разное
- Array.prototype.slice()
- Интерактивный пример
- Синтаксис
- Параметры
- Возвращаемое значение
- Описание
- Примеры
- Пример: возврат части существующего массива
- Пример: использование метода slice()
- Массивоподобные объекты
- Совершенствование кросс-браузерного поведения
- Спецификации
- Совместимость с браузерами
- Смотрите также
- Метод slice
- Синтаксис
- Пример
- Пример
- Пример
- Смотрите также
slice
Данный метод не изменяет исходный массив, а просто возвращает его часть.
var arr = [ 1, 2, 3, 4, 5 ] arr.slice(2) // => [3, 4, 5] arr.slice(1, 4) // => [2, 3, 4] arr.slice(2, 3) // => [3]
arr = [1, 2, 3, 4, 5] arr.slice(-2) // => [4, 5] arr.slice(arr.length - 2) // то же самое arr.slice(-3, -1) // [3, 4] arr.slice(arr.length-3, arr.length-1) // то же самое
А как будет с многомерными массивами?
Для многомерных массивов нужно использовать схожую функцию — splice()
Можете привести пример, как использовать splice() для многомерных массивов?
Многомерность не учитывается.
start тоже не обязательный параметр. slice без параметров копирует массив
Почему нет ни слова о том, что этот метод практически так же работает и для строк?! Что он вообще там есть
Наверное потому, что у строк — другой метод с таким же названием. А этот метод для массивов.
«Данный метод не изменяет исходный массив» — изменяет!
попробуйте:
var arr = [1,2,3];
arr.splice(1,1)
console.log(arr);
Извините, перепутал методы. Всего одна буква а какая разница в поведении.
это што за говностатья? где описание, что именно делает эта функция?
slice хороший способ клонировать массив,
Например
var arr1 = [1, 2, 3, 4]; var arr2 = arr1; var arr3 =arr2.slice(0) console.assert(arr1 === arr2); console.assert(arr1 !== arr3);
var a = [,,,,]; var b = a.slice(1,2); b[0].x=7; alert(JSON.stringify(a))
var a = [1,2,3,4]; var b = a.slice(1,2); b[0]=7; text(JSON.stringify(a))
Не надо путать копирование по ссылке и копирование по значению
Отправить комментарий
- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
Для остальных вопросов и обсуждений есть форум.
Учебник javascript
Основные элементы языка
Сундучок с инструментами
Интерфейсы
Все об AJAX
Оптимизация
Разное
- Асинхронное программирование
- Google Gears в деталях
- Javascript Flash мост
- Букмарклеты и правила их написания
- О подборке книг на сайте
- Почему — плохо
- Способы идентификации в интернете
- Уровни DOM
- Что почитать?
- Шаблонизация с javascript
- Юнит-тесты уровня браузера на связке Selenium + PHP.
- Справочники: Javascript/HTML/CSS
- Система сборки и зависимостей Google Closure Library
- Хранение данных на клиенте. DOM Storage и его аналоги.
- 10 лучших функций на JavaScript
- В памяти машины все вещественные числа.
39 минут 8 секунд назад - Where to buy nembutal pentobarbital.
4 часа 37 минут назад - Purchase original fryd extracts carts.
4 часа 40 минут назад - Purchase original fryd extracts carts.
4 часа 42 минуты назад - Great contribution! Also for the Snus.
15 часов 12 минут назад - Я думаю ты прав Fumigaciones Precios
17 часов 46 минут назад - I´m so happy I found this space with.
17 часов 48 минут назад - Really it´s the best way to start Aire.
17 часов 52 минуты назад - It´s the best answer in fact
17 часов 56 минут назад - A great way to unwind in your leisure.
18 часов 1 минута назад
Array.prototype.slice()
Метод slice() возвращает новый массив, содержащий копию части исходного массива.
Интерактивный пример
Синтаксис
Параметры
Индекс (счёт начинается с нуля), по которому начинать извлечение.
Если индекс отрицательный, begin указывает смещение от конца последовательности. Вызов slice(-2) извлечёт два последних элемента последовательности.
Если begin не определён, slice() начинает работать с индекса 0 .
Если begin больше длины последовательности вернётся пустой массив.
Индекс (счёт начинается с нуля), по которому заканчивать извлечение. Метод slice() извлекает элементы с индексом меньше end .
Вызов slice(1, 4) извлечёт элементы со второго по четвёртый (элементы по индексам 1, 2 и 3).
Если индекс отрицательный, end указывает смещение от конца последовательности. Вызов slice(2, -1) извлечёт из последовательности элементы начиная с третьего элемента с начала и заканчивая вторым с конца.
Если end опущен, slice() извлекает все элементы до конца последовательности ( arr.length ).
Возвращаемое значение
Новый массив, содержащий извлечённые элементы.
Описание
Метод slice() не изменяет исходный массив, а возвращает новую «одноуровневую» копию, содержащую копии элементов, вырезанных из исходного массива. Элементы исходного массива копируются в новый массив по следующим правилам:
- Ссылки на объекты (но не фактические объекты): метод slice() копирует ссылки на объекты в новый массив. И оригинал, и новый массив ссылаются на один и тот же объект. То есть, если объект по ссылке будет изменён, изменения будут видны и в новом, и в исходном массивах.
- Строки и числа (но не объекты String и Number ): метод slice() копирует значения строк и чисел в новый массив. Изменения строки или числа в одном массиве никак не затрагивает другой.
Если к любому массиву будет добавлен новый элемент, это никак не повлияет на другой массив.
Примеры
Пример: возврат части существующего массива
// Пример: наши хорошие друзья цитрусовые среди фруктов var fruits = ['Банан', 'Апельсин', 'Лимон', 'Яблоко', 'Манго']; var citrus = fruits.slice(1, 3); // citrus содержит ['Апельсин', 'Лимон']
Пример: использование метода slice()
В следующем примере метод slice() создаёт новый массив, newCar , из массива myCar . Оба содержат ссылку на объект myHonda . Когда цвет в объекте myHonda изменяется на багровый, оба массива замечают это изменение.
// Используя slice, создаём newCar из myCar. var myHonda = color: 'красный', wheels: 4, engine: cylinders: 4, size: 2.2 > >; var myCar = [myHonda, 2, 'в хорошем состоянии', 'приобретена в 1997']; var newCar = myCar.slice(0, 2); // Отображаем значения myCar, newCar и цвет myHonda // по ссылкам из обоих массивов. console.log('myCar = ' + myCar.toSource()); console.log('newCar = ' + newCar.toSource()); console.log('myCar[0].color = ' + myCar[0].color); console.log('newCar[0].color = ' + newCar[0].color); // Изменяем цвет myHonda. myHonda.color = 'багровый'; console.log('Новый цвет моей Honda - ' + myHonda.color); // Отображаем цвет myHonda по ссылкам из обоих массивов. console.log('myCar[0].color = ' + myCar[0].color); console.log('newCar[0].color = ' + newCar[0].color);
= [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2, 'в хорошем состоянии', 'приобретена в 1997'] newCar = [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2] myCar[0].color = красный newCar[0].color = красный Новый цвет моей Honda - багровый myCar[0].color = багровый newCar[0].color = багровый
Массивоподобные объекты
Метод slice() также может использоваться для преобразования массивоподобных объектов / коллекций в новый массив Array . Вам просто нужно привязать метод к объекту. Псевдомассив arguments (en-US) внутри функции как раз является примером «массивоподобного объекта».
function list() return Array.prototype.slice.call(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3]
Привязка может быть осуществлена посредством функции call() из прототипа функции Function.prototype (en-US), также запись может быть сокращена до [].slice.call(arguments) вместо использования Array.prototype.slice.call() . В любом случае, она может быть упрощена посредством использования функции bind() .
var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); function list() return slice(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3]
Совершенствование кросс-браузерного поведения
Хотя спецификация не требует от хост-объектов (например, объектов DOM) следовать поведению Mozilla при преобразовании с помощью Array.prototype.slice() и IE < 9 так не делает, версии IE, начиная с 9-й это умеют. «Прокладывание» позволяет добиться надёжного кросс-браузерного поведения. Пока другие современные браузеры будут поддерживать эту способность, что и делают в настоящее время IE, Mozilla, Chrome, Safari и Opera, разработчики, читая (поддерживающий DOM) код функции slice() , опирающийся на эту прокладку, не будут вводиться в заблуждение его семантикой; они могут смело полагаться на текущую семантику, являющуюся, видимо, де-факто стандартным поведением. (Прокладка также исправляет поведение IE, позволяя работать со вторым аргументом slice() , явно определённым как null / undefined , поскольку более ранние версии IE такое не позволяют, но все современные браузеры, в том числе IE >= 9, поддерживают данное поведение.)
/** * Прокладка для "исправления" отсутствия поддержки в IE < 9 применения slice * к хост-объектам вроде NamedNodeMap, NodeList и HTMLCollection * (технически, поскольку хост-объекты зависят от реализации, * по крайней мере, до ES2015, IE не обязан так работать). * Также работает для строк, исправляет поведение IE < 9, позволяя явно указывать undefined * вторым аргументом (как в Firefox), и предотвращает ошибки, возникающие при * вызове на других объектах DOM. */(function () 'use strict'; var _slice = Array.prototype.slice; try // Не может использоваться с элементами DOM в IE < 9_slice.call(document.documentElement); > catch (e) // В IE < 9 кидается исключение// Функция будет работать для истинных массивов, массивоподобных объектов, // NamedNodeMap (атрибуты, сущности, примечания), // NodeList (например, getElementsByTagName), HTMLCollection (например, childNodes) // и не будет падать на других объектах DOM (как это происходит на элементах DOM в IE < 9)Array.prototype.slice = function(begin, end) // IE < 9 будет недоволен аргументом end, равным undefinedend = (typeof end !== 'undefined') ? end : this.length; // Для родных объектов Array мы используем родную функцию slice if (Object.prototype.toString.call(this) === '[object Array]') return _slice.call(this, begin, end); > // Массивоподобные объекты мы обрабатываем самостоятельно var i, cloned = [], size, len = this.length; // Обрабатываем отрицательное значение begin var start = begin || 0; start = (start >= 0) ? start: len + start; // Обрабатываем отрицательное значение end var upTo = (end) ? end : len; if (end 0) upTo = len + end; > // Фактически ожидаемый размер среза size = upTo - start; if (size > 0) cloned = new Array(size); if (this.charAt) for (i = 0; i size; i++) cloned[i] = this.charAt(start + i); > > else for (i = 0; i size; i++) cloned[i] = this[start + i]; > > > return cloned; >; > >());
Спецификации
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Метод slice
Метод slice вырезает и возвращает указанную часть массива. Сам массив при этом не изменяется.
Первым параметром указывается номер элемента массива, с которого начинается вырезание, а вторым параметром — номер элемента, на котором закончится вырезание (при этом элемент с этим номером не включится в вырезанную часть). Второй параметр не является обязательным. Если его не указать — подмассив возьмется с указанного в первом параметре элемента до конца массива.
Он также может принимать отрицательные значения. В этом случае отсчет элемента, на котором закончится обрезание, начинается с конца массива. Последний элемент при этом будет иметь номер -1 .
Синтаксис
Пример
Давайте вырежем из массива элементы с нулевого по второй не включительно (второй не вырежется):
Результат выполнения кода:
Пример
Давайте вырежем с первого элемента до конца массива. Для этого второй параметр не задаем:
Результат выполнения кода:
Пример
Давайте вырежем элементы со второго по предпоследний ( -1 указывает на последний элемент и он не включится в извлеченную часть):
Результат выполнения кода:
Преимущество такого подхода в том, что вырезаться всегда будет часть массива, не включая последний элемент, независимо от размера массива.
Смотрите также
- метод splice ,
который также отрезает части массива, изменяя при этом сам массив - метод shift ,
который удаляет первый элемент массива - метод pop ,
который удаляет последний элемент массива