为什么toString()和this.toString()会在Chrome的控制台中产生不同的结果?

时间:2012-01-20 16:01:30

标签: javascript google-chrome

现在这根本没有实际意义,但我很好奇这个我偶然发现的小怪癖。

基本上,在Chrome的开发者控制台中,这个

toString()

返回[object Object],而这

this.toString()

返回[object DOMWindow]

据我所知,这只发生在控制台上,如on this jsFiddle所示。有人在## javascript上找到this link来解释函数的来源。但是,它没有解释在控制台内部或外部使用时的行为差异。

那么为什么toString()this.toString()会在Chrome控制台中产生不同的结果呢?

3 个答案:

答案 0 :(得分:4)

WebKit碰巧在控制台中使用错误的上下文进行全局调用。

(Chrome 14):

> this
DOMWindow
> this.toString()
"[object DOMWindow]"
> toString()
"[object Object]"
> valueOf()
CommandLineAPI

我认为这已经修复了here

答案 1 :(得分:3)

Live example表明大多数"[object Window]"此错误主要适用于控制台。请注意,Object.prototype.toString.call(window)仍会返回全局

var s = toString;

console.log(s()); // "[object global]"
console.log(toString()); // "[object Object]"
console.log(window.toString()); // "[object Window]"

(function () { 
  var s = toString; 
  console.log(s()); // "[object Undefined]"
})();

(function () { 
  var s = window.toString; 
  console.log(s());  // "[object Window]"
})();

console.log(Object.prototype.toString.call(window)); // "[object global]"

console.log(window.toString.call(window)); // "[object DOMWindow]"

你发现了一包未定义的行为。我建议你逃跑。

部分结果可以解释为全局上下文和窗口对象可能不是同一个东西(大提示是[object global])。

请注意,在所有5个案例中this === window

请注意window.toString === Object.prototype.toString; // false解释了很多这方面的内容。似乎window.toString是一个特殊的(但不同的)函数

答案 2 :(得分:2)

  1. 使用第一个,控制台会告诉您对象Object,通过该对象拥有toString()函数以及继承的所有内容:

    toString()

  2. 使用第二个,它执行.toString()的{​​{1}}函数,在这种情况下是窗口对象:

    this.toString()


  3. 在我得到这个答案的-20之前,它是基于输出this的推论(所以我不确定):对我来说它告诉该方法是从[object Object]执行的

    如果你在Firebug中做同样的事情,它实际上是从Object对象执行的:

    enter image description here

    我想这个特定于控制台的实现......或Chrome版本中的错误。