js中数据类型转换的一些奇怪现象,一定有你不知道的

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有一定帮助的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值