2012-01-20 2 views
4

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

В основном, в консоли разработчика в Chrome, этот

toString() 

возвращает [object Object], в то время как этого

this.toString() 

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

Насколько я знаю, это происходит только с консоли, как можно видеть on this jsFiddle. Кто-то на ## найден javascript this link, объясняя, откуда эта функция. Тем не менее, это не объясняет расхождения в поведении при использовании внутри или вне консоли.

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

+0

' "[объект Window]"' возвращается для в Firebug. – Chad

+0

Оба являются '' [object DOMWindow] "' в Chrome 16. –

+0

@AshBurlaczenko ах, так что, возможно, там была ошибка, которая была исправлена. Если вы можете найти отчет об этом и опубликовать в качестве ответа, я бы его принял. –

ответ

4

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

(Хром 14):

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

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

+1

Это будет иметь большой смысл. 'valueOf(). toString()' возвращает "[object Object]". –

+0

+1 для '.valueOf()' – Raynos

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

    toString()

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

    this.toString()


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

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

enter image description here

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

+2

Но я вызываю функцию. На самом деле это * возвращает * строку, содержащую «объект объекта». Это не консоль. –

+1

Это не говорит вам о функции – Raynos

+1

Я не верю (1). – Pointy

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]" 

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

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

Отметьте, что this === window во всех 5 случаях.

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

+0

Хотя это вряд ли ответ, я согласен с вашей оценкой. –

+0

+1 Вы можете объяснить немного больше? – qwertymk

Смежные вопросы