Javascript 何时使用.toString()是安全的?

Javascript 何时使用.toString()是安全的?,javascript,tostring,Javascript,Tostring,value是否必须返回toString()才能调用value.toString()?您知道什么时候可以调用value.toString() var newList=函数(val,lst) { 返回{ 值:val, 尾:lst, toString:function() { var result=this.value.toString(); 如果(this.tail!=null) 结果+=“;”+this.tail.toString(); 返回结果; }, 附加:函数(val) { if(this

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


var newList=函数(val,lst)
{
返回{
值:val,
尾:lst,
toString:function()
{
var result=this.value.toString();
如果(this.tail!=null)
结果+=“;”+this.tail.toString();
返回结果;
},
附加:函数(val)
{
if(this.tail==null)
this.tail=newList(val,null);
其他的
this.tail.append(val);
}
};
}
var list=newList(“abc”,null);//一串
列表。附加(3.14);//浮点数
list.append([1,2,3]);//阵列
document.write(list.toString());

作为状态,所有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 + ")";
    }
};
现在,如果您创建一个
新列表(…)
并调用它的
toString
方法(或通过任何函数或操作符隐式地将其转换为字符串),则将使用自定义的
toString
方法

最后,要检测对象是否有为其类定义的
toString
方法(请注意,这将用于子类化或对象文本;这留给读者作为练习),您可以访问其
构造函数
原型
属性:

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

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

但是,一般来说,如果您想知道对象上是否存在函数,可以这样测试它:

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

当然,这并不能确保
myMethod
是函数而不是属性。但你大概知道这一点。

真正的问题有一个动词和一个问号,我说“value不必返回toString()才能调用value.toString()?你什么时候知道可以调用value.toString()?”。这个问题实际上与链表没有任何关系。也许你可以给出一个比“链表”更有意义的标题以便对其他人有用。我在现实生活中也经常这样做。我想这就是我用太多不同语言工作的结果。:-)不,不是所有的对象。null没有属性。未定义也没有属性,尽管它不是对象@Aurimas
null
实际上不是一个对象。JS规范对此感到困惑。空指针缺少对象。看看这个问题的答案,这很有趣。谢谢你纠正我。无论如何,仍然值得指出的是,在某些情况下,toString的使用是不安全的。
if (obj.myMethod) {
    obj.myMethod();
}