Как известно, в JavaScript существуют примитивные типы, такие как число, строка или булев, и для них имеются соответствующие им объекты типа Number, String, Boolean, у которых есть методы для работы с этими типами, например, методы обработки строк… Если вы попытаетесь применить функцию к примитивному типу, например:
var str = "How are you doing today?"; var res = str.split(" ");
то в данном случае когда к обычной строке str мы применяем метод split, то JavaScript находит подходящий тип объекта, в данном случае это String, создает новый объект с помощью new String («How are you doing today?»); и применяет к нему функцию split.
При этом часто возникает проблема при сравнении двух значений, потому что str === new String (str) выдаст false. Также, если, к примеру, строка » в условии выдаст false, то new String (») уже выдаст true. К счастью, так же, как JavaScript автоматически создает объект из примитива, он способен и на обратное. Если мы вызовем конструктор для объекта, замещающего соответствующий примитивный тип, и передадим ему сам объект, то получим значение изначального примитивного типа.
То есть,
String(new String("How are you doing today?")) === "How are you doing today?"
выдаст true, поскольку левая часть выражения возвращает обычную строку.
Это свойство конструктора можно использовать для гарантированного получения примитивных типов с помощью подобной функции:
var getPrimitive = function (sourceValue) { return sourceValue.constructor(sourceValue) }
Не важно, что будет на входе этой функции, примитивное значение или объект, на выходе мы всегда получим примитив.
Например,
getPrimitive ("Привет"); // выдаст обычную строку "Привет" getPrimitive (new String ("Привет")); // также обычную строку "Привет" getPrimitive (new String ("Привет"))==="Привет"; выдаст true