Verify that we do not recurse infinitely through one of the Array->string conversion. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.toString(); is "" PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.toLocaleString(); is "" PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.join(","); is "" PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(1); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.push("WebKit!"); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.toString(); is "1,,WebKit!," PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(1); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.push("WebKit!"); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.toLocaleString(); is "1,,WebKit!," PASS var arrayDirectlyContainingItself = []; arrayDirectlyContainingItself.push(1); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.push("WebKit!"); arrayDirectlyContainingItself.push(arrayDirectlyContainingItself); arrayDirectlyContainingItself.join("-"); is "1--WebKit!-" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); arrayIndirectlyContainingItself.toString(); is "1,1,2,5,6,,WebKit!" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); arrayIndirectlyContainingItself.toLocaleString(); is "1,1,2,5,6,,WebKit!" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); arrayIndirectlyContainingItself.join("="); is "1=1,2,5,6,=WebKit!" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); ["z", arrayIndirectlyContainingItself, 9].toString(); is "z,1,1,2,5,6,,WebKit!,9" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); ["z", arrayIndirectlyContainingItself, 9].toLocaleString(); is "z,1,1,2,5,6,,WebKit!,9" PASS var arrayIndirectlyContainingItself = []; arrayIndirectlyContainingItself.push(1); arrayIndirectlyContainingItself.push([1, 2, [5, 6, [arrayIndirectlyContainingItself]]]); arrayIndirectlyContainingItself.push("WebKit!"); ["z", arrayIndirectlyContainingItself, 9].join("&"); is "z&1,1,2,5,6,,WebKit!&9" PASS var arrayIndirectlyConvertingItself = ["a"]; arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toLocaleString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.join("~") } }); arrayIndirectlyConvertingItself.push("WebKit!"); ["z", arrayIndirectlyConvertingItself, 9].toString(); is "z,a,,,,WebKit!,9" PASS var arrayIndirectlyConvertingItself = ["a"]; arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toLocaleString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.join("~") } }); arrayIndirectlyConvertingItself.push("WebKit!"); ["z", arrayIndirectlyConvertingItself, 9].toLocaleString(); is "z,a,,,,WebKit!,9" PASS var arrayIndirectlyConvertingItself = ["a"]; arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.toLocaleString() } }); arrayIndirectlyConvertingItself.push({ array: arrayIndirectlyConvertingItself, toString: function() { return this.array.join("~") } }); arrayIndirectlyConvertingItself.push("WebKit!"); ["z", arrayIndirectlyConvertingItself, 9].join("*"); is "z*a,,,,WebKit!*9" PASS successfullyParsed is true TEST COMPLETE