【问题标题】:Is there any difference in creating string object [duplicate]创建字符串对象有什么区别[重复]
【发布时间】:2014-03-11 22:53:02
【问题描述】:

这样创建字符串对象有什么区别

var txt = new String("Hello World");

还有这个

var txt = "Heloo World";

【问题讨论】:

    标签: javascript


    【解决方案1】:

    原始数据类型有:

    • 字符串
    • 号码
    • 布尔值

    如果您使用:

    var txt = "Heloo World";
    

    这是原始类型数据类型alert(typeof txt); 会给你字符串类型。

    在 JavaScript 中,所有变量都可以是对象类型,对于每个基元,它们都是对象类型。

    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
    

    【讨论】:

    • 值得注意的是:undefinednull 是另外两种原始数据类型。
    • 见文章,这些是特殊数据类型。
    • @ZaheerAhmed 不符合 ECMAScript 规范:ecma-international.org/publications/files/ECMA-ST-ARCH/…A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String
    • @freakish 谢谢,是的,它们是原始类型,但通常没有其他语言具有这些数据类型,我说这些是特殊的原始数据类型。感谢您的链接。
    • 酷!让我们争论语义,@ZaheerAhmed!谢谢你,@freakish——你打败了我。
    【解决方案2】:

    首先让我们打破一些神话。字符串文字不是语法糖。

    > 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
    

    【讨论】:

    • 谁说它们是合体糖?
    • @Bergi Bloodcount(请参阅下面的答案)。另外:有关系吗?
    • 我不认为一个人可以“打破”不存在的神话:-)
    【解决方案3】:

    第一个返回一个String对象,第二个返回一个字符串。

    typeof txt; //object
    typeof txt2; //string
    

    虽然他们的行为可能相似,但txt !== txt2

    【讨论】:

    • 文字字符串“继承”来自String.prototype
    • 说的对,都没注意到
    • @freakish:不,他们没有:"foo" instanceof String == false
    • @Bergi 这就是我使用引号的原因。我的意思是文字可以使用String.prototype 的方法。除了"test".__proto__ == String.prototype.
    • @freakish:对原语的属性访问很神奇,不算数。 String.prototype.isPrototypeOf("") == false.
    【解决方案4】:

    不过要小心这个,

    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】:

      由 new 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"
      

      希望这会有所帮助..

      【讨论】:

      • @RUJordan..同意并更新!!
      • 这不是唯一的优势。通过引用传递是另一回事。
      • 有区别!请参阅下面的怪诞答案。
      【解决方案6】:
      var txt = "Heloo World";
      

      这里的“txt”是一种原始数据类型。它没有方法,只不过是一个指向原始数据内存引用的指针,这解释了随机访问速度要快得多。

      var txt = new String("Hello World");
      

      如果您使用 new,则表示您要创建一个 Object 的实例。因此,new String 正在生成一个包装 String 原语的 Object,这意味着对它的任何操作都涉及额外的工作层。

      【讨论】:

      • 这不是真的:文字字符串确实有方法。更重要的是:它与String 具有相同的原型。尝试向String.prototype 添加任何方法,您会发现它也可以在文字字符串中使用。所以唯一的区别是第一个是对象,第二个不是。
      • @freakish:不。原始值没有值。但是,当您对原始值使用属性评估器时,会发生一些神奇的事情……
      • @Bergi 从程序员的角度来看,“拥有方法”和“能够访问方法”有什么区别?
      • @freakish:在实践中可能是无关紧要的。但是,“有方法”和“能够分配方法”有什么区别呢?
      • @Bergi 我相信你会同意“我有”和“我不能有更多”之间的区别。 "x".test = 1 根本不起作用(它至少应该抛出一个异常恕我直言,而不仅仅是静默失败)。
      【解决方案7】:

      一个是字符串原语,另一个是字符串对象。 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
      

      【讨论】:

      • 请解释为什么-1
      • 请-1'd这个答案的人解释一下。
      【解决方案8】:

      String 构造函数返回一个 String 类型的对象。通常,您需要一个文字字符串值,因为严格比较一个对象与文字总是会返回 false。

      【讨论】:

      • 出于同样的原因,我相信这也会在 JSLint 中引发错误。
      【解决方案9】:

      没什么,真的。在第一个示例中,您调用类String 的构造函数并将字符串的主体作为参数,在第二个示例中,它在解释阶段自动完成。

      所以基本上第二个是syntactic sugar,而第一个不是。

      在功能上没有区别。

      【讨论】:

      • -1:功能和文字字符串存在差异不是语法糖(否则您将如何将字符串传递给String的构造函数?)。查看其他人的答案。
      • 有道理,我应该研究一下。
      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2014-12-23
      • 2011-01-11
      • 2011-02-26
      • 2021-10-25
      • 2013-06-19
      相关资源
      最近更新 更多