В JavaScript я могу переопределить скобки для доступа к символам в строке?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

14
задан Derek 朕會功夫 26 May 2012 в 03:33
поделиться

4 ответа

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

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

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

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

@Lee Kowalkowski поднимает положительную сторону, а именно, что это, в некотором смысле, возможно для доступа к символам с помощью скобок, потому что скобки могут привыкнуть к членам доступа JavaScript Array. Это включило бы создание нового Array, использование каждого из символов строки как ее участники и затем доступ Array.

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

существуют полезные шаблоны в JavaScript для [1 121] законная перегрузка функции и полиморфное наследование . Это не пример также.

Вся семантика в стороне, операторы все еще не были переопределены.

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

12
ответ дан 1 December 2019 в 12:02
поделиться

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

IE строковые индексаторы JavaScript

являются там некоторым способом, которым я могу определить строку [интервал] для избегания использования строки. CharAt (интервал)?"

Ничто о специфически переопределяющих скобках, или синтаксисе или лучшей практике, вопрос, который просто задают для "некоторого пути". (И единственный другой сказанный ответ "нет, Нет".)

<час>

ну, существует на самом деле, отчасти:

var newArray = oldString.split(''); 

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

10
ответ дан 1 December 2019 в 12:02
поделиться

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

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

0
ответ дан 1 December 2019 в 12:02
поделиться

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

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

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

"TEST"[1]; // = E

Вы могли преобразовать строку в массив символов, делающих это:

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

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

3
ответ дан 1 December 2019 в 12:02
поделиться