Skip to content

Commit

Permalink
isArray() and isArrayLike() fixes:
Browse files Browse the repository at this point in the history
* lang.isArrayLike should return bool for falsey arguments
* correct isArray for falsey values, cross frames and array extensions

Fixes #18251.
  • Loading branch information
megawac authored and wkeese committed Sep 8, 2014
1 parent e4296a6 commit 4c89d55
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
8 changes: 3 additions & 5 deletions _base/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,12 @@ define(["./kernel", "../has", "../sniff"], function(dojo, has){
return (typeof it == "string" || it instanceof String); // Boolean
},

isArray: function(it){
isArray: Array.isArray || function(it){
// summary:
// Return true if it is an Array.
// Does not work on Arrays created in other windows.
// it: anything
// Item to test.
return it && (it instanceof Array || typeof it == "array"); // Boolean
return opts.call(it) == "[object Array]"; // Boolean
},

isFunction: function(it){
Expand Down Expand Up @@ -296,7 +295,7 @@ define(["./kernel", "../has", "../sniff"], function(dojo, has){
// and DOM collections will return true when passed to
// isArrayLike(), but will return false when passed to
// isArray().
return it && it !== undefined && // Boolean
return !!it && // Boolean
// keep out built-in constructors (Number, String, ...) which have length
// properties
!lang.isString(it) && !lang.isFunction(it) &&
Expand Down Expand Up @@ -613,4 +612,3 @@ define(["./kernel", "../has", "../sniff"], function(dojo, has){

return lang;
});

27 changes: 27 additions & 0 deletions tests/_base/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,40 @@ define(["doh/main", "dojo/_base/array", "dojo/_base/lang", "dojo/_base/kernel"
t.assertTrue(lang.isArray([]));
t.assertTrue(lang.isArray(new Array()));
t.assertFalse(lang.isArray({}));
t.assertFalse(lang.isArray(''));
t.assertFalse(lang.isArray(0));
t.assertFalse(lang.isArray(NaN));
t.assertFalse(lang.isArray(null));
t.assertFalse(lang.isArray(undefined));
if(typeof window != "undefined"){
t.assertFalse(lang.isArray(window));
}
t.assertFalse(lang.isArray(Function));

function Tricky() {}
Tricky.prototype = [];
t.assertFalse(lang.isArray(new Tricky));
},

function isArrayLike(t){
t.assertFalse(lang.isArrayLike("thinger"));
t.assertTrue(lang.isArrayLike(new Array()));
t.assertFalse(lang.isArrayLike({}));
t.assertTrue(lang.isArrayLike(arguments));
t.assertFalse(lang.isArrayLike(""));
t.assertFalse(lang.isArrayLike(false));
t.assertFalse(lang.isArrayLike(NaN));
t.assertFalse(lang.isArrayLike(undefined));
t.assertFalse(lang.isArrayLike(null));
if(typeof window != "undefined"){
t.assertTrue(lang.isArrayLike(window));
}
t.assertFalse(lang.isArrayLike(Function));

t.assertTrue(lang.isArrayLike({0: 1, 1: 2, length: 2}));
function Tricky() {}
Tricky.prototype = [];
t.assertTrue(lang.isArrayLike(new Tricky));
},

function isString(t){
Expand Down

0 comments on commit 4c89d55

Please sign in to comment.