Skip to content

Instantly share code, notes, and snippets.

@atk
Forked from 140bytes/LICENSE.txt
Created June 19, 2011 23:10
Show Gist options
  • Select an option

  • Save atk/1034882 to your computer and use it in GitHub Desktop.

Select an option

Save atk/1034882 to your computer and use it in GitHub Desktop.
polyfill an ES5-compatibile Array.isArray where needed.
// only set function if not already available
Array.isArray || (Array.isArray = function(
a // array or not array, this is the question
){
return
// is not the string '[object Array]' and
'' + a !== a &&
// test with Object.prototype.toString
{}.toString.call(a) == '[object Array]'
});
Array.isArray||(Array.isArray=function(a){return''+a!==a&&{}.toString.call(a)=='[object Array]'});
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2011 Alex Kloss <alexthkloss@web.de>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
{
"name": "isarray",
"description": "polyfill an ES5-compatibile Array.isArray where needed.",
"keywords": [
"polyfill",
"es5",
"isArray"
]
}
<!DOCTYPE html>
<title>Foo</title>
<div>Expected value: <b>false, true, false, false, false, false</b></div>
<div>Actual value: <b id="ret"></b></div>
<script>
// write a small example that shows off the API for your example
// and tests it in one fell swoop.
var isArray = Array.isArray||(Array.isArray=function(a){return''+a!==a{}.toString.call(a)=='[object Array]'});
document.getElementById( "ret" ).innerHTML = [isArray({}), isArray([]), isArray(""), isArray(0), isArray(true), isArray('[object Array]')];
</script>
@subzey

subzey commented Jun 20, 2011

Copy link
Copy Markdown

@atk, that's strange. It works fine in my Fx 4.0.1

@atk

atk commented Jun 20, 2011

Copy link
Copy Markdown
Author

Strange enough, if I put it directly into my firebug console, it fails - but if I encapsulate it into a function, it works! Thanks again, @subzey

@sebastien-p

Copy link
Copy Markdown

What about Array.isArray||(Array.isArray=function(a){return/Array/.test({}.toString.call(a))}) ?

@subzey

subzey commented Jul 8, 2011

Copy link
Copy Markdown

@sebastien-p, It may conflict with typed arrays.

@sebastien-p

Copy link
Copy Markdown

@subzey : ok, thanks :)

@atk

atk commented Jul 8, 2011

Copy link
Copy Markdown
Author

Not even that, what if I want to test a string containing "Array" at any point. Granted, if you try a string containing "[object Array]" it will return a false positive, too, yet this is less problematic, so if you want to be sure, add &&''+a!==a.

@subzey

subzey commented Mar 9, 2012

Copy link
Copy Markdown

Maybe we could use the behavior of Array.prototype.concat so interpreter natively checks if argument is an array

Array.isArray?0:Array.isArray=function(a){return[].concat(a)!==a}

@atk

atk commented Mar 9, 2012

Copy link
Copy Markdown
Author

@subzey
(function(a){return[].concat(a)!==a})('') // => true in firefox 10

@subzey

subzey commented Mar 10, 2012

Copy link
Copy Markdown

Thanks, @atk!

Sorry, I missed [0]. That what I meant was

function(a){return[].concat(a)[0]!==a}

Array.prototype.concat adds argument's contents to this array if arg is an array and otherwise it adds the argument itself.

I wanted to exploit this difference, but lately I've found an error: it won't work correctly if argument is an array and its 0'th value is the same object (var a = []; a[0] = a).

@atk

atk commented Mar 12, 2012

Copy link
Copy Markdown
Author

Ah, that explains it.

@atk

atk commented Apr 12, 2012

Copy link
Copy Markdown
Author

Added another fix. If you tried to test the format of '[object Array]', it would give you a false positive; by ensuring that we haven't got a string, this is now fixed, too.

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