2014-12-13 29 views
1

在我的数据结构类中,我了解到在引擎盖下字符串实际上是字符数组,这意味着字符串必须是引用变量而不是基本变量。然而,在JS中,情况并非如此 - 在JS中字符串确实被认为是原始类型。更令人惊讶的是,JS是用C语言编写的,与Python和Ruby相同 - 两种处理字符串都是引用变量。JS:字符串真的是原始类型吗?如果是这样,这怎么可能?

字符串真的是原始类型吗?如果是这样,这怎么可能?

+4

这里给出的链接是怎样的? – raina77ow 2014-12-13 12:50:28

+1

JS为什么写在C中令人惊讶?为什么C处理字符串的方式会影响写在其中的语言如何处理字符串? – JJJ 2014-12-13 12:59:07

+2

JavaScript(ECMAScript,真的)是*语言规范*。你用什么语言来实现它没有任何意义。 – Tomalak 2014-12-13 13:04:48

回答

3

是的,字符串真的是原始的。那么,那些不是对象的是。用于创建编译器或解释器的语言不需要对正在编译或解释的语言如何执行任何操作产生任何影响。

人们有时会被这样一个事实困惑,即虽然它们是原始的,但它们有属性(如length)和方法(如toLowerCase),这使得它看起来像是对象。所以我们来探讨一下。

当你看到访问字符串的属性的表达,也许是方法:

str = str.toLowerCase(); 

...发生的事情是字符串原始提升为String对象,然后该对象的方法使用,然后临时对象被扔掉。这是建立在语言,在§11.2.1和(更多的点)§8.7.1覆盖(在turgid散文),在步骤1它使用抽象ToObject方法。

这适用于大多数基元(字符串,数字和布尔值)。另外两个(nullundefined)没有等效的对象。

当你的属性赋值给原始字符串时,此行为甚至可以工作,但由于创建的临时对象被丢弃,属性立即消失。例如,这是有效的,并会运行:

var str = "foo"; 
str.someSpecialProperty = "bar"; 
console.log(typeof str.someSpecialProperty); // "undefined" 

...但对象属性添加到立即消失,使之有效地无操作,因此在财产被在年底未知的(因为它不是在第二个创建的临时对象)。


当我说:“嗯,这是不是对象的有”我的意思是,你可以明确地创建一个字符串对象

var strObj = new String(); 

这是一个对象,而不是原始:

var str = "foo"; 
 
snippet.log("typeof str = " + typeof str);  // "string" 
 
var strObj = new String("foo"); 
 
snippet.log("typeof strObj = " + typeof strObj); // "object"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

想要做到这一点非常罕见,但您可以。

+0

是的,所谓的**自动装箱** – Leo 2014-12-13 12:56:24

+0

@Leo:它与Java的自动装箱*相似,但略有不同,我从来没有听说过这个术语适用于JavaScript。 – 2014-12-13 12:57:27

+0

语言规范不使用该短语。当有人试图向人们(熟悉其他OOP语言)向人们解释它时,通常使用它,尽管不是100%准确:) – Leo 2014-12-13 13:04:34

相关问题