В javascript я могу переопределить скобки для доступа к символам в строке?
Есть ли способ определить String[int]
, чтобы избежать использования String.CharAt(int)
?
Ответы
Ответ 1
Нет, нет способа сделать это.
Это общий вопрос от разработчиков, которые приходят на JavaScript с другого языка, где могут быть определены или переопределены операторы для определенного типа.
В С++ не исключено, что перегрузка operator*
на MyType
завершается уникальным оператором звездочки для операций с объектами типа MyType
. Читаемость этой практики все же может быть поставлена под сомнение, но язык ее дает, тем не менее.
В JavaScript это просто невозможно. Вы не сможете определить метод, который позволяет вам индексировать символы из String
с помощью скобок.
@Lee Kowalkowski поднимает хороший момент, а именно, что в некотором роде можно получить доступ к символам с помощью скобок, потому что скобки могут использоваться для доступа к членам JavaScript Array
. Это должно было бы создать новый Array
, используя каждый из символов строки в качестве своих членов, а затем получить доступ к Array
.
Это, вероятно, запутанный подход. Некоторые реализации JavaScript предоставят доступ к строке через скобки, а некоторые - нет, поэтому это не стандартная практика. Объект может быть запутан для строки, а поскольку JavaScript является свободно типизированным языком, уже существует риск неправильного представления типа. Определение массива исключительно для целей использования другого синтаксиса из того, что уже дает язык, - это только гонг, способствующий такому путанице. Это порождает вопрос @Андре Хеджеса: "Зачем бороться с языком?".
В JavaScript есть полезные шаблоны для законной перегрузки функций и полиморфного наследования. Это тоже не пример.
Вся семантика в стороне, операторы все еще не были переопределены.
Боковое примечание: Разработчики, привыкшие к соглашениям о проверке сильного типа и классическому наследованию, иногда путаются синтаксисом JavaScript C-семейства. Под капотом он работает незнакомым способом. Лучше всего писать JavaScript в чистом и недвусмысленном виде, чтобы предотвратить путаницу.
Ответ 2
Обратите внимание: Прежде чем кто-либо еще захочет проголосовать за мой ответ, вопрос, на который я ответил, был:
IE javascript string indexers
Есть ли способ определить строку [int], чтобы избежать использования string.CharAt(int)? "
Ничего о том, что конкретно переписывать скобки, синтаксис или передовую практику, просто задают вопрос "каким-то образом". (И единственный ответ ответил: "Нет, нет".)
Ну, на самом деле, вроде:
var newArray = oldString.split('');
... теперь вы можете получить доступ к newArray, используя нотацию в виде скобок, потому что вы только что преобразовали ее в массив.
Ответ 3
Использовать String.charAt()
Он стандартный и работает во всех браузерах.
В браузерах, отличных от IE, вы можете использовать скобку для доступа к следующим символам:
"TEST"[1]; // = E
Вы можете преобразовать строку в массив символов:
var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E
Это было бы обескуражено. Нет никакой причины не использовать метод charAt(), и нет никакой пользы для чего-либо еще.
Ответ 4
Это не ответ, просто трюк (сильно не рекомендуется!). Это показывает, в частности, что в Javascript вы можете делать все, что хотите. Это просто вопрос вашей фантазии.
Вы можете использовать тот факт, что вы можете установить любые дополнительные свойства для String Object, как и для всех остальных, чтобы вы могли создавать свойства String.0, String.1,...:
String.prototype.toChars = function() {
for (var i=0; i<this.length; i++) {
this[i+""] = this.charAt(i);
}
};
Теперь вы можете получить доступ к одиночным символам, используя:
var str = "Hello World";
str.toChars();
var i = 1+"";
var c = str[i]; // "e"
Обратите внимание, что это полезно только для доступа. Это должен быть другой метод, определенный для назначения строковых символов таким образом.
Также обратите внимание, что вы должны вызывать метод .toChars() каждый раз, когда вы изменяете жало.