JavaScript是弱类型语言(动态类型),即一个变量可以引用任意类型数据,造成了方便开发的同时也多了一些需要考量的东西,尤其涉及不同类型数据的处理。
以下为js数据类型:
字符串('aa',"aaa")、
数字(123,123.00,1.23e2)、
布尔(true,false)、
数组(['a','b','c'])、
对象({firstname:"Bill","lastname":"Gates",age:18})、
Null(null:不存在的对象,如getElementById("xxx"))、
Undefined(undefined:未赋值变量或对象的未声明属性)
document.writeln(typeof 1);//number
document.writeln(typeof NaN);//number
document.writeln(typeof "aa");//string
document.writeln(typeof true);//boolean
document.writeln(typeof [1,2]);//object
document.writeln(typeof {a:1,b:2});//object
document.writeln(typeof null);//object
document.writeln(typeof undefined);//undefined
所以数组也是对象,对象类型变量存储引用,而字符串、数字、布尔为基本类型存储值
再来看看数据的比较:
"==="运算符,表示绝对的相等(类型和内容):
比如:
1 === 1;//true
1==="1";//false 类型不同
"aa" === "bb";//false
true === false; //false
需要注意:
null === null;//true
undefined === undefined;//true
null === undefined;//false
对象类型比较除非引用为同一对象,否则即使两个对象内容相同也为false
"=="运算符,不严格匹配,两个比较对象类型相同时,结果同"===",类型不同时,根据以下规则判断:
1、当存在boolean类型,true转换为1,false转换为0进行比较;
2、当存在string时,字符串为数字且和另一边数值相等为true,其他为false;
3、对象类型和基本类型的比较(待补充。)
4、null == undefined;//true
5、NaN不与任何值相等,包括本身
例如:
number,string比较:
1 == "1";//true
1 == "true";//false
0 == "false";//false
number,boolean比较:
1 == true //true
0 == false //true
2 == true;//false
2 == false;//false
string,boolean比较:
"true" == true;//false
"false" == false;//false
然后是关于if语句的判定,由于js的if语句里允许非boolean值出现,所以需要注意if(a) 和 if(a == true)的写法不仅仅是简洁问题,结论也可能不一样:
首先,下面这个语法
if(a){
alert(true);
}else{
alert(false);
}
当(注意此处均为赋值语句):
1、a为string类型时:a = "" (即空字符串)时执行false,其他执行true
2、a为number类型时:a = 0 或 a = NaN 时执行false,其他执行true
3、a = [](空数组) 或 a = {}(空对象) 执行true
4、a=undefined或a=null:执行false
于是,就可以看出if(a) 和 if(a == true)的区别:
1、a为boolean值时,结果相同
2、a为string:
a = "true",分别执行true,false
a = "false",分别执行true,false
a = "0",分别执行true,false
a = "1",分别执行true,true
a = "2",分别执行true,false
3、a为number:
a = 2,分别执行true,false
a = 1,分别执行true,true
a = 0,分别执行false,false
基于此种情况,为了保证程序的可读性,建议使用if(a) 或 if(a === true)的语法