On Sun, Oct 23, 2011 at 12:01 PM, Axel Rauschmayer <a...@rauschma.de> wrote:

> - What about primitives?Are there primitive types and object types? Is the
>> union of the two called just “types”?
>>
>
> That seems to be how a lot of folks refer to them, but I think it's a
> little confusing. A primitive type is one that cannot be decomposed any
> further, so Object is a primitive type, and a Function is an object type.
>
>
> Almost: a primitive is something that isn’t handled by reference. Object is
> therefore not a primitive type:
> var o1 = new Object();
> var o2 = o1;
> o1.foo = 123;
> console.log(o2.foo); // 123
>
> http://www.2ality.com/2011/03/javascript-values-not-everything-is.html
>


Is that from the spec? My interpretation of "primitive" is from ISO/IEC
11404 (a *surprisingly* good read for a spec about types!): primitive
datatypes are "defined axiomatically without reference to other datatypes"
and goes on to say "All primitive datatypes are conceptually atomic". XSD
similarly defines primitives: "Primitive datatypes are those that are not
defined in terms of other datatypes; they exist ab initio."

What you're defining as primitive is instead the notion of value types, but
it's all kind of jumbled together anyway. To my mind the notion of value vs.
reference types are completely orthagonal, and instead closely related to
mutability. Still, I agree I was wrong to call Objects primitive -- Object
instances are still derived, or generated, or compound, or product, or
whatever (AFAICT the literature is all over the map on this).


> The only thing I am sure of is that "typeof" is unfortunately named :)
>
>
> I now use the rule of thumb:
> - typeof: use for primitives and to distinguish primitives from objects.
>


I'd point out the failure of "null" here but that's being fixed. But your
comments help demonstrate my point, that javascript's type system is
bifurcated.


> - instanceof: use for objects.
>


It's *usable* on objects, but not all that *useful*, even with natives like
Array (they could have come from another frame). This is my biggest problem
with javascript's nominative types. Ducktyping helps, but meh. This is one
reason I'm so excited about private names and the de jure namespace the
module system gives us -- which can help sort this out once and for all.


Obviously, typeof also works for checking for functions.
>
> You could also say javascript's type lattice is pretty damn degenerate.
>
>
> Can you elaborate?
>


The subtype relation is a partial order -- whether the top and bottom type
are implicit or explicit is language dependent, but as a partial order all
types in a given system can be represented as a lattice. But if you drew the
types of any es5 application as a hasse diagram it would look pretty goofy
-- flat on one side with most of the built-ins nearly impossible to extend,
and then below Object you'd have a tree that sprawls out, with each leaf
bottoming out at falsum. So that's what I meant by a degenerate lattice. And
es-next does offer some help with extending the built-ins, it's type system
will still lack the capabilities to do much else, like derivation by
restriction.

This is all just speaking to the built-in type system -- obviously any
number of application-level type systems have been layered on top with
various characteristics. This is another problem :-/


> (I do think structural typing could be really useful but I have no idea how
> it could be introduced to the language unobtrusively.)
>
>
> Something like this?
>     var Counter = { inc: "function", data: "number" };
>     matchesInterface(anObject, Counter);
>


You could do that and more with a library today, but you'd just be layering
on *third* incompatible type system. And then we'd have three problems :)
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to