关于javaScript中toString的问题

 var a = {};
var _ff = a.toString;
var arr = [1,2,3,4];
_ff.call(arr);         //"[object Array]"
toString(arr);         //"[object Object]"
_ff(arr);              //"[object global]"
arr.toString();        //"1,2,3,4"

同样的toString方法的调用

我想知道得出各种结果的原因

求大神帮忙解答

_ff.call(arr); 表示输出当前对象的字符串表示。Ecmascript5中定义的数组的标准写法就是"[object Array]",toString(arr)那个其实调用的是window.toString();而arr是没有任何意义的,把arr换成任何对象比如toString(0)、toString({})都是一样的输出,而且不同的浏览器显示的不一样,chrome下显示的是"[object Window]",_ff(arr)其实调用的是toString()这个函数本身,你可以直接输出_ff 看一下,会发现_ff输出的是一个函数,函数加上括号调用,就是调用该函数,因此返回"[object global]",这个结果也是跟浏览器相关的,chrome下显示的是"[object Undefined]",arr.toString()这个也是Ecmascript5的标准用法,数组的toString()默认就是用逗号分隔的。


```(1)
_ff.call(arr);   //"[object Array]"
// 注意 a 其实是一个空对象(不是数组),所以它的 toString() 其实就是默认object的toString()
// 但是又用了 arr 作为调用的主体对象,所以有类型 Array。比如:
_ff.call(new Date()); //"[object Date]"
_ff.call("abc"); //"[object String]"
// 假如你把 a 定义为数组,那么就是数组的输出了
var a = {};
...
_ff.call(arr);   //"1,2,3,4"
先说(3)
_ff(arr);        //"[object global]"
// 因为 toString() 是不需要参数的,这个arr参数直接被忽略。等于直接调用:
a.toString();
(2)
toString(arr);   //"[object Object]"
// 调用当前对象的 toString(),同样忽略arr。
// 很明显不是用默认的方法,自己实现过的。
(4)
arr.toString();  //"1,2,3,4"
// Array.toString(),没什么要多说的了