Я общался со стандартом ECMA-262 (ECMAScript Language Specification, 3-е издание, если это имеет значение для этого), я не нашел разницы между 3-м и 5-м выпуском String Type/String Object).
Есть одна вещь, которая меня озадачивает: разница между строковым типом и строковым объектом. Да, я знаю разницу в том смысле, что String Type представляет собой последовательность из 16-битных единиц UTF-16, а String Object - это встроенный объект с его внутренним свойством Class, установленным в "String", и его внутренним значением Value, значение типа String.
Но, читая спецификацию, тип строки, похоже, не раскрывает никаких методов; то есть это просто значение без каких-либо дополнительных свойств. Возьмите этот код, все в точности как ожидалось:
document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'
Первый тип - это фактический тип строки, а второй - тип объекта (это объект класса String, но его тип данных - объект). Однако, глядя на это:
"foo".charAt(0);
fooStrObj = new String("Foo");
fooStrObj.charAt(0);
Оба они, похоже, раскрывают одни и те же функции, но нет никаких функций в строковом типе, определенном в стандарте ECMA-262; все функции, которые он предоставляет, относятся к объекту String.prototype(и я не вижу ссылки на то, что String Type магически раскрывает все свойства и функции объекта String.prototype в стандарте ECMA-262). Точно так же значения типа String Type автоматически передаются объекту String с исходным значением типа String в качестве его внутреннего свойства Value?
И если они обрабатываются точно так же (что для всех целей и задач они кажутся), почему есть два разных способа представления строки?