2

在许多网站上,我读到例如这两个是不同的:

var s1 = String('s1');     // typeof s1 == 'string'
var s2 = new String('s2'); // typeof s2 == 'object'

这同样适用于布尔值、数字等。

但是,我没有找到任何有用的信息来说明为什么这两种构造会产生不同类型的对象。有什么具体原因吗?有没有我会同时利用这两种方法的情况?

4

3 回答 3

3
var s1 = String('s1');

调用String返回字符串原语的函数。

var s2 = new String('s2');

作为构造函数调用String,该构造函数返回一个对象,即String.

String知道何时在非构造函数上下文中调用它。该语言的创建者故意决定在这种情况下不返回对象。

对于第一个示例,我能想象到的唯一有用的目的是类型转换,例如String(4)创建'4'. 但是还有其他方法可以实现这一点。

第二个示例似乎没有一个好的用例。当代码需要原语时,直接创建包装器对象甚至可能是有害的。例如:

var s2 = new String('s2');
doSomethingUseful(s2);

function doSomethingUseful(aParameter) {
  if (typeof aParameter === 'string') { //s2 isn't
于 2013-07-12T09:22:32.127 回答
1

这是为您准备的迷你常见问题解答。

为什么会有StringNumber对象?

原始值,喜欢"foobar"123不能有属性和方法,所以必须有实际持有这些的对象。

如何String使用Number对象?

它们被引擎本身隐式使用。每次评估基元的属性时,引擎都会为此创建一个新的隐式对象(这称为“自动装箱”)。比如x = "foobar".length变成这样:

 temp = new String("foobar")
 x = temp.length
 delete temp

我可以在自己的代码中使用String和对象吗?Number

你可以,但几乎不需要。由于自动装箱,您可以直接在原始值上调用所有对象的道具和方法。此外,基元和装箱对象在某些情况下表现不同,例如if(x)...if(new String(x))....

什么是String()Number()功能?

这些是StringNumber对象的构造函数。此外,当直接调用时new,它们会执行类型转换,即返回它们各自类型的新原语(不是对象)。在伪代码中,背后的逻辑String是这样的:

function String(primitiveValue) {
     primitiveString = convert_to_string(primitiveValue)
     if called with new
         return new StringObject(primitiveString)
     else
         return primitiveString

参考:http ://es5.github.io/#x15.5.1

String()直接调用Number()有用吗?

是的!每次需要类型转换时,您都想使用这些。有些人更喜欢 hack,比如+x代替Number(x)x+""代替String(x),但显式转换看起来更干净。

为什么typeof new String()object和不是string

new无论使用哪个特定的构造函数,通过 的方式创建的一切都是对象。

于 2013-07-12T10:10:45.687 回答
0

那么 String()、Function() 或 Boolean() 都是 Function 引用类型的对象。

在讨论这个问题之前,您应该知道 javascript 中有两种数据类型。
1)原始 - 用于简单的字符串、数字、未定义、空值、对象值等。包含变量。它们可以通过 typeof 运算符来区分。对于对象,这只会告诉给定变量是否包含引用类型的数据而不是什么类型的引用类型。
2)引用类型——它们就像其他oop语言中的类一样。它们是可以通过javascript创建的对象的类型。一些例子是——函数、日期、正则表达式、原始包装类型等。它们可以通过instanceof运算符来区分.

原始包装类型 - 实际上是包含原始值的对象,但它们的行为类似于通过引用传递其值的对象。它们是通过使用 new 运算符调用构造函数创建的。例如字符串 - 它们是包含字符串类型的值的对象。创建这些对象的语法

var str=new String("s2")

这里 str 表现为一个对象。

typeof(str)=="object"

而只是调用 String() 只是调用任何普通函数,其唯一目的是将任何其他原始值转换为字符串。

var s1 = String('s1');     // typeof s1 == 'string'

我希望我很清楚。如果您有任何疑问,请询问他们

于 2013-07-12T09:39:09.343 回答