Как отличить примитивное значение от объекта в JavaScript

Как известно, в 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

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.