【问题标题】:When is it safe to use .toString()?什么时候可以安全使用 .toString()?
【发布时间】:2009-06-26 19:48:31
【问题描述】:

value 不是必须返回 toString() 才能调用 value.toString() 吗?你什么时候知道可以调用 value.toString()?

<script>
var newList = function(val, lst)
{
  return {
    value: val,
    tail:  lst,
    toString: function() 
    {
      var result = this.value.toString();
      if (this.tail != null)
        result += "; " + this.tail.toString();
      return result;
    },
    append: function(val)
    {
      if (this.tail == null)
        this.tail = newList(val, null);
      else
        this.tail.append(val);
    }
  };
}

var list = newList("abc", null); // a string
list.append(3.14); // a floating-point number
list.append([1, 2, 3]); // an array
document.write(list.toString());
</script>

【问题讨论】:

  • 真题有动词和问号
  • 我说“不是 value 必须返回 toString() 才能调用 value.toString() 吗?你什么时候知道可以调用 value.toString()?”。
  • 这个问题真的和链表没有任何关系。
  • 也许你可以给一个比“链表”更有意义的标题,这样它可以对其他人有用

标签: javascript tostring


【解决方案1】:

【讨论】:

  • 不,不是所有的对象。 null 没有属性。 undefined 也没有属性,尽管它不是一个对象。 jsfiddle.net/bca30e5h
  • @Aurimas null 并不是真正的对象。 JS 规范对此感到困惑。空指针缺少一个对象。请参阅this 和该问题的其他答案。
  • 这很有趣。谢谢你纠正我。无论如何,仍然值得指出的是,在某些情况下 toString 使用起来并不安全。
【解决方案2】:

正如Mr. Shiny and New 所说,所有 JavaScript 对象都有一个toString 方法。但是,该方法并不总是有用,尤其是对于自定义类和对象字面量,它们往往会返回类似 "[Object object]" 的字符串。

您可以通过将具有该名称的函数添加到类的原型中来创建自己的 toString 方法,如下所示:

function List(val, list) {
    this.val = val;
    this.list = list;

    // ...
}

List.prototype = {
    toString: function() {
        return "newList(" + this.val + ", " + this.list + ")";
    }
};

现在,如果您创建一个new List(...) 并调用它的toString 方法(或通过任何将其隐式转换为字符串的函数或运算符运行它),您的自定义toString 方法将被使用。

最后,检测一个对象是否为其类定义了toString 方法(请注意,这不适适用于子类化或对象字面量;留给读者练习) ,您可以访问其constructorprototype 属性:

if (value.constructor.prototype.hasOwnProperty("toString")) {
    alert("Value has a custom toString!");
}

【讨论】:

  • 嘿。我在现实生活中也一直这样做。我想这就是我用太多不同的语言工作的结果。 :-)
【解决方案3】:

document.write 和 window.alert 一样,在写入或返回任何内容之前调用其参数的 toString 方法。

【讨论】:

    【解决方案4】:

    其他答案是正确的,toString 存在于所有 Javascript 对象上。

    不过,一般来说,如果您想知道对象上是否存在函数,您可以像这样对其进行测试:

    if (obj.myMethod) {
        obj.myMethod();
    }
    

    当然,这并不能确保myMethod 是一个函数而不是一个属性。但想必你会知道的。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多