Выражение
str[i] = 'x';
неявно создает экземпляр String из строкового примитива. Для этого объекта установлено , но этот объект нигде не сохраняется. Установка свойства для экземпляра String не влияет на значение примитивной строки str
.
. Другими словами,
str[i] = 'x';
фактически совпадает с
(new String(str))[i] = 'x';
Поскольку этот временный объект успешно получает новое свойство из присваивания, исключение для выброса не существует.
Обратите внимание, что построение неявного экземпляра String не является особым случаем в этом конкретном коде;даже что-то вроде
var len = str.length;
создает временный экземпляр String. (Конечно, современная среда исполнения JavaScript может вообще признать, что на самом деле не нужен экземпляр String, но это концепция.)