【问题标题】:2 Objects (created via new keyword for String) on addition NOT giving [Object][Object] (JavaScript)2 个对象(通过字符串的 new 关键字创建)不提供 [Object][Object] (JavaScript)
【发布时间】:2020-09-07 13:39:28
【问题描述】:

这个问题是基于上一个问题:

Difference in these 2 Strings (JavaScript)

人们回答说通过两种不同的方式创建字符串是有区别的:

  1. String Literal 创建字符串 (var a = "abc")
  2. new 关键字创建字符串对象,我假设它是一种对象(var b = new String("def")

现在,typeof 在第一种情况下将返回 字符串。在第二种情况下,它将返回 Object。我很好,开发它的人可能有某种 JS 引擎的工作方式。

但是,那么,在下面的例子中,为什么我在最后一行得到的答案是abcdef。现在,这也应该安慰[object][object],如上一行。现在我真的很困惑,new String 要么是创建一个字符串,要么是对象还是什么?只是不一致!

谁能帮我解释一下?

var obj1 = new Object({name: "Peter"});
var obj2 = new Object({age: 29});
var str1 = new String("abc");
var str2 = new String("def");
console.log(obj1);
console.log(obj2);
console.log(str1);
console.log(str2);
console.log(obj1 + obj2);
console.log(str1 + str2); 

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    new String 创建一个String 对象,它继承自Object,但有自己的.toString.valueOf 方法,所以它会打印字符串内容。

    var o = new Object();
    var s = new String("foo");
    
    console.log(o.toString === s.toString); // false
    console.log(o.valueOf === s.valueOf);   // false

    您可以用自己的方法覆盖它们以查看它们是否被调用。请务必也调用原件。

    var s = new String("foo");
    
    s.valueOf = function() {
        console.log("custom valueOf");
        return String.prototype.valueOf.call(this);
    }
    s.toString = function() {
        console.log("custom toString");
        return String.prototype.toString.call(this);
    }
    
    console.log(s + s);
    [""].join(s);

    【讨论】:

    • 是的,但我没有在任何地方使用过 .toString() 或 .valueOf()。我正在添加 2 个对象。没有任何意义,或任何代码转换行。
    • @Deadpool 这是 + 运算符进行内部转换,因为将两个对象与 + 连接起来没有意义。
    【解决方案2】:

    但是,那么,在下面的例子中,为什么我在最后一行得到的答案是 abcdef。现在,这也应该安慰 [object][object],如上一行。

    不同之处在于String 对象有一个默认的valueOf 方法,该方法返回对象中包含的字符串值。

    Object 对象有一个更通用的valueOf 方法,它只返回一个[object Object] 字符串

    见-

    const one =
      { valueOf: _ => 1 }
      
    const two =
      { valueOf: _ => 2 }
      
    console.log(one + two)
    // 3

    您可以将valueOf 定义为任何东西-

    const foo =
      { valueOf: _ => "foo" }
      
    const bar =
      { valueOf: _ => "bar" }
      
    console.log(foo + bar)
    // "foobar"

    【讨论】:

    • 好的,所以整个故事是关于 - “专门开发的 .valueOf()”,无论我们是否知道,它总是运行,并且 - 为 new String(), new Number, new BigInt, new Boolean() 编码不同。但是对于new Object,它没有以相同的方式开发吗?是吗。
    • 不,您几乎从不使用+ 将对象添加在一起。 JavaScript + 适用于字符串和数字,但不支持运算符重载。所以你已经将方法命名为Array.prototype.conat 而不是[1] + [2]valueOf 是一种特殊的后备情况,您的对象被动态强制,您有机会尝试输出一些合理的值。在实践中,虽然你想定义行为而不是依赖valueOf
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2012-06-06
    • 2023-04-09
    • 2011-07-27
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多