1

document.write()方法和window.alert()打印数组和对象时有什么区别?

此代码示例中显示了不同的行为:

var arr = new Array("Maizere","Pathak");

document.write(arr); // output: Maizere,Pathak
alert(arr); // output: maizere,pathak

为什么他们都打印值?不应该alert()打印Object Object吗?

使用 DOM 对象,它会打印 [object HTML collection],这里是打印值。

4

4 回答 4

2

JavaScript 中的对象有一个toString方法。每当以预期文本的方式使用对象时,都会调用此方法。例如,以下输出[object Object]

alert({});

数组有自己的toString方法版本,可以做一些完全不同的事情。它们不是显示它们的类型,而是显示它们的内容,并用逗号连接。如果您愿意,可以替换数组toString方法:

var names = ['Jonathan', 'Sampson'];

names.toString = function () {
    return this.length;
};

alert(names); // Outputs 2

toString如果您愿意,也可以使用其他实现:

document.toString.call(names); // [object Array]

有关其他信息,请参阅toStringMSDN

于 2013-04-20T02:07:15.957 回答
1

两者alertdocument.write都设置为使用该.toString()方法。对于 type 的实例object,这通常打印出来[object Object]。但是,Array 类重载了这个方法来打印数组的内容。尝试做arr.toString()以表明情况确实如此。如果您创建一个对象并给它一个 toString 方法,它将被调用以进行警报。例如:

var obj = {};
obj.toString = function() { return "I'm an Object!"; }
alert(obj);

将显示带有字符串“我是对象!”的警报。在里面。

于 2013-04-20T02:11:11.480 回答
1

document.write 和 window.alert 方法都使用字符串,因此 Array.toString 方法将用于从数组中生成字符串值。

toString 方法从不同类型的对象生成的内容可能因浏览器而异,但您将从 document.write 和 window.alert 获得相同的结果,因为它们使用相同的方法生成字符串。

于 2013-04-20T02:13:37.337 回答
1

为了扩展乔纳森桑普森的答案并给一个小小的心灵破碎机......

var names = ['Jonathan', 'Sampson'];
names.toString = function () {return 0;};
names.valueOf = function () {return 1;};

console.log(names + ""); // 1 or 0 ? What do you think.
console.log(names.toString()); // 1 or 0 ? What do you think.¨
alert( names );

看演示

于 2013-04-20T02:15:18.253 回答