Различие между Объектом Строкового типа и Строки JavaScript?

Я бездельничал со стандартом ECMA-262 (Спецификация языка ECMAScript, 3-й выпуск, если это имеет значение для этого - я не нашел различия между 3-м и 5-м выпуском на Строковом типе / Строковый Объект).

Существует одна вещь, которая экранирует меня: различие между Строковым типом и Строковым Объектом. Да я знаю различие в том смысле, что Строковый тип является последовательностью 16-разрядных единиц UTF-16, и Строковый Объект является встроенным объектом со своим внутренним набором свойств Класса для "Представления в виде строки" и его внутренний набор свойств Значения к значению Строкового типа.

Но читая спецификацию, строковый тип, кажется, не выставляет методов; то есть, это - просто значение без любых дополнительных свойств. Возьмите этот код, все точно как ожидалось:

document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'

Первым типом является фактический Строковый тип, и вторым является Тип объекта (это - объект класса Строка, но ее тип данных является объектом). Однако рассмотрение этого:

"foo".charAt(0);

fooStrObj = new String("Foo");
fooStrObj.charAt(0);

Они оба, кажется, выставляют те же функции, но нет никаких функций на Строковом типе, определенном в стандарте ECMA-262; все функции, которые это выставляет, от объекта String.prototype (и я не вижу ссылки на то, что Строковый тип волшебно выставляет все свойства и функции объекта String.prototype в стандарте ECMA-262). Так значения Строкового типа типа автоматически продвинуты на Строковый Объект со значением Типа исходной строки как его внутреннее свойство Value?

И если их рассматривают точно то же (который, во всех отношениях, они, кажется), почему имеют два различных пути для представления Строки?

64
задан Chad 27 January 2017 в 19:32
поделиться

2 ответа

Строки являются типом значение js, поэтому они не могут иметь никаких свойств, прикрепленных к ним, без прототипа и т. Д. Любая попытка получить доступ к нему на них технически выполнять js [[ Тообъектировать]] Преобразование (по сути, новая строка).

Легкий способ отличения разницы (в браузере)

a = "foo"
a.b = "bar"
alert("a.b = " + a.b); //Undefined

A = new String("foo");
A.b = "bar";
alert("A.b = " + A.b); // bar

дополнительно, пока

"foo" == new String("foo")

верно, это верно только благодаря преобразованию неявных типов == Оператора

"foo" === new String("foo")

.

44
ответ дан 24 November 2019 в 16:01
поделиться

, это аналогично разнице между INT и целым числом в Java.

Согласно стандарту, строки автоматически преобразуются в строку объектов, когда вы пытаетесь вызвать метод. См. ЭКМА 262-3 Раздел 11.2.1 ; Шаг 5 Вызывы Тообъекты (который определен в разделе 9.9).

11.2.1 Доступ к недвижимости [...]
[...]
Производство Memberexpression: Memberexpression [Expression] оценивается следующим образом:

  1. Оценить Memberexpression.
  2. Вызов GetWalue (результат (1)).
  3. Оценить выражение.
  4. Вызов GetWalue (результат (3)).
  5. Вызов Tobject (результат (2)).
  6. Вызов ToString (результат (4)).
  7. Верните значение ссылки типа, базовый объект которого является результатом (5), а имя свойства которого является результатом (6).


9.9 TOBJECT

Оператор Toobject преобразует свой аргумент в значение объекта типа в соответствии со следующей таблицей:
[...]
Создание нового строкового объекта, свойство чьи [[значение]] устанавливается значением нить. См. 15.5 для описания строковых объектов.

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

Помимо этого, объекты обертки не очень полезны. Я не знаю, почему они на языке. Я скорее желаю, чтобы они не были. :)

12
ответ дан 24 November 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: