Hacker News new | past | comments | ask | show | jobs | submit login

== is not the equality operator. === is the equality operator.

== is the type coerce/cast and then compare operator.

I agree with you about the way strings get converted to int instead of the other way around. I believe this is a backwards compatibility issue, and if they could change it they would, but it's too late.

It's also because of 1 == "01" would be false otherwise. And if you think "01" is strange you forget that all input to a php program comes from web forms, and is always a string.




in javascript:

1 == '01' --> true

0 == 'x' --> false

1 == '1' --> true

true == 'asdf' --> false

'-2' == 2 --> true

'-2' == 0 --> false

Seems like in javascript, the coercing is much more sane. In php, all of the above statements would end up true.


Javascript is not totally sane:

  '\t\r\n' == 0 --> true
And not transitive:

  "false" == "0" --> false
  "0" == 0 --> true
  0 == false --> true
  false == "false" --> false
It's basically impossible to make a loosely typed equality perfect.

PHP is much more strict about the rules used when doing the comparison, javascript is more loose. It tries to guess.

When comparing a string to a number, if the string looks like a number it's converted to one. But if it doesn't, then instead the number get converted to a string.

This works well most of the time - but not always, since it can surprise you. PHP is more strict, so it doesn't work as often, but it fails more consistently, so it's easier to find the problem.

Another example:

  "1" == "01" --> false
  "01" == 1 --> true
  1 == "1" --> true


I don't have a PHP runtime in front of me, but IIRC the first one on your list and the last 2 will evaluate false in php


The funny thing is that in Javascript:

12 == parseInt('012')

returns false. :)


A leading zero usually means 'this number is octal', so parseInt returns 10. Not very intuitive notation, however.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: