为什么 toString() 以两种不同的方式工作?

Why does toString() work in two different ways?

我经常以两种不同的方式使用 toString(),但直到最近我才意识到我不了解正在发生的事情的机制。

例如我用这个函数来return一个对象的类型:

var getType = function (obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
};

getType([1,2,3]) // returns "Array"

但如果我这样做

[1,2,3].toString()

我会得到

"1,2,3"

我认为 call 只是用给定的 this 调用函数,它等于 [1,2,3].

同样,我认为执行 [1,2,3].toString() 调用 toString 时也会将 [1,2,3] 作为 this 值。

两种情况都没有参数,this 值相同,有什么不同?

那是因为

Array.prototype.toString !== Object.prototype.toString

例如:

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