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'.
toString
是 overridden 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
时,您试图以字符串形式表示数组,因此 toString
在 Array
对象中被覆盖以将数组元素打印为逗号分隔的字符串。
这就是两个调用不同的原因。
但对于其他对象,toString
不会被覆盖,因此它们将使用 Object.prototype.toString
中的 toString
。例如,
var obj = {
1: 2
};
console.log(obj.toString());
// [object Object]
阅读 MDN 的示例 Overriding the default toString
method
我已经阅读了一些材料,但在语法方面还没有完全掌握概念,例如:
var arrObj = [1,2,3];
Object.prototype.toString.call(arrObj); //Gives "[object Array]"
arrObj.toString(); // Gives "1,2,3"
第 2 行和第 3 行有何不同?据我了解,两者都调用 toString 方法并将当前对象设置为 'arrObj'.
toString
是 overridden 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
时,您试图以字符串形式表示数组,因此 toString
在 Array
对象中被覆盖以将数组元素打印为逗号分隔的字符串。
这就是两个调用不同的原因。
但对于其他对象,toString
不会被覆盖,因此它们将使用 Object.prototype.toString
中的 toString
。例如,
var obj = {
1: 2
};
console.log(obj.toString());
// [object Object]
阅读 MDN 的示例 Overriding the default toString
method