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

Ada*_*ady 10 javascript object tostring

我已经阅读了一些材料,并且在语法方面没有完全掌握这个概念,如下所示:

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

2号线和3号线有何不同?据我所知,两者都调用toString方法,当前对象设置为'arrObj'.

the*_*eye 12

由于toString定义了Object.prototype,无论谁继承Object,默认情况下都会获得该toString方法.

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

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

console.log(Object.prototype.toString.call(arrObj));
Run Code Online (Sandbox Code Playgroud)

版画

[object Array]
Run Code Online (Sandbox Code Playgroud)

这是传递的对象的类型.但是,当你这样做时arrObj.toString,你试图以String形式表示数组,因此toStringArray对象中重写以将数组元素打印为逗号分隔的字符串.

这就是为什么两个电话都不同的原因.


但是在其他对象的情况下,toString不会覆盖,所以他们将使用toStringfrom Object.prototype.toString.例如,

var obj = {
    1: 2
};

console.log(obj.toString());
// [object Object]
Run Code Online (Sandbox Code Playgroud)

阅读MDN的覆盖默认方法的示例toString


use*_*740 6

toString重写为阵列 ; 并且 Object.prototype.toString不同于Array.prototype.toString.

要获得相同的结果,请call在"正确"方法上使用它:

 Array.prototype.toString.call(arrObj); // Gives "1,2,3"
Run Code Online (Sandbox Code Playgroud)