Well well! The motivation for this post comes from my last post where I had a comment from one of my readers that I couldn't agree with. I was talk...
For further actions, you may consider blocking this person and/or reporting abuse
Jokes on you, since everything except numbers and arrays are objects in every language! >:)(I don't meanObject
object, I mean "object" as in a container, like the result of a constructed struct, union, or class.)(This was only partially relevant.)To explain how I think about an object, this is what I think of an object as:
@baenencalin Didn't get you man! In JavaScript, arrays infact are objects :)
To add clarity, strings are a little in the gray area.
If you're using a language like Go, if we disregard the built-in string type, they may be an array, or they may be a struct type, or they may be a wrapper type for an array, which would be an array of numbers, say
int16
orint32
.Of course, to be fair, we should consider the built in type - though, how it's built is dependent on the language.
In Java, it's definitely an object, both in the
Object
sense, and the sense that they are the result of a data structure.What I'm saying in most languages, like C, Go, C++, etc..
Everything except arrays and numbers are objects.
(I guess this isn't necessarily true for JS.)
@baenencalin Hey man! I get you now. I am not sure about all the other languages but what I can say is that its indeed a choice made by the langauge itself. I mean how a langauge defines primitives and objects is completely upto the language. We do have an article of faith on the universal notion though.
I thought primitives did have a definite definition ("The least abstract(ed) type in a given language. - Usually that who's implementation is the most bare-bones (compared to other types) when looking at the source code for a given language.")?
How is a "char" in C an object? And how is a string an object but an array isn't an object?
This is an outdated view. I realized not every language is quite like how I described.
Anyway, I never claimed
char
s were an object (even if they weren't listed as one ov the things that isn't an object); on the note ov arrays and strings, however, I don't consider arrays an object because they're usually just a consecutive arrangement ov data (in C it's literally just a pointer to said arrangement).I hope this answered your questions thoroughly; feel free to write back if you have any more questions.
MDN: primitive values:
seems like a more straightforward explanation - i.e. nothing was changed in the first place - JavaScript just ignores the attempt of mutation.
@peerreynders Indeed. Thanks for taking out time to read :)
Thank you for bringing up this topic. I heard that phrase so much that it was confusing me at the beginning of my career.
I think this myth was created by the people working in other languages who started to get acquainted with JS just a little bit :)
I don't think it is even possible for the language to only have objects as its type (Correct me if I'm wrong).
The most important note here was about the optimization part. Please, please, do not try to do these kinds of micro-optimizations yourself :) The browser engines are designed to detect and optimize all the "normal" code flows. If you try to do some weird things, the browser engine will not detect recognizable patterns and will fail to optimize the performance.
@lilithkarapetyan Hello Lilit! To answer your question, I'd say it completely depends on how a particular language defines primitives and objects. In JS, objects are nothing more than collective key:value pairs and anything that is not an object is a primitive. Consider another language, maybe 'C', it maps primitive types much closer to the underlying microprocessor architecture (int, char etc..). Generally in computer science "primitives" emply atomic types but then every programming language can freely decide on how to implement their own basic building block. For example Python chose to keep objects at the atomic level. So yeah, it depends on the language.
and you confused it.
when you write let str = 'hello' str is not primitive.
now try Object.isExtensible(str) you will get false and that a reason why you cannot add new prop to variable str.
Well explained!
:)