Array.isArray(new Proxy([], {})) should be false (Bug 1096753)
Allen Wirfs-Brock
allen at wirfs-brock.com
Mon Nov 17 14:30:28 PST 2014
On Nov 17, 2014, at 11:06 AM, Brendan Eich wrote:
> Allen Wirfs-Brock wrote:
>> ```js
>> Array[Symbol.isArray]] = true; //note, this is a constructor property, not an Array.prototype property.
>
> Minomer, then -- how about Symbol.isArrayClass?
perhaps, I have a negative reaction to including the work "class" but can probably live with it.
>
>> we also change Array.prototype.concat to do the above Array.isArray test instead of using @@comcatSpreadable and change JSON.stringify to use this test where it current checks for an exotic array object.
>>
>> Then we have the following:
>>
>> assert(Array.isArray( [ ] )); //just like ES5
>> assert( ! Array.isArray( Object.create(Array.prototype))); //just like ES5
>
> How so? True:
>
> js> Array.isArray(Array.prototype)
> true
> js> Array.isArray(Object.create(Array.prototype))
> false
>
> but constructor isn't shadowed:
>
> js> Array.prototype.constructor
> function Array() {
> [native code]
> }
> js> Object.create(Array.prototype).constructor
> function Array() {
> [native code]
> }
Shit, you're right. This is the hard case for legacy compat using this technique.
I think I see a way to make this give the legacy answer, but I suspect I can't make it give the same answer for
Array.isArray(new Proxy(Object.create(Array.prototype), { }));
May limiting the WTF=ness to that case isn't so bad.
>
>> assert (new class extends Array{}); //ES6 Array subclass instances answer true unless the subclass over-rides the static @@isArray property
>> assert(new class extends Array {
>> constructor() {return {}};
>> }); // even if the subclass instance isn't an exotic array object (this is an improvement over the current ES6 spec. which says that
>> //isArray answers false in this case
>> assert(new Proxy( [ ], { }); //because it's all done with property access, no instance inspection required.
>
> (These want Array.isArray inside assert, of course.)
of course
>
>> assert( ! new Int32Array(10)); //not array-like, just like ES5
>>
>> However, I think we should experiment with giving %TypedArrau% is true valued @@isArray property. I'm guessing that this change won't actually break anything.
>
> Probably ok.
>
>> the above proposal completely decouples Array.isArray from exotic array object checking or any other direct instance inspection. Everything works at the property access level and so is (by default) transparent to proxies and completely controllable at the ES cod level.
>
> Righteous goal!
>
> /be
>
More information about the es-discuss
mailing list