资讯专栏INFORMATION COLUMN

细说 Javascript 类型篇(一) : 相等和比较

wthee / 2419人阅读

摘要:由于中复杂的类型转换机制,将会使得由此产生的错误变得难以追踪。此外,类型的强制转换会对性能也造成一定的影响,例如,当一个字符串与数字进行比较时,会被强制转换为数字。详解一下中的比较参考

Javascript 有两种方法来判断两种值是否相等。

相等符号

相等符号由两个等号组成: ==
Javascript 是弱类型语言。这就意味着相等符号为了比较两个值将会强制转换类型。

""           ==   "0"           // false
0            ==   ""            // true
0            ==   "0"           // true
false        ==   "false"       // false
false        ==   "0"           // true
false        ==   undefined     // false
false        ==   null          // false
null         ==   undefined     // true
" 	
"    ==   0             // true

上面的代码展示了类型转换的结果,因此我们知道使用相等符号 == 是个不好的编程习惯。由于 Javascript 中复杂的类型转换机制,将会使得由此产生的错误变得难以追踪。
此外,类型的强制转换会对性能也造成一定的影响,例如,当一个字符串与数字进行比较时,会被强制转换为数字。

严格相等符号

严格相等符号由三个等号组成: ===
它跟相等符号的操作相似,但是严格相等符号不会做强制类型转换的操作。

""           ===   "0"           // false
0            ===   ""            // false
0            ===   "0"           // false
false        ===   "false"       // false
false        ===   "0"           // false
false        ===   undefined     // false
false        ===   null          // false
null         ===   undefined     // false
" 	
"    ===   0             // false

上面的代码使得代码更加清晰,如果两个值的类型不同则直接返回 false,这也会使得性能得到提升。

比较对象

尽管 ===== 被称为相等符号,但是当比较的两个值中有一个类型是对象时,表现将大不相同。

{} === {};                   // false
new String("foo") === "foo"; // false
new Number(10) === 10;       // false
var foo = {};
foo === foo;                 // true

在这儿,不再仅仅是比较两个值是否相等,它将判断两个值是否引用同一个对象实例,这个行为比较像 C 中的指针。

总结

这里强烈建议只使用严格相等符号 ===。如果我们需要做类型转换,可以在比较前先做显式的类型转换,而不是靠 Javascript 本身复杂的强制转换方法。

@justjavac 前辈所提的这个问题更加详述地分析了 Javascript 中的比较。

  

《详解一下 javascript 中的比较》

参考

http://bonsaiden.github.io/JavaScript-Garden/#types.equality

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78105.html

相关文章

  • 细说 Javascript 类型(四) : 类型转换

    摘要:因为是弱类型语言,所以它会在任何可能的情形下对变量进行强制类型转换。内置类型的构造函数调用内置类型的构造函数时,是否使用关键字将表现得大不相同。传递字面值或非对象值也会造成强制类型转换的现象。最好的方法就是显示地将值转换为,或三种类型之一。 因为 Javascript 是弱类型语言,所以它会在任何可能的情形下对变量进行强制类型转换。 // These are true new Num...

    chengtao1633 评论0 收藏0
  • 细说 Javascript 类型(三) : instanceof 操作符

    摘要:的操作符可以用来比较两个操作数的构造函数。这是因为它们的构造函数不可能会是同一个对象。总结综上所述,我们知道操作符最合适的使用坏境是比较两个相同上下文背景下的自定义对象的构造函数,正如上篇介绍的操作符,其他坏境下使用作用不大。 Javascript 的 instanceof 操作符可以用来比较两个操作数的构造函数 constructor。但这个只有在比较自定义对象才有意义。当用来比较 ...

    tylin 评论0 收藏0
  • 细说 Javascript 对象(二) : 原型对象

    摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...

    lansheng228 评论0 收藏0
  • 爬虫不得不学之 JavaScript 入门

    摘要:为数值固定的表示法,用来表示整数和浮点数的。无论你写何种进制,它的存储还是以二进制来存储的,所以这样就弄成了浮点数的存储精确度,浮点数只能精确到位小数。关系运算符关系运算符有和。赋值运算符赋值运算符有六个。 现在的爬虫越来越难了,不再和之前的那样,随便抓个包就可以找到相关的 url ,然后 post 一下或者 get 一下数据就出来了。还有一个可能就是可能你以前用来学习的爬虫网站太简单...

    tracymac7 评论0 收藏0
  • 细说 Javascript 函数(四) : arguments 对象

    因为最近有博友反馈我的博文是直接翻译的参考链接内的内容,所以我在这里要说明一下,以免引起不必要的误会。 首先,我很喜欢 segmentfault 的交流和学习的氛围,所以我很愿意在这里跟各位 SFer 交流学习心得,相互学习,共同进步。 第二,我做技术方面的工作不久,所以学习经历也不是很长,但是我发现写博客,总结自己的学习心得是个很好的学习习惯,至少对于我个人而言,我于此收益颇丰,所以我决定坚持一...

    aristark 评论0 收藏0

发表评论

0条评论

wthee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<