Boolean() 函数、相等和不相等(== 和 !=)、逻辑非操作符(!)

Boolean() 函数、相等和不相等(== 和 !=)、逻辑非操作符(!)这三类放在一起经常会弄混,所以今天特地做一总结和比较。

(以下内容摘自《 JavaScript 高级程序设计(第三版)》)


1、Boolean() 函数

Boolean 类型是 ECMAScript 中使用得最多的一种类型,该类型只有两个字面值:true 和 false。

一般在流控制语句里需要使用 Boolean 类型,所以在流控制语句里会自动执行相应的 Boolean 转换,将非 Boolean  类型的数据类型转换成 Boolean 类型,比如 if 语句、while 语句里条件判断。 下表给出各种数据类型及其对应的转换规则。

数据类型转换为 true 的值转换为 false 的值
Booleantruefalse
String任何非空字符串“” (空字符串)
Number任何非零数字值0 和 NAN
Object任何对象null
Undefinednot application (不适用)undefined


2、逻辑非操作符(!)

逻辑非操作符由一个叹号(! )表示,可以应用于 ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。也就是说,逻辑非操作符遵循下列规则: 

  • 如果操作数是一个对象,返回 false; 
  • 如果操作数是一个空字符串,返回 true; 
  • 如果操作数是一个非空字符串,返回 false; 
  • 如果操作数是数值 0,返回 true; 
  • 如果操作数是任意非 0 数值(包括 Infinity) ,返回 false; 
  • 如果操作数是 null,返回 true; 
  • 如果操作数是 NaN,返回 true; 
  • 如果操作数是 undefined,返回 true。 
下面几个例子展示了应用上述规则的结果: 
 
alert(!false);       // true 
alert(!"blue");      // false 
alert(!0);           
// true 
alert(!NaN);         // true 
alert(!"");          // true 
alert(!12345);       
// false 
 
逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操作符,实际上就会模拟 Boolean()转型函数的行为。其中,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,而第二个逻辑非操作则对该布尔值求反,于是就得到了这个值真正对应的布尔值。当然,最终结果与对这个值使用 Boolean()函数相同,如下面的例子所示:

alert(!!"blue");      //true 
alert(!!0);          //false 
alert(!!NaN);        
//false 
alert(!!"");          //false 
alert(!!12345);      //true 


3、相等和不相等( == 和 != )

ECMAScript 中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回 true。而不相等操作符由叹号后跟等于号(!=)表示,如果两个操作数不相等,则返回 true。这两个操作符都会先转换操作数(通常称为强制转型) ,然后再比较它们的相等性。 
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则: 

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
  • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较; 

这两个操作符在进行比较时则要遵循下列规则。 

  • null 和 undefined 是相等的。 
  • 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。 
  • 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则,NaN 不等于 NaN。 
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。 
下表列出了一些特殊情况及比较结果: 
 

表达式

null == undefined

true

"NaN" == NaN

false

5 == NaN

false

NaN == NaN

false

NaN != NaN

true

false == 0

true

true == 1

true

true == 2 

false

undefined == 0

false

null == 0

false

"5"==5

true

在此处需要注意的是,相等与不相等不是先将操作数转换成Boolean类型。另外, undefined、 null  与 0 不相等。 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中,==是比较两个对象的引用是否相等,也就是比较两个对象是否是同一个对象。而equals方法通常被用来比较两个对象的内容是否相等,也就是比较两个对象是否具有相同的属性值。 举个例子,如果有两个Person对象p1和p2,它们的属性值完全相同,那么p1.equals(p2)会返回true,但p1==p2会返回false,因为它们是两个不同的对象。 需要注意的是,如果一个类没有重写equals方法,那么默认会使用Object类的equals方法,这个方法会比较两个对象的引用是否相等,也就是使用==比较。因此,在实现自定义类时,通常需要重写equals方法来比较对象的内容是否相等。 ### 回答2: 在Java中,"=="和"equals"都是用于比较两个对象的操作符。 "=="是一个运算符,用于比较两个对象的引用是否指向同一个内存地址。具体来说,如果两个对象引用的是同一个内存地址,则返回true,否则返回false。这个比较是基于对象的地址进行的,不涉及对象的内容。例如: ``` String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // 输出true,因为str1和str2都引用了同一个字符串对象的内存地址 ``` "equals"是Object类的一个方法,用于比较两个对象的内容是否相等。这个方法是需要根据具体的类来实现的,一般情况下,在使用之前需要重写它来实现自定义的比较规则。例如,在String类中,它被重写为比较字符串的内容是否相等。具体来说,如果两个对象的内容相等,则返回true,否则返回false。例如: ``` String str1 = "abc"; String str2 = new String("abc"); System.out.println(str1.equals(str2)); // 输出true,因为str1和str2的内容相等 ``` 需要注意的是,对于基本数据类型(如int、char等),"=="可以进行比较,因为它们存储的是具体的数值而不是对象的引用。而对于引用类型的对象,"=="只比较对象的引用,而不比较对象的内容。因此,在比较两个引用类型的对象的内容时,应该使用"equals"方法。 ### 回答3: 在Java中,==和equals()都是用于比较两个对象的方法,但其用途和实现方式有所不同。 1. == ==是用于比较两个对象的引用是否相同。如果两个对象的引用指向的是同一个内存地址,即指向同一个对象,则返回true;否则返回false。例如: ```java String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // 输出 true ``` 在上述例子中,str1和str2引用的是同一个字符串对象,因此返回true。但是需要注意的是,如果对象是通过new关键字创建的,会生成新的内存地址,即使内容一样,也不会返回true。例如: ```java String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2); // 输出 false ``` 2. equals() equals()是用于比较两个对象的内容是否相等。默认情况下,equals()使用的是Object类中的实现,即比较两个对象的引用是否相同。如果希望比较对象的内容,需要在类中重写equals()方法。例如: ```java public class Person { private String name; private int age; // 构造函数和其他方法省略 @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } // hashCode()方法也需要重写,保证在比较对象时,hashCode相等才调用equals() @Override public int hashCode() { return Objects.hash(name, age); } } ``` 在上述例子中,重写了equals()方法,比较的是Person对象的name和age属性是否相等。这样,在调用equals()方法时,可以比较两个Person对象的内容是否相同。例如: ```java Person person1 = new Person("Alice", 20); Person person2 = new Person("Alice", 20); System.out.println(person1.equals(person2)); // 输出 true ``` 总结: ==用于比较两个对象的引用是否相同,而equals()用于比较两个对象的内容是否相等。通常情况下,我们更关心对象的内容是否相等,因此需要重写equals()方法来实现内容的比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值