2012-02-15 45 views
4

在JavaScript中,String是原始值。 但也是一个字符串对象... 原始值是直接放入变量的值。作为原始值的JavaScript和String

所以我的问题是:

var d = "foo"; 

并ð包含foo的直接或字符串对象像其他语言的参考?

谢谢。

回答

2

我认为Javascript中的每个变量实际上代表一个对象。即使一个函数是一个对象。

+0

不一定。某些类型的原始(文字)的类型和价值获得通过。其他对象(甚至功能,是)是引用类型... – FarligOpptreden 2012-02-15 08:30:04

0

找到this关于JavaScript的变量页,看来:

原始类型的JavaScript是布尔值,数字和文本。

0

我相信在Javascript中没有原语,至少在Java的意义上 - 一切都是某种对象。 所以是的,它是一个对象的引用 - 如果扩展字符串对象,d将具有该扩展名。

如果您指的是由语言提供的那些类型中的原语,那么您有几个布尔值,数字,字符串和日期都是由该语言定义的。

6

如果我理解正确,d将包含字符串文字“foo”,而不是对对象的引用。然而,JavaScript引擎将有效地投字面来的String实例在必要的时候,这就是为什么你可以调用的String.prototype方法对字符串字面量:

"some string".toUpperCase(); //Method of String.prototype 

MDN下面的代码片段可能有助于进一步解释(强调):

字符串常量(双或单引号表示)和字符串 从字符串返回在非构造背景(即调用,无需使用new关键字 )是原始字符串。 JavaScript自动地将 转换为基本字符串和字符串对象,因此可以使用 字符串对象方法来处理基本字符串。在基元字符串上调用 方法或发生属性查找 的上下文中,JavaScript将自动包装字符串基元,并调用该方法或执行属性查找。

这一切都在specification中详细解释,但它不是很容易阅读。我最近问了一个related question(关于为什么有可能做到上述),所以它可能值得阅读(非常)详细的答案。

3

如果定义

var d = "foo"; 

d直接包含foo 但是,如果定义

var S = new String("foo"); 

然后SObject

实施例:

var s1 = "1"; 
var s2 = "1"; 
s1 == s2 -> true 
var S1 = new String("2"); 
var S2 = new String("2"); 
S1 == S2 -> false 
1

我发现了两个有用的文章,详细说明这一点,位于herehere。好像在JavaScript的基本类型的值传递(即当您传递,如果一个函数它获取函数内的“沙箱”和原始变量的值不会改变),而引用类型都通过了,你猜对了,通过引用并将它传递给一个函数将会改变原来的变量。

原始类型在JavaScript是文本(字符串),数字(浮点/ INT),布尔和NULL(和可怕的 “未定义” 类型)。任何自定义对象,函数或标准数组都被视为引用类型。我没有研究Date类型,虽然,但我敢肯定它会落入原始类型。