From c8ec654e6bbd4ea15872c6f65681f5a469330019 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Mar 2012 16:00:23 +0000 Subject: [PATCH] Don't call iterable.toArray in _.toArray if not a function --- test/collections.js | 12 ++++++++++-- underscore.js | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/test/collections.js b/test/collections.js index 71ef5a71c..72f92b989 100644 --- a/test/collections.js +++ b/test/collections.js @@ -257,8 +257,8 @@ $(document).ready(function() { test('collections: shuffle', function() { var numbers = _.range(10); - var shuffled = _.shuffle(numbers).sort(); - notStrictEqual(numbers, shuffled, 'original object is unmodified'); + var shuffled = _.shuffle(numbers).sort(); + notStrictEqual(numbers, shuffled, 'original object is unmodified'); equal(shuffled.join(','), numbers.join(','), 'contains the same members before and after shuffle'); }); @@ -271,6 +271,14 @@ $(document).ready(function() { var numbers = _.toArray({one : 1, two : 2, three : 3}); equal(numbers.join(', '), '1, 2, 3', 'object flattened into array'); + + var objectWithToArrayFunction = {toArray: function() { + return [1, 2, 3]; + }}; + equal(_.toArray(objectWithToArrayFunction).join(', '), '1, 2, 3', 'toArray method used if present'); + + var objectWithToArrayValue = {toArray: 1}; + equal(_.toArray(objectWithToArrayValue).join(', '), '1', 'toArray property ignored if not a function'); }); test('collections: size', function() { diff --git a/underscore.js b/underscore.js index 88da6e1d8..4716dde26 100644 --- a/underscore.js +++ b/underscore.js @@ -301,7 +301,7 @@ // Safely convert anything iterable into a real, live array. _.toArray = function(iterable) { if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); + if (iterable.toArray && _.isFunction(iterable.toArray)) return iterable.toArray(); if (_.isArray(iterable)) return slice.call(iterable); if (_.isArguments(iterable)) return slice.call(iterable); return _.values(iterable);