Почему toString () и this.toString () дают разные результаты в консоли Chrome? - PullRequest
5 голосов
/ 20 января 2012

Теперь это не имеет никакого практического значения, но мне любопытно, с какой маленькой причудой я наткнулся.

По сути, в консоли разработчика Chrome

toString()

возвращает [object Object], тогда как

this.toString()

возвращает [object DOMWindow].

Насколько я знаю, это происходит только с консоли, как можно видеть на этом jsFiddle ,Кто-то на ## javascript нашел эту ссылку , объясняющую, откуда взялась функция.Однако это не объясняет расхождения в поведении при использовании внутри или снаружи консоли.

Так почему toString() и this.toString() дают разные результаты в консоли Chrome?

Ответы [ 3 ]

4 голосов
/ 20 января 2012

WebKit использовал неверный контекст для глобальных вызовов в консоли.

(Chrome 14):

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

Я думаю, что это было исправлено здесь

3 голосов
/ 20 января 2012

Живой пример показывает, что большинство из них "[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]"

Вы нашли мешок с неопределенным поведением. Я рекомендую вам убежать.

Часть этого можно объяснить, сказав, что глобальный контекст и объект окна, вероятно, не одно и то же (большой намек [объект глобальный]).

Обратите внимание, что this === window во всех 5 случаях.

Обратите внимание, что window.toString === Object.prototype.toString; // false объясняет довольно многое из этого. Похоже, window.toString это специальная (но другая) функция

2 голосов
/ 20 января 2012
  1. С первым из них консоль сообщает вам об объекте Object, которому принадлежит функция toString () и от которого все наследует :

    toString()

  2. Со вторым выполняется .toString() функция this, которая в данном случае является объектом окна:

    this.toString()


Прежде чем я получу -20 за этот ответ, это вывод (поэтому я не уверен) на основе вывода [object Object]: для меня это говорит о том, чтометод выполняется из Object.

Если вы делаете то же самое в Firebug, он фактически выполняется из объекта window:

enter image description here

Я думаю,это специфично для реализации консоли ... или ошибка в этой версии Chrome.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...