В javascript можно переопределить скобки для доступа к символам в строке? - PullRequest
14 голосов
/ 01 ноября 2008

Есть ли способ определить String[int], чтобы избежать использования String.CharAt(int)?

Ответы [ 4 ]

12 голосов
/ 01 ноября 2008

Нет, нет способа сделать это.

Это распространенный вопрос от разработчиков, которые переходят на JavaScript с другого языка, где операторы могут быть определены или переопределены для определенного типа.

В C ++ совершенно не исключено перегрузить operator* на MyType, заканчивая уникальным оператором звездочки для операций с объектами типа MyType. Читаемость этой практики все еще может быть поставлена ​​под сомнение, но язык, тем не менее, допускает это.

В JavaScript это просто невозможно. Вы не сможете определить метод, который позволяет индексировать символы из String, используя скобки.

@ Lee Kowalkowski поднимает хороший вопрос, а именно: возможно для доступа к символам с использованием скобок, поскольку скобки могут использоваться для доступа к членам. JavaScript Array. Для этого потребуется создать новый Array, используя каждый из символов строки в качестве ее членов, а затем получить доступ к Array.

Это, вероятно, сбивающий с толку подход. Некоторые реализации JavaScript предоставляют доступ к строке через скобки, а некоторые - нет, поэтому это не стандартная практика. Объект может быть перепутан со строкой, и, поскольку JavaScript является свободно типизированным языком, уже существует риск неверного представления типа. Определение массива исключительно для целей использования синтаксиса, отличного от того, что уже есть в языке, - всего лишь гонг, способствующий путанице такого типа. Это вызывает вопрос @ Andrew Hedges : «Зачем бороться с языком?» ..

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

За исключением всей семантики, операторы до сих пор не переопределены.

Примечание: Разработчики, привыкшие к соглашениям о строгой проверке типов и классическом наследовании, иногда смущаются синтаксисом C-семейства JavaScript. Под капотом работает незнакомым образом. Лучше всего писать JavaScript чистыми и недвусмысленными способами, чтобы избежать путаницы.

10 голосов
/ 01 ноября 2008

Обратите внимание: Прежде чем кто-либо еще хотел бы проголосовать за мой ответ, я ответил на вопрос:

IE javascript string indexers

Есть ли способ определить строку [int], чтобы избежать использования string.CharAt (int)? "

Ничего, касательно конкретно переопределяющих скобок, или синтаксиса, или передового опыта, вопрос только что задавался «каким-то образом». (И единственный другой ответ сказал: «Нет, нет».)


Ну, на самом деле, вроде:

var newArray = oldString.split(''); 

... теперь вы можете получить доступ к newArray, используя скобочные обозначения, потому что вы только что преобразовали его в массив.

3 голосов
/ 01 ноября 2008

Использование String.charAt ()

Это Стандарт и работает во всех браузерах .

В браузерах не IE вы можете использовать скобки для доступа к таким символам:

"TEST"[1]; // = E

Вы можете преобразовать строку в массив символов, выполнив это:

var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E

Это будет обескуражено. Нет никаких причин не использовать метод charAt (), и нет никакой выгоды делать что-либо еще.

0 голосов
/ 01 ноября 2008

Это не ответ, а просто уловка (настоятельно не рекомендуется!). Это показывает, в частности, что в Javascript вы можете делать все, что захотите. Это просто вопрос твоей фантазии.

Вы можете использовать тот факт, что вы можете установить любые дополнительные свойства для объекта String, как и для всех других, поэтому вы можете создавать свойства 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 () каждый раз, когда вы изменяете строчку.

...