Неизменность должна выдавать ошибку, но не в строке - PullRequest
1 голос
/ 15 октября 2019

Я проверяю неизменность строки и написал эту функцию, которая принимает строку.

Поскольку строка является неизменной, строка [i] ниже не может быть присвоена никакому значению.

Однако, когда я запускаю эту функцию, она не выдает ошибку. Почему это? (согласно моему исследованию, я считаю, что эта строка (str [i] = 'x' должна сломать систему / прекратить выполнение функции и выдать ошибку. Но это не так (это написано в редакторе VSCode)

function tuc(str) {
        let res = [];
        for (let i = 0; i < str.length; i++) {
            str[i]='x';
            let c = str[i];
            res.push(c.toUpperCase());
        }
        return res.join("");
    }

1 Ответ

3 голосов
/ 15 октября 2019

Выражение

    str[i] = 'x';

неявно создает экземпляр String из строкового примитива. Для этого объекта установлено , но этот объект нигде не сохраняется. Установка свойства для экземпляра String не влияет на значение примитивной строки str.

. Другими словами,

    str[i] = 'x';

фактически совпадает с

    (new String(str))[i] = 'x';

Поскольку этот временный объект успешно получает новое свойство из присваивания, исключение для выброса не существует.

Обратите внимание, что построение неявного экземпляра String не является особым случаем в этом конкретном коде;даже что-то вроде

    var len = str.length;

создает временный экземпляр String. (Конечно, современная среда исполнения JavaScript может вообще признать, что на самом деле не нужен экземпляр String, но это концепция.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...