Array.isArray(new Proxy([], {})) should be false (Bug 1096753)
Brendan Eich
brendan at mozilla.org
Thu Nov 13 12:24:22 PST 2014
Let's avoid all-or-nothing judgments about Proxies, they are definitely
a practical, standardizable thing -- so a work in progress, subject to
further improvement.
Proxies are meant to be transparent in general. Exceptions include
built-ins with magic internal properties. We haven't added private data
(ideally the basis for self-hosting such built-ins) yet, and we'd need
extensions to Proxies should we do so. Etc.
That someone might make a proxy-for-array that violates an Array
invariant is just part of the bargain: a bug or feature, depending on
situation. We still may want Array.isArray on a proxy-for-array to
return true, all things considered.
/be
Allen Wirfs-Brock wrote:
>
> On Nov 12, 2014, at 11:58 AM, Jeremy Martin wrote:
>
>> My opinion is that array testing is fundamental to core JS and is
>> worth the exception.
>>
>>
>> Knowing that Array.isArray() tests fail for proxies, I'd be afraid to
>> ever create a Proxy for an array that I don't control the complete
>> lifecycle of. That seems to critically inhibit the usefulness of
>> Proxies, especially when transparency seems to have been an intended
>> characteristic of them going all the way back to the strawman days.
>
> Proxies are not transparent forwarders! In particular their default
> handling of the `this` value on method invokes will break any built-in
> method that needs to access "internal slots" of an object.
>
> ```js
> var p = new Proxy(new Array, {});
> ```
> will give you an object that will fail on serval of the
> Array.prototype methods.
>
> It is even worse for other built-ins such as Map or the typed array
> constructors.
>
> Allen
>
More information about the es-discuss
mailing list