为什么document.write()和alert()方法以不同的方式呈现JavaScript对象?

时间:2013-04-20 01:57:40

标签: javascript

打印数组和对象时,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对象,它会打印[对象HTML集合],这里是打印值。

4 个答案:

答案 0 :(得分: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]

有关其他信息,请参阅toString on MSDN

答案 1 :(得分:1)

alertdocument.write都设置为使用.toString()方法。对于object类型的实例,通常会打印[object Object]。但是,Array类重载了此方法以打印数组的内容。尝试执行arr.toString()来证明这种情况。如果您创建一个对象并为其提供toString方法,则会调用它来进行提醒。例如:

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

将显示一个警告,其中包含字符串"我是一个对象!"在它。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

延长Jonathan Sampson的答案并给予一点思想破碎......

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 );

See demo