原始值比较、对象比较、空数组与true/false的关系

原始值的比较
  • 原始值:
    undefined、unll、布尔值(boolean)、数字(number)、字符串(string)

  • 原始值的比较是值的比较:
    只有在它们的值想等时它们才想等。如果比较两个单独的字符串,当且仅当它们的长度相等且每个索引的字符都相等,js才认为它们相等。

null == undefined //true(不明白,两者转换成数字,一个是0,一个是NaN,为什么会相等)
'0' == 0 		  //true(在比较之前字符串转换成数字)
'0' == false	  //true(在比较之前字符串和布尔值都转换成数字)
0 == false 		  //true(在比较之前布尔值转换成数字)

总结:布尔值、数字、字符串三者在比较之前要先转换成数字。

对象的比较
  • 对象的比较并非值的比较:
    即使两个对象包含同样的属性及相同的值,它们也是不相等的。
    各个索引元素完全相等的两个数组也不相等。
var a = {x : 1}, b = {x : 1};
a === b;		//false:两个单独的对象永不相等
var x = [], y = [];
x === y;		//false:两个单独的数组永不相等
  • 对象的比较均是引用的比较:
    当且仅当它们引用同一个基对象时,它们才相等。
var a = [];		//定义一个引用空数组的变量a
var b = a;		//变量b引用同一个数组
b[0] = 1;		//通过变量b来修改引用的数组
a[0];			// => 1:变量a也会修改
a === b;		// => true:a和b引用同一个数组,因此它们相等
空数组与true/false的关系

注1:undefined、null、""、0、-0、NaN转换成false,其余转换成true。

1.对象用于判断条件时会转换成true

if([]){
    alert('true');	可以弹出true
  }

2.将空数组转成Boolean结果是true

Boolean([]);		//true

3.但是将[]与布尔值false比较却是true,既然Boolean([])是true,为什么[] == false?

[] == false;		//true

4.解释:因为当数组与布尔值进行比较时,是将==两边先转成Number再进行比较。而空数组转换成数字0,false也转换成数字0,所以[] == false。

总结:
空数组和布尔值有两种关系:当空数组作为判断条件时,相当于true。当空数组与布尔值直接比较时,相当于false。

小问题

new Array(1) == false;	// true
new Array(3) == false	//false
为什么两条语句的结果不一样,是什么原因导致的???

1.我们要知道NaN 和 0 是不相等的。

alert(NaN == 0);	//false

2.对象到数字的转换过程:调用toString()方法,返回一个字符串直接量,js将这个字符串转换成数字类型,并返回这个数字。--------《JavaScript权威指南》想知道详细点的可以去查看54页

3.解释 new Array(1) == false //true。数组与布尔值进行比较时,是将= =两边先转成Number再进行比较

new Array(1) 该语句是创建长度为1的数组,注意:数组里面是空的,没有存储值。
var a = new Array(1);		//创建一长度为1的数组
alert(a);					//=> "":空的数组,什么都没有
var b = a.toString();		// 调用toString()方法
alert(b);					// => "" :返回一个空字符串
var c = Number(b);			// 把字符串转换成数字类型
alert(c);					//=> 0 

我们知道false转换成数字类型也是 0
所以 new Array(1) == false 	//true

4.解释 new Array(3) == false //false。

new Array(3) 该语句是创建长度为3的数组,注意:数组里面是空的,没有存储值。
var a = new Array(3);		//创建一长度为3的数组
alert(a);					//=> ",,"
var b = a.toString();		// 调用toString()方法
alert(b);					// => ",," :返回一个",,"字符串
var c = Number(b);			//把字符串转换成数字类型
alert(c);					//=> NaN 
	
我们知道false转换成数字类型是 0NaN0 是不相等的(上面提到)。
所以 new Array(3) == false 	//false
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值