В чем разница между созданием строкового значения литералом или конструктором JavaScript?

Слышал что есть какая то разница если я пишу например просто

var str = “Its my string”;

и

var anotherStr = new String(“Its my another string

Смотри, простой пример, в JS ты можешь создать строковое значение двумя способами, используя литерал или используя конструктор, используя конструктор мы создаем именно объект, а используя литерал мы создаем просто переменную, это действительно важно, сейчас покажу пример и объясню в чем разница:




Конструкторы





Просто вставь себе и посмотри, ты увидишь, что первые два метода newLine() выводят всё корректно свое содержание, дальше мы создаем свойство к первой переменной, которая на самом деле объект и всё опять же успешно выводится, дальше мы пытаемся проделать то же самое с обычной переменной которой мы просто задали значение литералом и видим что значение undefined, почему так происходит? Всё просто, у нас MyStr просто строка а anotherStr это объект, в JavaScript ты не можешь расширить обычную строчную переменную потому что, каждый раз когда идет обращение к простому значению, интерпретатор временно превращает это значение в объект чтобы с ним можно было взаимодействовать, то есть даже здесь интерпретатор делает вот так new String(MyStr).customProper2 = 12; но создание этого объекта нигде не сохраняется поэтому мы в дальнейшем не можем увидеть вывод данного свойства.