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

问题描述 投票:5回答:3

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

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

toString()

返回[object Object],而这

this.toString()

返回[object DOMWindow]

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

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

javascript google-chrome
3个回答
4
投票

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

(Chrome 14):

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

我认为这已经修复了here


3
投票

Live example显示大多数是"[object Window]"这个bug主要适用于控制台。请注意,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]"

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

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

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

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


2
投票
  1. 使用第一个,控制台会告诉您有关对象Object的信息,通过该对象,toString()函数被拥有并且所有内容都继承自:
  2. 对于第二个,它执行.toString()this函数,在这种情况下是窗口对象:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.