2011-08-09 14 views
9

可能重复:
Why are there two kinds of JavaScript strings?什么是任何框架或任何人会需要使用String/Number/Boolean对象而不是原始版本的原因?

例如,我们需要,如果我们需要被动态地计算正则表达式表达式中使用的new RegExp()代替正则表达式字面。

但是到底什么是边界情况当任何人需要使用字符串/数字/布尔对象而不是他们的原始版本? (因为我似乎无法甚至认为一个在哪里它永远需要)

+2

无论如何,我投了票,因为这是一个很好的问题。 –

+0

我能想到的一个原因是为特定的字符串实例添加一个新的属性(无论出于何种原因)。你必须用'new String'创建这个字符串。 –

回答

1

一个StringObject,但原始的版本存在,这是作为一个文字创造了'Hello'(并且是目前最常见的用过的)。

例如,在一个函数中,人们有时使用new String()将另一种类型转换为String

function leadingZero(number, padding) { 
    number = new String(number); 
    ... 
} 

前导零不在一个Number显著,所以它必须是一个String

但是,我仍然希望将Number一个String连接到一个空的String'')。

function leadingZero(number, padding) { 
    number += ''; 
    ... 
} 

这将隐式调用NumbertoString(),返回String原始。

我读别人说typeof foo==="string"不是傻瓜证明,因为如果使用new String创建的字符串typeof会给我们object

你可以做一个傻瓜证明像这样isString()方法...

var isString = function(str) { 
    return Object.prototype.toString.call(str) == '[object String]'; 
} 

jsFiddle

这适用于多window环境。您还可以检查constructor属性,但在多个window环境中失败。

另请参阅Felix Kling对此解答的评论。

+1

您也可以通过直接调用'toString()'方法来转换为字符串。 –

+0

是的,这就是我所说的。与使用“”串联相比,使用'new String'有什么好处?否则为什么人们甚至有理由使用'new String' * *? – Pacerier

+0

@Felix你是对的,我相信与字符串连接会隐式地在非字符串中调用该方法('toString()')。 – alex

相关问题