Skip to content

Instantly share code, notes, and snippets.

@tsaniel
Forked from 140bytes/LICENSE.txt
Created October 5, 2011 10:05
Show Gist options
  • Select an option

  • Save tsaniel/1264086 to your computer and use it in GitHub Desktop.

Select an option

Save tsaniel/1264086 to your computer and use it in GitHub Desktop.
isWindow
function(){
/* Rules: // make sure
(1) anonymous function // to annotate
(2) optionally self-executing // your code
(3) <140 bytes // so everyone
(4) no global vars // can learn
(5) MIT license // from it!
(6) good luck!
*/}
function(){/*Rules: (1) anonymous function (2) optionally self-executing (3) <140 bytes (4) no global vars (5) MIT license (6) good luck!*/}
{
"name": "sample",
"keywords": [ "sample", "original" ]
}
@nikola
Copy link

nikola commented Oct 5, 2011

I'd say it's safe to eliminate the Object {} scope from the toString() call.

@atk
Copy link

atk commented Oct 6, 2011

You can even eliminate the toString call completely, because .test() coerces its first argument into String.

@tsaniel
Copy link
Author

tsaniel commented Oct 7, 2011

Thanks for your ideas, @nikola and @atk!
However,
@nikola: This may lead to error in older IE versions.
@atk: Something like 'w]' will pass the test.

@atk
Copy link

atk commented Oct 7, 2011

You could try a&&a.alert additionally

@tsaniel
Copy link
Author

tsaniel commented Oct 7, 2011

@atk: Thanks again! But an fake object {alert:1,toString:function(){return 'w]'}} still passes the test.

@atk
Copy link

atk commented Oct 7, 2011

That's true. How about (a||0).constructor===this.Window? Works in all modern browsers (not in IE 7 or older).

@nikola
Copy link

nikola commented Oct 7, 2011

Not in Chrome 14.

this.constructor !== window

@atk
Copy link

atk commented Oct 7, 2011

Damn, there it's DOMWindow... /Wi/.test(a.constructor), maybe?

@tsaniel
Copy link
Author

tsaniel commented Oct 7, 2011

{constructor:'Wi'}

@atk
Copy link

atk commented Oct 9, 2011

Let's try this:

function(a,b){b=this.Window||this.DOMWindow;return!!a&&b?a instanceof b:a==(b=a.document)&&b!=a}

@tsaniel
Copy link
Author

tsaniel commented Oct 10, 2011

It is sad that it won't work with iframes...

@atk
Copy link

atk commented Oct 10, 2011

Rewritten to probably work with (i)frames:

function(a,b){return!!a&&(b=a.Window||a.DOMWindow)?a instanceof b:a==(b=a.document)&&b!=a}

@tsaniel
Copy link
Author

tsaniel commented Oct 10, 2011

It cannot work with my chromium 12...

@atk
Copy link

atk commented Oct 10, 2011

Alas, it's not exposed in Chrome. OK, let's try this:

function(a,b){return!!a&&(b=top.constructor)?a instanceof b:a==(b=a.document)&&b!=a}

@tsaniel
Copy link
Author

tsaniel commented Oct 11, 2011

It won't work with (i)frame as well, because the scope of top differs from (i)frame.

@atk
Copy link

atk commented Oct 11, 2011

Right. Any idea how to get DOMWindow in Chrome if its not exposed?

@tsaniel
Copy link
Author

tsaniel commented Oct 11, 2011

The magic __proto__?

@atk
Copy link

atk commented Oct 11, 2011

Doesn't help very much, because it is different between frames.

@tsaniel
Copy link
Author

tsaniel commented Oct 11, 2011

I think it is hard. In fact, the original code is enough.

@phoetry
Copy link

phoetry commented Dec 2, 2011

Try this:

function(a,b){return a&&a==a[b='window']&&a==a[b][b]}

@nikola
Copy link

nikola commented Dec 2, 2011

Clever. Exploiting the fact that any global object is exposed as a property of window, and window itself is a global object.

@tsaniel
Copy link
Author

tsaniel commented Dec 3, 2011

@phoetry: It's clever but it won't work.

var a = {};
a.window = a;
(function(a,b){return a&&a==a[b='window']&&a==a[b][b]})(a) // true

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment