创建像这样的字符串对象
之间有什么区别var txt = new String("Hello World");
和这个
var txt = "Heloo World";
答案 0 :(得分:3)
首先让我们破坏一些神话。字符串文字不是语法糖。
> var txt = new String("Hello World");
> typeof x
"string"
> var txt2 = "Hello World";
> typeof txt2
"object"
正如你所看到的,这两件事是不同类型的。甚至更多:其中一个是对象,第二个不是。这有一个实际的后果,如:
> new String("Hello World") == new String("Hello World")
false
> "Hello World" == "Hello World"
true
另一个区别是原语通过值传递,而对象通过引用传递。如果你传递许多大字符串,这可能会节省一些内存。然而,对象和文字都是不可变的,所以它真的不是一个大问题(如果你不打算修改它们,为什么你会传递很多大字符串呢?)。
此外,您可以向对象添加属性,但不能将它们添加到基本类型。但这并非100%正确。您可以将属性添加到基元的原型中。请注意,文字和对象都具有相同的原型:
> String.prototype.test = 11;
> var x = new String("x");
> x.test;
11
> var y = "x":
> y.test;
11
答案 1 :(得分:1)
由新String(“foo”)创建的String对象几乎没有实际用途。 String对象相对于原始字符串值的唯一优势是作为对象,它可以存储属性:
var str = "foo";
str.prop = "bar";
alert(str.prop); // undefined
var str = new String("foo");
str.prop = "bar";
alert(str.prop); // "bar"
希望这会有所帮助..
答案 2 :(得分:1)
String构造函数返回String类型的对象。通常,您需要一个文字字符串值,因为严格地将对象与文字进行比较将始终返回false。
答案 3 :(得分:1)
一个是字符串基元,另一个是String对象。 String对象优先于字符串原语的优点是它可以存储属性
var x = "foobar"
x.y = "hello"
console.log(x.hello) /* Undefinded*/
var z = new String("foobar")
z.y = "hello"
console.log(z.y) /* hello*/
typeof x = "string"
typeof z = object.
也
x==z //true
x===z // false
答案 4 :(得分:1)
没什么,但要注意这一点,
var s = new String('A');
var s1 = String('A');
var s2 = 'A';
console.log(s === 'A');//fasle -- since type is Object
console.log(s1 === 'A');//true
console.log(s2 === 'A');//true
答案 5 :(得分:0)
第一个返回一个String对象,第二个返回一个字符串。
typeof txt; //object
typeof txt2; //string
虽然它们可能表现相似,但txt !== txt2
答案 6 :(得分:0)
var txt = "Heloo World";
这里'txt'是原始数据类型。它没有方法,只不过是指向原始数据存储器引用的指针,这解释了随机访问速度更快的速度。
var txt = new String("Hello World");
如果您使用new,则明确声明您要创建Object的实例。因此,新的String正在生成一个包装String原语的Object,这意味着对它的任何操作都涉及额外的工作层。
答案 7 :(得分:0)
原始数据类型是:
如果您使用:
var txt = "Heloo World";
这是基本类型数据类型alert(typeof txt);
将为您提供字符串类型。
在JavaScript中,所有变量都可以是对象类型,对于每个基元,它们都是Object类型。
var txt = new String("Heloo World");
这里typeof
会给你一个对象。
有关差异,请参阅jsfiddle
var str="text";
alert(typeof str); //string
var str2="text";
alert(str === str2); //true
str = new String("text changed");
alert(typeof str); //object
var str2 = new String("text changed");
alert(str === str2); //false
答案 8 :(得分:-1)
没什么,真的。在第一个示例中,您调用类String
的构造函数,并将字符串的主体作为参数放置,如第二个示例中所示,它在解释阶段自动完成。
所以基本上第二个是syntactic sugar
,其中第一个不是。{/ p>
功能上存在无差异。