array-iterator-proxy.js (1006B)
1 // An array iterator for a proxy calls the traps in a predictable order. 2 3 load(libdir + "asserts.js"); 4 load(libdir + "iteration.js"); 5 6 var s = ''; 7 8 var handler = { 9 get: function (recipient, name) { 10 if (name == 'length') { 11 s += 'L'; 12 return 2; 13 } else { 14 s += name; 15 return name; 16 } 17 } 18 }; 19 20 var it = Array.prototype[Symbol.iterator].call(new Proxy([0, 1], handler)); 21 22 assertIteratorNext(it, "0"); 23 s += ' '; 24 assertIteratorNext(it, "1"); 25 s += ' '; 26 assertIteratorDone(it, undefined); 27 assertEq(s, "L0 L1 L"); 28 29 s = ''; 30 var ki = Array.prototype.keys.call(new Proxy([0, 1], handler)); 31 32 assertIteratorNext(ki, 0); 33 s += ' '; 34 assertIteratorNext(ki, 1); 35 s += ' '; 36 assertIteratorDone(ki, undefined); 37 assertEq(s, "L L L"); 38 39 s = ''; 40 var ei = Array.prototype.entries.call(new Proxy([0, 1], handler)); 41 42 assertIteratorNext(ei, [0, "0"]); 43 s += ' '; 44 assertIteratorNext(ei, [1, "1"]); 45 s += ' '; 46 assertIteratorDone(ei, undefined); 47 assertEq(s, "L0 L1 L");