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.prototype
inheritance的方法,就好像它是一个对象一样。
属性访问器操作符 (点和括号表示法)暂时将string值转换为String对象,以便能够访问这些方法,例如:
"ab".charAt(1); // "b"
幕后发生的事情是这样的:
new String("ab").charAt(1); // "b", temporal conversion ToObject
与其他原始值(如Boolean
和Number
,也有对象包装器 ,它们只是包含原始值的对象,如下例所示:
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 //...