Что происходит при попытке присвоить свойство примитиву в JavaScript
Что проверяют
Знаете ли вы про объекты-обёртки над примитивами и про то, что режим выполнения меняет поведение языка. Вопрос выглядит трюком, но смысл практический: понимаете ли, почему присваивание иногда молча пропадает, а иногда роняет код.
Как отвечать
При обращении к свойству примитива движок создаёт временную обёртку (String, Number, Boolean), выполняет операцию и тут же её выбрасывает. Чтение так и работает: "abc".toUpperCase() берёт метод у прототипа обёртки.
С записью всё зависит от режима:
"use strict";
const s = "hello";
s.age = 5; // TypeErrorБез строгого режима присваивание просто ничего не делает, и чтение потом вернёт undefined. В строгом будет TypeError. Важно добавить, что в модулях и внутри классов строгий режим включён всегда, а значит, в современном коде это именно ошибка, а не тихая потеря.
Крайние случаи назовите сами: у null и undefined обёртки нет, любое обращение к свойству роняет TypeError в любом режиме. У Symbol и BigInt обёртки есть, но создать их через new нельзя.
Полезно закончить тем, зачем это знать: примитив неизменяем, поэтому str.trim() возвращает новую строку и результат надо присваивать, а пометить строку своим полем не получится.
Где спотыкаются
Делают вывод, что строка «превратилась в объект». Ничего не превратилось: typeof s остаётся "string", обёртка живёт ровно одну операцию, а s instanceof String даёт false.
Второе: пробуют держать данные на примитиве, например помечать строку флагом обработки. Такое поле не сохранится ни в одном режиме. Для меток берут Map или Set, где само значение служит ключом.
Третье: создают обёртку явно через new String() и сравнивают строгим равенством. Такой объект не равен литералу, typeof у него "object", а new Boolean(false) в условии ведёт себя как истина, потому что объект истинен всегда. Поэтому конструкторы обёрток в прикладном коде и не применяют.