JavaScript 数组的转换方法

在下面的例子中:

<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 请各位老师指点,多谢!

阅读 3.8k
5 个回答

alert的签名是alert(message: any), 如果message是一个字符串, 则直接使用之, 如果不是, 则会强制转换为字符串. 这一步操作并不是像上面的答案说的那样直接调用toString方法, 而是调用规范中的ToString(arguments)操作, 标准在http://www.ecma-international....

这样一来解释起来就麻烦了, 简单来说, 如果messagetoString方法的话会首先调用toString方法, 如果没有或者返回值不是字符串的话, 会调用valueOf方法, 然后再check, 再不行就要执行其它的了, 东西太多, 没功夫看.

不过不影响, 因为你传的入参是一个Array, Array是有toString方法的, 标准在http://www.ecma-international..., 它会依次对元素调用ToString(arguments)操作, 因为你的两个元素都有toString方法, 所以会调用它, 最后得到的结果是ArraytoString拼装的结果: ["Nicholas","Greg"]. 整个过程压根就没有toLocaleString什么事. 另外即使你没有定义toString方法, 你的两个对象上还是有toString的, 因为你这两个对象的原型就是Object.prototype, 如果对象没有一个属性, 会照着原型链往上查找, 所以还是有toString的, 只不过实现不一样, 得到的结果会是[object Object].

alert会对值做字符串转换 people+'' 的结果就是 "Nicholas", 可能是将对象转换为字符时js会查找最后一个return的值作为结果输出

对象属性并无所谓先后顺序,alert 会自动调用 toString 方法。

对象里不讲排序的……就这题而言,没有明确的去调用toLocaleString(),当然默认就去调toString()的咯。

谢谢各位老师的指点,明白了,非常感谢!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题