一个奇葩问题引发的"吐血"

某天,和某同事交流技术,他提到了一个问题:在js中,如果一个变量赋值给另一个变量,那么他们一定相等吗?为什么?。然后,我脱口而出,是相等,这无毛病。变量赋值本身就只是一个定义好的变量的副本,他们相等是没问题的,即便是引用类型的数据对象,在赋值的时候保持着内存的同一引用,它们当然也相等啊。当然注意这里是相等,不是全等。即"=="而非"===",所以没有什么类型转换的讨论。不信,那我们来两个代表示例看看:

//基本类型
var a;
var b = a;
b == a;//true
//引用类型
var a = {};
var b = a;
b == a;//true,它们的引用地址相同

看起来好像是没什么问题的。然而事实真的是这样吗?

clipboard.png

我转念一想,不对啊,有这么简单的问题?同事再给我一个例子,狠狠的打击了我,卧槽,还可以这样?

clipboard.png

js数据当中还有一个特殊的值,那就是NaN

var a = NaN;
var b = a;
b == a;//猜猜这里是啥

答案真的是出乎你的意料,当然是false,也就是不相等啦。

clipboard.png

不带这么玩的吧?

clipboard.png

后面脑袋一闪,原来如此,这么低级的错误都犯,NaN虽然是一个数值型的值,但是它并不是一个确切的值,所以NaN !== NaN。也就是说,变量的赋值也不会改变它们的不等性呢。

clipboard.png

还可以这么玩。

ps:总结:任何时候任何一个问题都不要小看它,拘束于表面,因为它随时都会是一个坑,让你跳进去,认真点总不会有坏处的。

clipboard.png

鄙人创建了一个QQ群,供大家学习交流,希望和大家合作愉快,互相帮助,交流学习,以下为群二维码:

clipboard.png

阅读 1.1k

推荐阅读
eveningwater
用户专栏

每天学习一点点,就可以进步一点点,工作能带来的不仅是技术知识点,还有与人的相处,沟通与交流。这是...

8 人关注
23 篇文章
专栏主页