js语法上并不严格,所以它非常灵活,但是也产生了很多奇怪现象,今天很是无聊就出来总结一下,欢迎大家集思广益
一、特殊false值,这里我指的是在if条件中,比如
if (!null) {
alert("null在if条件中是个false");
}
只要符合上面情况的,我们认为它在if条件中都是false
下面列出if条件中为false的情况
null、undefined、NaN、""、0、false
注意:我这里只是说它在if条件里是false,并没有说它就是false,比如
if (null == false) {
alert("null在if条件中是个false");
}
如果你想当然地认为alert会执行,我只能说你中枪了,那么==到底有什么特殊地方呢,请看二
二、特殊的双等号(==)规则
既然(1)中以==入手,这里接着说,==比较时,若两边的数据类型不同时会进行自动转换,这个也是与===不同之处
先给大家一个例子,看看是否跟你想像得一样
var arr = new Array();
if (arr) {
alert("arr在if中为true");
}
alert(arr == false);
上面代码运行结果是:
"arr在if中为true"
true
这里我先不解释,勾引你的兴趣,下面开始介绍
1、null、undefined、NaN
这是比较头疼的三个对象,先搞定它们
null==undefined 为true,这两个对象与任意值比较时都为false,比如null==0、null==false、undefined==0、undefined==false等全部为false,所有对象类型的数据若有值则与null、undefined都不等,但如果没有赋值,只作了声明,则为undefined,比如
var temp;
temp==null和temp==undeined都为true
temp = new Array();
那temp==null和temp==undefined都为false
NaN简直就是外星人,跟任意对象任意值作双等号比较时永远为false,最特殊的就是NaN==NaN为false,你可以认为NaN六亲不认,跟谁都不相等,因此在js中当你想判断一个值temp是否为NaN时一定要使用isNaN(temp),造成不要使用temp==NaN
这里大家在注意
typeof null为object
typeof undefined为undefined
typeof NaN为number
2、基本类型数据比较
同类型比较这里就不说了,太简单了,不同类型数据比较时,会自动转换成同类型数据比较,这里给出一些怪怪
0==""为true
0=="0"为true
上面现象说明字符串类型转成number类型时,如果串本身就是一个数字,那就会直接变成数字,比如"12"直接变成12,"0"直接变成0,特殊的空串""会转成0,其它的字符串全部转成NaN
"0"==false为true
""==false为true
"1"==true为true
"12"==true为false
上面现象我的解释是当字符串与布尔类型做比较时,都会转成数字,然后比较,字符串转数字规则上面已说明,布尔类型转数字就是1和0,根据这个规则大家再去理解一下上面的现象,应该就通了
3、Array的超怪规则
大家平时写代码时肯定没有用Array类型与一个数字或者一个字符串去==比较过,所以这里讨论这个现象其实没有实用价值,但该现象较为怪异,所以这里还是给出来了
var arr = Array(0);
alert(arr.length);
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == false);
打印的值依次为:0,true,true,false,true
var arr = Array(1);
alert(arr.length);
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == false);
打印的值依次为:1,true,true,false,true
var arr = Array(2);
alert(arr.length);
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == false);
打印的值依次为:2,false,false,false,false
先把上面的现象总结一下,当数组中没有元素时,那长度为0和1时转成字符串为"",转成数字为0,转成布尔为false,当长度大于1时,那就没法转了(此处不知道怎么描述了),下面再说明一下array有值的情况
var arr = Array();
arr.push("0");
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == "0,1")
alert(arr == false);
打印值依次为true,true,true,false,true
var arr = Array();
arr.push("1");
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == false);
打印值依次为false,false,false,false
var arr = Array();
arr.push("0");
arr.push("1");
alert(arr == 0);
alert(arr == "");
alert(arr == "0");
alert(arr == "0,1")
alert(arr == false);
打印值依次为false,false,false,true,false
聪明的人一定看出来了,当数组中有元素时,做数据类型转换时,数据会先将元素拼接起来,类似于执行了一句var temp=arr.join(",");之后再用temp去做比较,然后上面的现象就可以解释了
三、加法运算时的现象
我们平时常用到的加法运算一般都是数字间的计算和字符串拼接,下面来看一些特殊情况吧
alert(true + 1); 2
alert(false + 1); 1
alert(null + 1); 1
alert(undefined + 1); NaN
alert(NaN + 1); NaN
alert("" + 1); 1
alert("0" + 1); 01
alert("1" + null); 1null
alert("1" + undefined); 1undefined
alert("1" + NaN); 1NaN
var arr = Array();
alert(1 + arr); 1
alert("1" + arr); 1
arr.push(10);
alert(1 + arr); 110
alert("1" + arr); 110
arr.push(20);
alert(1 + arr); 110,20
alert("1" + arr); 110,20
var student = function(){};
alert(1 + student); 1function(){}
alert("1" + student); 1function(){}
var a = new student();
alert(1 + a); 1[object Object]
alert("1" + a); 1[object Object]
上面这些我就不解释了,读者自己思考,我想你把它们想明白了一定会有很多收获的。
我自己写得都有点乱了,感觉思路有些不清晰了,不过我想作为一个前端开发人员,尤其使用js的人员,如果你仔细思考一下上面的这些现象一定会对你深入认识js有一定帮助的。