Для начала мне вообще не очень понятно что такое String(), например. Это объект, но... выглядит как ф-ция (только ф-ция насколько я знаю, принимает аргументы). Или это просто характерная особенность встроенных объектов - возможность принимать аргументы?
Дальше. Любое значение, попадая в эти объекты, преобразовывается в соответствующий тип данных. Для преобразования к строке и числу есть toString() и valueOf(). Для преобразования к буллевому значения тоже есть какая-то специальная ф-ция?
Ivanushka255, это специальный конструктор. Он проверяет условие: (new.target == this)
Если в ответе true, то создаем объект, иначе вызываем как простую функцию. В данном случае, если вызвать new String("Foo Bar"), то он создаст объект строки (не примитив, а объект), а если без new, то переведет значение из аргумента в строку
Ivanushka255, я же объяснил (хотя немного ошибся). Функция проверяет свойство new.target внутри себя. Если результат истинный, то функция вызвана через new, то есть как конструктор. Иначе, функция вызвана как обычно - без new, то есть как обычная функция. Ты можешь сам сделать такую "мульти-функцию":
function Decide(aaa) {
if (new.target) { // функция вызвана через new
this.value = aaa * 10;
} else { // функция вызвана как обычная функция
return aaa / 10;
}
}
// Если функция была вызвана через new, то есть как конструктор,
// то она вернет нам объект со свойством value, которое содержит
// значение переданного аргумента, умноженное на 10.
// Если же функция была вызвана без new, то есть как обычная функция,
// то она вернет значение аргумента, деленное на 10
let test1 = new Decide(3);
let test2 = Decide(7);
console.log(test1.value);
// *обращаемся к свойству value объекта, который нам вернули (== 30)
console.log(test2);
// *тут должен быть просто результат (== 0.7)