Является ли String примитивным типом или объектом в Javascript?

Является ли String примитивным типом или объектом в Javascript? Источник говорит, что Undefined, Null, Boolean, Number и String - все примитивные типы в Javascript. Но он говорит, что String тоже объект. Я смущен. Может кто-нибудь объяснить?

Заранее спасибо;-)

Ответ 1

Как.

Существует объект String и есть строковые литералы.

Вы можете вызвать любой строковый метод в литерале, и вы можете вызвать любой строковый метод для строкового объекта.

Основное отличие состоит в том, что строковый объект генерирует новый объект, поэтому new String("foo") !== new String("foo")

Это и объект String - это тип "object", а не "string"

Как проверить для обоих?

if(typeof(s) == "string" || s instanceof String){
  //s is a string (literal or object)
}

Кредиты @Triynko для фрагмента в комментариях

Ответ 2

Фактически тот же ответ применяется к: строкам, числам, булевым. Эти типы имеют свою примитивную и объектную версию, которые принуждаются во время выполнения приложения под капотом (без вашего ведома).

Принуждение

JavaScript слабо типизирован. Это означает, что всякий раз, когда ваш код хочет выполнить операцию с недопустимыми типами данных (например, добавить строку в число), JavaScript попытается найти наилучшее соответствие для этого сценария.

Этот механизм также называется, как упоминалось выше, принуждением.

Примитивы и свойства

Вы можете найти следующий код, запутывающий:

> "hello world".length
11

потому что "hello world" - строковый литерал, т.е. примитив. И мы знаем, что примитивы не имеют свойств. Все правильно.

Итак, как это работает? Принуждение - примитив обертывается объектом (принудительно) всего лишь на крошечную долю времени, свойство объекта используется и сразу же удаляется объект.

Принуждение работает в обоих направлениях

Таким образом, примитивы отливаются с вариантами их обертывания объектов, но он также работает и наоборот. Рассмотрим следующий код:

> String("hello ") + String("world")
"hello world"

> Number(2) + 3
5

Объекты сбрасываются в их примитивные версии, чтобы выполнить операцию.

Прочтите это блестящее объяснение, чтобы узнать больше.

Ответ 3

JavaScript имеет как примитивные, так и строковые объекты.

> var foo = "foo"
undefined
> var bar = new String("bar");
undefined
> foo
"foo"
> bar
String
> typeof foo
"string"
> typeof bar
"object"

Ответ 4

var a = "string"; 
typeof a    // yields "string" 

var a = new String('string'); 
typeof a   // yields "object"