From 4c89d551d73649aac52c8ce3cb7e6edba1dcc4d9 Mon Sep 17 00:00:00 2001 From: Graeme Yeates Date: Sun, 10 Aug 2014 10:22:31 -0400 Subject: [PATCH] isArray() and isArrayLike() fixes: * lang.isArrayLike should return bool for falsey arguments * correct isArray for falsey values, cross frames and array extensions Fixes #18251. --- _base/lang.js | 8 +++----- tests/_base/lang.js | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/_base/lang.js b/_base/lang.js index a14ccc0666..e544eabc4c 100644 --- a/_base/lang.js +++ b/_base/lang.js @@ -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){ @@ -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) && @@ -613,4 +612,3 @@ define(["./kernel", "../has", "../sniff"], function(dojo, has){ return lang; }); - diff --git a/tests/_base/lang.js b/tests/_base/lang.js index 5802f1c064..2f47fc1464 100644 --- a/tests/_base/lang.js +++ b/tests/_base/lang.js @@ -111,6 +111,19 @@ 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){ @@ -118,6 +131,20 @@ define(["doh/main", "dojo/_base/array", "dojo/_base/lang", "dojo/_base/kernel" 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){