Это связано с причудой (или ограничением производительности) в JavaScript - примитивы string
, boolean
и number
неизменны и любым свойством присваивание просто «исчезнет» (примитивные типы с одним жителем undefined
и null
будут выдавать исключение при попытке присвоения свойства). Это связано с тем, что эти примитивные значения являются , а не реальными объектами (это делает их намного более легкими для времени выполнения).
Однако, для каждого из примитивных типов существует тип оболочки: String
, Boolean
и Number
соответственно. Типы обёрток - это real объектов, которым могут быть назначены пользовательские свойства.
Хотя Я бы этого не делал , это будет работать (звучит как "неприглядный дизайн"):
var s = new String("foo");
s.bar = "hello"
alert(s.bar)
Однако, есть несколько странных причуд, которые это вводит - typeof ""
это "строка", в то время как typeof s
это "объект" *, а "" instanceof String
это ложь, а s instanceof String
это правда. Кроме того, new Boolean(false)
оказывается значением true-y.
Счастливого кодирования.
* Это сломает множество библиотек, которые делают typeof x === "string"