Object.prototype.toString.call(arrayObj) 和 arrayObj.toString() 之间的区别

Difference between Object.prototype.toString.call(arrayObj) and arrayObj.toString()

我已经阅读了一些材料,但在语法方面还没有完全掌握概念,例如:

var arrObj = [1,2,3];
Object.prototype.toString.call(arrObj); //Gives "[object Array]"
arrObj.toString(); // Gives "1,2,3"

第 2 行和第 3 行有何不同?据我了解,两者都调用 toString 方法并将当前对象设置为 'arrObj'.

toStringoverridden for Arrays;和 Object.prototype.toString 不同于 Array.prototype.toString

要获得与 call 相同的结果,请在 'correct' 方法上使用它:

 Array.prototype.toString.call(arrObj); // Gives "1,2,3"

这些 .call() 方法是将一种类型视为另一种类型的怪异方法。例如,NodeLists,作为具有 Array.prototype.forEach 的数组。当您将其作为对象调用时,它将 "convert it" 转换为对象字符串

Array.prototype.toString.call(arrObj);

完美运行。 Object.toString() 对待方式有点奇怪。 想象一下 编译器在做类似的事情:

[1, 2, 3] -> { 0: 1, 1: 2, 2: 3 }

那会 return [Object object]。 JavaScript,与其他语言不同,当他们遇到类型问题时,总能找到解决办法。


如果你正在编写一个函数,你可以这样做:

function myFunction (input) {
    window[input.constructor.name].prototype.toString.call(input);
}

由于toString是在Object.prototype中定义的,谁继承了Object,谁就会默认得到toString方法。

但是,Array 对象,覆盖默认的 toString 方法以将数组元素打印为逗号分隔的字符串。

Object.prototype.toString不知道它实际处理的是什么类型的Object。因此,它有意保持通用,并且始终打印对象的实际类型。这就是为什么

console.log(Object.prototype.toString.call(arrObj));

打印

[object Array]

这是传递的对象类型。但是,当您执行 arrObj.toString 时,您试图以字符串形式表示数组,因此 toStringArray 对象中被覆盖以将数组元素打印为逗号分隔的字符串。

这就是两个调用不同的原因。


但对于其他对象,toString 不会被覆盖,因此它们将使用 Object.prototype.toString 中的 toString。例如,

var obj = {
    1: 2
};

console.log(obj.toString());
// [object Object]

阅读 MDN 的示例 Overriding the default toString method