Знаете ли вы, что есть методы, которые можно использовать как для строк, так и для массивов JavaScript? Давайте посмотрим на эти методы и увидим сходства и различия между ними!
Вступление
Хотя невозможно знать каждый метод в JavaScript, также приятно знать, что есть некоторые методы, которые можно использовать более чем с одним типом данных.
В частности, для строк и массивов это методы concat
, indexOf
и slice
. В этой статье мы поймем, что такое каждый из этих методов, как их использовать, а также отличия и сходства с их использованием в строках и массивах.
concat
: слияние (неразрушающее)
Для соответствующего типа данных, для которого он вызывается (строка или массив), этот метод используется для объединения двух или более из них, возвращая новую версию без изменения оригиналов. Чтобы быть более конкретным, возвращаемый объект имеет все элементы строки / массива, для которого он вызывается, за которыми следуют по порядку для каждого аргумента элементы аргумента или сам аргумент. В частности, для массивов, если аргумент является вложенным массивом, он не будет извлекать вложенный массив, а только удаляет его из массива, в котором он находится (на один уровень). В противном случае для строк, если аргументы не относятся к строковому типу, они преобразуются в строковые значения перед объединением.
Интересный факт: для массивов concat
копирует ссылки на объекты оригинала в новый массив, так что и исходный, и новый массив ссылаются на один и тот же объект! Следовательно, если объект, на который имеется ссылка, изменяется, изменения видны как для нового, так и для исходного массивов. Однако для строк изменения исходной или возвращенной строки не влияют на другую.
Примечание по производительности: особенно для строк настоятельно рекомендуется использовать операторы присваивания (+, + =) вместо метода concat
.
// no nested arrays const array1 = ['a', 'b', 'c'] const array2 = ['d', 'e', 'f'] const array3 = [‘g’, ‘h’, ‘i’] const array 4 = array1.concat(array2, array3) console.log(array4) // ["a", "b", "c", "d", "e", "f", "g", "h", "i"] // nested array const array1 = ['a', 'b', 'c'] const array2 = ['d', 'e', 'f', [‘g’, ‘h’, ‘i’]] const array3 = array1.concat(array2) console.log(array3) // ["a", "b", "c", "d", "e", "f", ["g", "h", “i”]] // strings const str1 = 'Hello' const str2 = 'World' console.log(str1.concat(' ', str2)) // "Hello World" console.log(str2.concat(', ', str1)) // "World, Hello"
indexOf: найти индекс элемента (неразрушающий)
И для массивов, и для строк indexOf
проверяет каждый элемент на равенство с указанным значением и возвращает первый совпадающий индекс. Однако, если искомого элемента нет, возвращается -1.
indexOf
принимает аргумент searchValue
для поиска и, необязательно, индекс для начала поиска. Для строк searchValue
- это именно строковое значение для поиска, и если значение не указано, по умолчанию будет выполняться поиск undefined
. С другой стороны, для массивов searchValue
- это просто элемент, который нужно искать.
Если вы включаете второй аргумент индекса для начала поиска, а индекс больше или равен длине массива / строки, возвращается -1, что означает, что объект не будет просматриваться. Однако, если второй аргумент отрицательный, поиск в массиве / строке по-прежнему выполняется спереди назад.
// arrays const animals = ['turtle', 'bison', 'horse', 'duck', 'bison'] console.log(animals.indexOf('bison')) // 1 console.log(animals.indexOf('giraffe')) // -1 console.log(animals.indexOf('bison', 2)) // 4 b/c starts from index 2 // strings const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?' const searchTerm = 'dog' const indexOfFirst = paragraph.indexOf(searchTerm) console.log(`The index of the first "${searchTerm}" from the beginning is ${indexOfFirst}`); // "The index of the first "dog" from the beginning is 40" console.log(`The index of the 2nd "${searchTerm}" is ${paragraph.indexOf(searchTerm, (indexOfFirst + 1))}`) // "The index of the 2nd "dog" is 52"
slice: Копировать (неразрушающий)
Если вы просто хотите сделать копию массива или строки, вам не нужно передавать какие-либо аргументы. Тем не менее, у вас есть возможность включить начальный индекс (включительно) и конечный индекс (не включающий) для копирования. Этот метод часто используется в splice
, потому что он позволяет избежать «побочного эффекта» изменения оригинала.
Если вы не передадите никаких аргументов, по умолчанию будет скопирован весь оригинал. Если любой из индексов отрицательный, извлекается, начиная с конца или с последнего элемента (метод length
- индекс). С другой стороны, если аргументы, которые вы передаете, больше, чем фактический массив (например, массив / строка с 5 элементами, но передаваемые аргументы, начинающиеся с 10 и заканчивающиеся на 50), возвращаемое значение будет пустым.
// arrays let iceCream = [“vanilla”, “chocolate”, “strawberry”, “green tea”] let startIndex = 1 let endIndex = 2 let copyOfIceCream = iceCream.slice(startIndex, endIndex) console.log(copyOfIceCream) // ["chocolate"] console.log(iceCream) // ["vanilla", "chocolate", "strawberry", "green tea"] // only chocolate is in the new array because endIndex is non-inclusive! If the endIndex was 3 instead, we would have a return ["chocolate", "strawberry"] // strings const str = 'The quick brown fox jumps over the lazy dog.' console.log(str.slice(31)) // "the lazy dog." console.log(str.slice(4, 19)) // "quick brown fox" console.log(str.slice(-4)) // "dog." console.log(str.slice(-9, -5)) // "lazy"
Заключение
Подводя итог, можно сказать, что есть три неразрушающих метода, которые вы можете использовать как для строк, так и для массивов:
concat
, который объединяет две строки / массиваindexOf
, который находит индекс элемента на основе значения поискаslice
, который копирует строку / массив
При этом важно знать, что, хотя вы можете использовать concat
для строк, рекомендуется использовать операторы присваивания для выполнения того же действия.
Большое спасибо за чтение! Если вас интересуют другие строковые методы, посмотрите статью Меган Ло Когда использовать эти строковые методы в JavaScript. Вы также можете посмотреть мой пост Все массивы JavaScript и методы массивов!, Чтобы узнать больше о массивах и методах массивов JavaScript.
Хочу больше? Другие ресурсы для ознакомления!
Массивы:
📖 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
📖 https://waverley-place.medium.com/everything-javascript- массивы-массив-методы-5e5809ffa4ad
Струны:
📖 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
📖 https://dev.to/mehmehmehlol/when-to-use- эти-строковые-методы-в-javascript-3m4h