let str = 'Hi';
str[0] = 'h'; // ошибка
alert( str[0] ); // не работает
Обратите внимание, что JavaScript различает объекты String и значения строкового примитива (то же самое верно и для объектов Boolean и Number).
Строковые литералы (обозначаемые двойными или одинарными кавычками) и строки, возвращённые вызовом String в неконструкторном контексте (то есть, без использования ключевого слова new) являются строковыми примитивами. JavaScript автоматически преобразует примитивы в объекты String, так что на строковых примитивах возможно использовать методы объекта String. В контекстах, когда на примитивной строке вызывается метод или происходит поиск свойства, JavaScript автоматически оборачивает строковый примитив объектом и вызывает на нём метод или ищет в нём свойство.
так почему же мы можем обр. к свойствам как у массива и тд...?
const r = Array.prototype.map.call('qwerty', (ch) => ch.toUpperCase());
console.log(r);
length
есть не только у строки и массива: например, есть length
и у Function
.function f(a, b, c) {}
f.length // 3 - число аргументов
length
— на этом и заканчиваются общие черты, пожалуй? У строки чтение символа по его позиции через квадратные скобки — скорее просто синтаксический «сахар», более короткая запись метода строки charAt()