I think its type system is “okay”, I mean inherently dynamic typing is pretty error-prone. But its type coercion algorithms are bonkers. Also that whole “NaN ≠ NaN” business…
See that’s one of the parts that is actually almost in line with other languages. In Go, for example, nil ≠ nil because nil is, by definition, undefined. You can’t say whether one thing that you know nothing about is at all like something else that you know nothing about. It really should raise an exception at the attempt to compare NaN though.
IIRC, a nil value can be checked against a literal successfully but not against another nil value. Say you want to check for equality of two vars that could be nil. You just need an extra if statement to ensure that you are not trying to compare nil and nil or nil and a non-nil value (that’ll give you a type error or NPE):
var a *string
var b *string
...
if a != nil && b != nil {
if a == b {
fmt.Println("Party!")
} else {
fmt.Println("Also Party!")
}
0*(NaN)… So does that mean the price IS a number?
I suppressed most of my former js knowledge but I guess it’s a string now.
Javascript carcinization.
In JS, it’s just NaN if my browser’s console is to be believed. I suspected it would probably be
{object}
for no clear reasonI think its type system is “okay”, I mean inherently dynamic typing is pretty error-prone. But its type coercion algorithms are bonkers. Also that whole “NaN ≠ NaN” business…
See that’s one of the parts that is actually almost in line with other languages. In Go, for example,
nil ≠ nil
becausenil
is, by definition, undefined. You can’t say whether one thing that you know nothing about is at all like something else that you know nothing about. It really should raise an exception at the attempt to compare NaN though.If nil ≠ nil, how do you compare a variable to the literal?
You’d first check for nil values, then compare like normal. Extra step, yes, but it keeps you from hitting NPEs through that route.
What does this mean, if not the same as
?
IIRC, a nil value can be checked against a literal successfully but not against another nil value. Say you want to check for equality of two vars that could be nil. You just need an extra if statement to ensure that you are not trying to compare nil and nil or nil and a non-nil value (that’ll give you a type error or NPE):
If 0/0 is NaN, then does that mean 0*NaN = 0*0/0 = 0?
0*NaN = NaN