Como uma string Javascript não é um object?

Não é a configuração de uma piada, estou realmente perguntando.

Douglas Crockford gosta de dizer que, na linguagem prototípica orientada a objects do javascript, não há necessidade de new .

Ele explica que o new foi simplesmente adicionado para dar às pessoas que vêm de linguagens de programação orientadas a objects baseadas em classs (ou seja, ” clássicas “) algum nível de conforto:

JavaScript, nós dificilmente new Ya

JavaScript é uma linguagem prototípica, mas tem um new operador que tenta fazer com que pareça uma linguagem clássica. Isso tende a confundir os programadores, levando a alguns padrões de programação problemáticos.

Você nunca precisa usar o new Object() em JavaScript. Use o literal do object {} .

Certo, tudo bem:

  • new mau
  • {} bom

Mas o comentador Vítor De Araújo apontou que os dois não são os mesmos . Ele dá um exemplo mostrando que uma string não é como um object :

Um object de string e um valor de string não são a mesma coisa:

 js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42 

O valor da string não pode ter novas propriedades. A mesma coisa é válida para outros tipos.

O que está acontecendo aqui que uma string não é um object ? Estou confundindo javascript com algumas outras linguagens, onde tudo é um object?

“Tudo é um object” … esse é um dos grandes equívocos que existem em todo o idioma.

Nem tudo é um object, há o que chamamos de valores primitivos , que são string, number, boolean, null e undefined.

Isso é verdade, uma string é um valor primitivo , mas você pode acessar todos os methods herdados de String.prototype como se fosse um object.

Os operadores de acessadores de propriedade (a notação de pontos e colchetes), convertem temporariamente o valor da cadeia de caracteres em um object String, para poder acessar esses methods, por exemplo:

 "ab".charAt(1); // "b" 

O que acontece nos bastidores é algo assim:

 new String("ab").charAt(1); // "b", temporal conversion ToObject 

Como com os outros valores primitivos, como Boolean e Number , existem wrappers de object , que são simplesmente objects que contêm o valor primitivo, como em seu exemplo:

 var strObj = new String(""); strObj.prop = "foo"; typeof strObj; // "object" typeof strObj.prop; // "string" 

Enquanto com um primitivo:

 var strValue = ""; strValue.prop = "foo"; typeof strValue; // "string" typeof strValue.prop; // "undefined" 

E isso acontece porque, novamente, o acessador de propriedade na segunda linha acima cria um novo object temporal, como:

 var strValue = ""; new String(strValue).prop = "foo"; // a new object which is discarded //...