JavaScript 的怪癖 3:标准的等号 (==)

justjavac 发布于 2013/04/28 11:11
阅读 512
收藏 3

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

原文:JavaScript quirk 3: normal equality (==)

译文:JavaScript 的怪癖 3:标准的等号 (==)

译者:iranw

此文是 javascript 的 12 个怪癖(quirks) 系列的第三篇。

让我们先看一个简单的例子: 由于一般的等于符号 ==、!=经常会出现问题,以至于我们不得不使用严格等于(===、!==)。 当然有人说这些规则也有例外,我不同意这个观点[2]。 怀揣的这个问题,我们现在就来看一下这个奇怪的现象:== 是不必要。

这个“正常”的等号(==)有很多怪癖。 虽然他很宽容(非严格比较),当与真值或者假值比较时,它会忽略类型(详见怪癖1):

> 0 == false  // OK
true
> 1 == true  // OK
true
> 2 == true  // not OK
false

> '' == false  // OK
true
> '1' == true  // OK
true
> '2' == true  // not OK
false

除了这些,我们设置可以把那些明显不能比较的值进行比较(我勒个去~~比较的结果居然还是 true):

> '' == 0
true
> '\n  123  \t' == 123
true

最后一次比较返回是 true,因为在 javascript 中把字符串转换数字类型时,会过滤掉首尾空白字符。 如果你仍然对关于 == 怎么工作感兴趣,你可以读读这篇文章。 对于严格比较符(===),不同类型的值比较是不相等的 [1]。也就是说试用严格比较符号,上诉的问题都不复存在。

参考文献:

  1. Equality in JavaScript: === versus ==

  2. When is it OK to use == in JavaScript?

加载中
0
我不叫大脸猫
我不叫大脸猫
弱类型的语言做对比的时候本来就应该用严格比较,不应该依赖语言自己的类型转换规则,这跟语言有没有怪癖有半毛钱关系,坐飞机别人没说不让带可燃物品你就能带着可燃物品上去了?
0
戴威
戴威
这是语言特性,==的存在方便你做一些简单的比较,非要像某些语言两个数字比较还要调用equals方法?
0
liujb88
liujb88
个人强烈建议在使用js的时候尽可能使用===,!==
0
亭舸翁
亭舸翁
本来就不是一个东西,各有各的用处
0
iranw
iranw
看到我翻译的文章了 呵呵
0
atearsan
atearsan

没大关注过js的===,我一般都是用==。
印象中好像是==会对右边的变量转型(如果类型不一致)。
现在也没因为过使用==出现问题的

-1
orientalfashion
orientalfashion
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
 return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
 if (this == anObject) {
     return true;
 }
 if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
 }
 return false;
    }

String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法。

unity3d学习者http://www.unitymanual.com/


OSCHINA
登录后可查看更多优质内容
返回顶部
顶部