Javascriptstring是不是一个对象?

这不是一个笑话的设置,我真的问。

道格拉斯·克罗克福德(Douglas Crockford)喜欢说在JavaScript原型面向对象的语言中,不需要new

他解释说, new只是为了让人们从基于类的(即“ 古典 ”)面向对象编程语言中获得某种程度的舒适:

JavaScript,我们几乎没有new

JavaScript是一种原型语言,但它有一个new运算符,试图使它看起来有点像一种古典语言。 这往往混淆程序员,导致一些有问题的编程模式。

你永远不需要在JavaScript中使用new Object() 。 使用对象文字{}来代替。

好的:

  • new不好
  • {}很好

但是, 维奥托·德·阿劳霍 ( VítorDeAraújo)的评论者指出,两者并不相同 。 他举例说明一个string不像一个object

一个string对象和一个string值不是一回事:

 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 

string值不能有新的属性。 同样的事情对其他types是有效的。

这里发生了什么事情,一个string不是一个object ? 我混淆JavaScript与其他语言,一切都是一个对象?

“一切都是对象” ……这是语言中存在的一个重大误解。

并非 所有东西都是对象,我们称之为原始值 ,即string,数字,布尔值,空值和未定义的值。

这是真的,一个string是一个原始的值 ,但是你可以访问所有从String.prototypeinheritance的方法,就好像它是一个对象一样。

属性访问器操作符 (点和括号表示法)暂时将string值转换为String对象,以便能够访问这些方法,例如:

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

幕后发生的事情是这样的:

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

与其他原始值(如BooleanNumber ,也有对象包装器 ,它们只是包含原始值的对象,如下例所示:

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

虽然与原始:

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

发生这种情况的原因是,上面第二行的属性访问器再次创build一个新的时态对象,如下所示:

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