Проблема здесь в том, что конструкторы для этого типа называются (Number, String, Array, Boolean...
), которые действуют немного иначе, чем их «примитивные» аналоги - они возвращают объект, который содержит примитивное значение.
Это [[PrimitiveValue]] или [[value]] в предыдущих спецификациях является внутренним свойством, к которому вы можете получить доступ через .valueOf()
.
'foo' // is a string
String('foo') // is a string
new String('foo') // is a String object with [[value]] set to 'foo'
1 // is a number
Number(1) // is a number
new Number(1) // is a Number object with [[value]] set to 1
Object('foo') == (new String('foo'))
Object(1) == (new Number(1))
По какой-то причине инспектор webkit не выглядитосознавая примитивную ценность этих объектов.Таким образом, Object('foo')
напечатает '[object Object]', но если вы вызовете Object('foo').toString()
или любой метод, который неявно вызывает toString или valueOf, например alert(Object('foo'))
, вы получите ожидаемое значение "foo".
Это также причина этого:
var x = new Boolean(false);
// any object evaluates to true...
!!x // == true
Boolean(x) // == true
Javascript имеет свою долю странности.Также учтите, что в движках javascript есть множество изюминок с различными уровнями соответствия спецификациям.