When implementing ES3.1 `Object.keys` in ES3, one of the steps in
algorithm of `Object.keys` seemed a bit confusing:
...
1. If the Type(O) is not Object, throw a TypeError exception.
...
Based on my understanding, I implemented this check as:
function isPrimitive(o) {
return o == null || /^(boolean|number|string)$/.test(typeof o);
}
and then simply checked for `isPrimitive` being false before
proceeding (otherwise throwing a TypeError). It just seemed like the
most straight forward way of doing it.
I then received a response from one of our developers that `isObject`
could probably be implemented as:
function isObject(o) {
return typeof o === 'object' && o !== null;
}
The latter example assumed meaning of "Object" literally and would
skip, say, Function objects, or MSHTML's host objects returning
"unknown" as their `typeof`.
I started looking into specs more thoroughly to find out what Type
really is:
5.2 says: 'Type(x) is used as shorthand for "the type of x"'
What's type of x, then?
Type (4.3.1) says:
"A type is a set of data values as defined in section 8 of this
specification."
Section 8, in its turn, lists - The Undefined Type, The Null
Type, ... , and finally The Object Type (8.6)
8.6 says:
"An Object is a collection of properties. Each property is either a
named data property, a named accessor property, or an internal
property."
Am I correct in my understanding that when specs say Type(O) should be
an Object, this implies that a value is not an instance of `Object`
but an object in a sense of a collection of properties, and that, for
example, a Function object should be considered an Object type as
well? Does the former test - `!isPrimitive(o)` - look like a
reasonable simulation of what ES3.1 says?
Thank you.
--
Juriy Zaytsev
Prototype.js core developer
[email protected]
_______________________________________________
Es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss