【问题标题】:toString() method behaviour in Objects对象中的 toString() 方法行为
【发布时间】:2020-10-08 16:29:20
【问题描述】:

所以我在看一本 Js 的书,偶然发现了 Object to Primitive 转换这个美丽的话题。 作者在书中说

由于历史原因,如果 toString 或 valueOf 返回一个对象,没有错误,但该值被忽略(就像方法不存在一样)。那是因为在古代,JavaScript 中没有好的“错误”概念。

现在我尝试了这个,但没有像书中所说的那样:

let user = {
    name: "John",
    money: 1000,

   toString(){
       return {
           name: 'Bong'
       };
   }
  };

  alert(user);

我在控制台中收到错误消息:

未捕获的类型错误:无法将对象转换为原始值

但是,如果我这样做

alert(user.toString()); 

那么就没有错误了,它给出了[Object object]

请解释这种行为。

【问题讨论】:

    标签: javascript object javascript-objects


    【解决方案1】:

    alert 不会自动将非基元转换为字符串,您需要 toString() 方法。当您在非原语上调用 toString() 时,您会得到默认返回,即它的类型,并且由于 javascript 中的所有内容本质上都是一个对象,因此默认返回是 [Object object]

    【讨论】:

      【解决方案2】:

      在第一种情况下,user.toString 被隐式调用,因为alert 需要一个字符串,而user 不是一个字符串。当调用user.toString() 并且返回值不是字符串时,会抛出错误。

      在第二种情况下,user.toString 由您显式调用,它的名称是否为 toString 无关紧要,因为它会像任何其他方法一样返回内部对象(此处不需要原始值)。然后将内部对象传递给alert,它的toString 被隐式调用,它返回一个字符串,因为它没有被覆盖。为了清楚起见,第二种情况可以分为两部分:

      let obj = user.toString();    // first user.toString gets called, it will return the inner object
      alert(obj);                   // obj.toString will implicitly gets called and since that will return a string everthing will be fine
      

      如果内部对象有一个返回对象的toString,那么第二种情况也不起作用:

      let user = {
        name: "John",
        money: 1000,
      
        toString() {
          return {
            name: 'Bong',
            toString() {                  // toString of the inner object is overridden
              return {};                  // ... and it returns an object
            }
          };
        }
      };
      
      alert(user.toString());            // now even the second case won't work because when toString of the inner object is called, a string is expected, but instead an object is returned which is a no no

      【讨论】:

      • 非常感谢你的朋友。现在我明白了。
      • 对不起但是书上说如果toString或者valueOf返回一个对象就没有错误,?
      • 我明白你关于 string 的观点,但是为什么书上说它不会有错误,是书上有错误还是什么
      • @Thelostcause toString 从未抛出任何错误,是 alert 抛出错误,因为它无法显示对象,它需要一个原始值。
      • @Thelostcause 当您执行let obj = user.toString(); 时,无论toString 返回什么,它都会正常运行
      【解决方案3】:

      [object Object] 是对象的默认字符串表示。

      当你调用对象时;在对象上调用toString(),初始实现返回[object Object]

      如果您想查看对象,可以通过console.logJSON.stringify() 进行查看。您还可以遍历所有属性并单独检查它们。

      示例

      const objectOne = {};
      const objectTwo = new Object;
      const objectThree = {};
      
      objectThree.toString = function () { return "Bong" };
      
      alert(objectOne); // [object Object]
      alert(objectTwo); // [object Object]
      alert(objectThree); // Bong
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 2019-07-01
        • 2023-02-26
        相关资源
        最近更新 更多