Array.isArray(new Proxy([], {})) should be false (Bug 1096753)

Brendan Eich brendan at mozilla.org
Mon Nov 17 11:06:04 PST 2014


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?

> 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]
}

> 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.)

> 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