gpt4 book ai didi

javascript - Javascript 字符串为什么不是对象?

转载 作者:行者123 更新时间:2023-11-28 07:13:56 27 4
gpt4 key购买 nike

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

Douglas Crockford is fond of saying在 javascript 原型(prototype)面向对象语言中,不需要 new

他解释说,添加new只是为了给来自基于类(即“经典”)面向对象编程语言的人们带来一定程度的舒适感:

JavaScript, We Hardly new Ya

JavaScript is a prototypal language, but it has a new operator that tries to make it look sort of like a classical language. That tends to confuse programmers, leading to some problematic programming patterns.

You never need to use new Object() in JavaScript. Use the object literal {} instead.

好的,很好:

  • {}

但是评论者 Vítor De Araújo pointed out that the two are not the same 。他举了一个例子来说明字符串对象不同:

A string object and a string value are not the same thing:

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

The string value cannot have new properties. The same thing is valid for other types.

字符串不是对象,这是怎么回事?我是否将 javascript 与其他一些语言混淆了,因为一切都是对象?

最佳答案

“一切都是对象”...这是该语言中存在的最大误解之一。

不是一切都是对象,有我们所说的原始值,它们是字符串、数字、 bool 值、null和未定义.

确实如此,字符串是一个原始值,但您可以像访问对象一样访问从 String.prototype 继承的所有方法。

该属性(property)accessor operators (点和括号表示法),临时将字符串值转换为 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"

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

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

关于javascript - Javascript 字符串为什么不是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com