this post was submitted on 27 Aug 2024
215 points (94.2% liked)
Programmer Humor
32555 readers
480 users here now
Post funny things about programming here! (Or just rant about your favourite programming language.)
Rules:
- Posts must be relevant to programming, programmers, or computer science.
- No NSFW content.
- Jokes must be in good taste. No hate speech, bigotry, etc.
founded 5 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Today I found out that this is valid JS:
Well, that's just going to be one of those "it is what it is" things in an OO language if your base class has a
toString()
-equivalent. Sure, it's probably useless for a string, but if everything's an object and inherits from some top-levelObject
class with atoString()
method, then you're going to get atoString()
method in strings too. You're going to get atoString()
in everything; in JS even functions have atoString()
(the output of which depends on the implementation):In a dynamically typed language, if you know that everything can be turned into a string with
toString()
(or the like), then you can just call that method on any value you have and not have to worry about whether it'll hurl at runtime because eg.String
s don't have atoString
because it'd technically be useless.Okay, fair enough. Guess I never found about it because I never had to do it... JS also allows for
"test string".toString()
directly, not sure how it goes in other languages.It's also incredibly useful as a failsafe in a helper method where you need the argument to be a string but someone might pass in something that is sort of a string. Lets you be a little more flexible in how your method gets called
Everything that's an
Object
is going to either inheritObject.prototype.toString()
(mdn) or provide its own implementation. Like I said in another comment, even functions have atoString()
because they're also objects.A
String
is anObject
, so it's going to have atoString()
method. It doesn't inheritObject
's implementation, but provides one that's sort of a no-op / identity function but not quite.So, the thing is that when you say
const someString = "test string"
, you're not actually creating a newString
object instance and assigning it tosomeString
, you're creating astring
(lowercases
!) primitive and assigning it tosomeString
:Compare this with creating a
new String("bla")
:In Javascript, primitives don't actually have any properties or methods, so when you call
someString.toString()
(or call any other method or access any property onsomeString
), what happens is thatsomeString
is coerced into aString
instance, and thentoString()
is called on that. Essentially it's like goingnew String(someString).toString()
.Now, what
String.prototype.toString()
(mdn) does is it returns the underlyingstring
primitive and not theString
instance itself:Why? Fuckin beats me, I honestly can't remember what the point of returning the primitive instead of the
String
instance is because I haven't been elbow-deep in Javascript in years, but regardless this is whatString
'stoString()
does. Probably has something to do with coercion logic.