Re: typeof document.all

On Fri, Jun 19, 2009 at 9:38 AM, Maciej Stachowiak wrote:
>
> Here are the special behaviors WebKit ensures
> for document.all:
>
> - document.all is false when tested in a boolean comparison, so if
> (document.all) checks fail
> - the following expression evaluates to true: document.all == undefined
> - the following expression evaluates to true: document.all == null
> - the following expression evaluates to false: document.all != undefined
> - the following expression evaluates to false: document.all != null
> - the expression "typeof document.all" returns the string "undefined"
> - the expression !document.all evaluates to true
>
> Note that these are all impossible for a normal JavaScript object following
> the ECMAScript spec. However, the ECMAScript spec allows host objects to do
> essentially anything.
>
> One thing we do not do is affect the behavior of === and !== (the strict
> equality and strict inequality operators).
>
> I am not sure exactly which of these rules are needed for Web compatibility.

Doing some additional tests:
 - Opera (9.64), FF (3.0.11) and Safari (4) all report document.all as
[object HTMLCollection] in their JS console; Chrome (3) on the other
hand reports it as undefined; however, all four browsers agree that
document.all.toString() is "[object HTMLCollection]", it might just be
how the JS console is implemented?
 - All four browsers return true for ("all" in document), I would have
expect a false here (this is explicitly allowed by ECMAScript, ยง8.6.2:
"Host objects may implement these methods in any manner unless
specified otherwise; for
example, one possibility is that [[Get]] and [[Put]] for a particular
host object indeed fetch and store property values but [[HasProperty]]
always generates false.")
 - Opera and FF return false for document.hasOwnProperty("all"); this
is inconsistent with the above, given that document.prototype is null
(the property exists according to [[HasProperty]], it cannot be in the
prototype chain as there is not prototype, but it doesn't exist on the
object, so where is it?!) Chrome and Safari return true.

-- 
Thomas Broyer

Received on Friday, 19 June 2009 08:28:07 UTC