在下面的例子中:
<script>
var person = {
toLocaleString: function () {
return "Nikolaos";
},
toString: function () {
return "Nicholas";
}
};
var person2 = {
toLocaleString: function () {
return "Grigorios";
},
toString: function () {
return "Greg";
}
};
var people = [person, person2];
alert(people);
toLocaleString()方法在toString()方法之前,为什么弹出的结果是: Nicholas,Greg 请各位老师指点,多谢!
alert
的签名是alert(message: any)
, 如果message
是一个字符串, 则直接使用之, 如果不是, 则会强制转换为字符串. 这一步操作并不是像上面的答案说的那样直接调用toString
方法, 而是调用规范中的ToString(arguments)
操作, 标准在http://www.ecma-international....这样一来解释起来就麻烦了, 简单来说, 如果
message
有toString
方法的话会首先调用toString
方法, 如果没有或者返回值不是字符串的话, 会调用valueOf
方法, 然后再check, 再不行就要执行其它的了, 东西太多, 没功夫看.不过不影响, 因为你传的入参是一个
Array
,Array
是有toString
方法的, 标准在http://www.ecma-international..., 它会依次对元素调用ToString(arguments)
操作, 因为你的两个元素都有toString
方法, 所以会调用它, 最后得到的结果是Array
的toString
拼装的结果:["Nicholas","Greg"]
. 整个过程压根就没有toLocaleString
什么事. 另外即使你没有定义toString
方法, 你的两个对象上还是有toString
的, 因为你这两个裸对象的原型就是Object.prototype
, 如果对象没有一个属性, 会照着原型链往上查找, 所以还是有toString
的, 只不过实现不一样, 得到的结果会是[object Object]
.