JS基础(三)数据类型汇总

数据类型的转换汇总

Number类型的转换

把其他数据类型转换为number类型的方法

isNaN,Number,parsseIn,praseFloat
在进行加减乘除运算时

1
2
3
4
5
'12px'=>NaN; "主灯"=>NaN
[ ] /null /false / ' ' /=>0
{ } /^$/ function(){}/ undefined /=>NaN
*注:引用类型在转化Number时,先转化为字符串(toString),再转变为数字(Nubber)。*
parseFloat('');=>NaN 与number不同

js中的数学运算

+、-、*、/、% 加减乘除取模
除了加法有特殊性,其与运算遇到非数字类型时都要先转换为Number在进行运算

注:+有字符串拼接的作用(就是把其他值转化为 字符串再拼接)
特殊:({ }).toString()==>'[object object ]'//对象的{}要用()包起来,否则报错,因为{}会被认为是代码块
其余都直接转化为字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//加法的特殊性
12+3+'2'=>152
'3'+4 =>34
null+'2' => 'null2'
// 其余运算
1-'1' =>0
10*null =>0

2+null+false+undefined+NaN+[1,2]+'珠 峰'+3
2+null =>2+0=2
2+false =>2+0=2
2+undefined =>2+NaN=NaN
NaN+NaN=NaN
NaN+[1,2] =>NaN+'1,2'=>'NaN1,2'
数组要先转化为字符串再转为数字再相加,但在转换为字符串时就会进行字符串的拼接
'NaN1,2'+'珠峰'+3='NaN1,2珠峰3'

布尔类型的转换

将其他数据转换为布尔类型(3种)

Blooean / ! / !!
判断语句
除以下5种外,其余都为true
0, null, ’ ‘, NaN, undefined,

注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//对象和对象比较:比较的是空间地址,不是同一个空间,肯定是false
[]==[] =>false

var a={};
var b=a;
a==b =>true //(空间地址相同)

//对象和数字比较,先调用toString方法
[]==0 =>true
({})==NaN =>false NaN和任何东西都不等,包括自己

//对象和字符串比较 (把两边都转化为字符串)
[]=='' =>true

//对象和布尔:(把两边都转化为数字)
[]==true =>0==1 =>false
[]==false =>true
![]==false =>true //![]把数组变为布尔再取反[]=true

//字符串和数字:(把两边都转化为数字)
//字符串和布尔: (把两边都转化为数字)
//布尔和数字: (把两边都转化为数字)

规律,两个等于号比较时,左右两边的的数据类型不一样,浏览器会把两边类型都转为数字再比较(对象类型比较特殊,应该先转化为字符串,再转化为数字),但是null和undefined除外null和undefined和其他任何值都不相等

1
2
null==undefined =>true 
null===undefined => false

规律,两个等于号比较时,两边类型相同时,直接比较,对象和对象比较的是空间地址;{}!={},另外NaN和任何值都不等

JS中的数据类型检测汇总

typeof

用来检测数据类型的运算符
语法:typeof [value],typeof后面跟的都是值
返回结果:首先是个字符串,字符串中包含了我们需要检测的数据类型
typeof null=’object’ >虽然时基本数据类型,但是它属于空对象指针,检测结果是对象(局限性)
并且不能细分出当前对象是数组还是正则(局限性)
typeof 1>1?1:2; =>2 //优先级,先计算typeof 1;再比较,

instanceof&constructor

instanceof:检测某一实例是否属于当前类
constructor:构造函数
使用instanceof检测某个值是否属于某个数据类型 的内之类,从而检测出它是否是这个类型的值,对对象类型的值有明显的区分

instanceof检测的弊端
基本类型的值无法基于它检测
var num=12; typeof num => ‘Number’
num instanceof Number =>false
var num2=Number(12); typeof num2 => ‘object’
num2 instanceof Number =>true
不管是哪一种方式创建基本类型值,都是自己所属类的实例,只不过类型不一样而已

instanceof 是基于原型链来检测的,是要当前类的实例在原型链上,最后返回的结果都是true,这也是instanceof的弊端

constructor
获取要检测数据类型的constructor属性,判断它是否为某个数据类型的内置类来检测
ary.constructor===Array; =>true;
ary.constructor=’AA’;
ary.constructor===”AA’; =>true
=>由于constructor的值可以被修改,所以检测结果非常不可靠

Object.prototype.toString.call([value])

获取Object.prototype的toString方法,将方法中的this改为需要检测数据类型的值,然后执行
在Number String Boolean Array……这些类的原型上都有toString方法,这个方法就是把本身的值转换为字符串的
在Object这个类的原型上也有一个toString方法,但是这个方法是返回当前值的所属类详细信息,固定结构:[Object 所属的类型]
使用该方法检测,不管你是什么值,我们都可以正正常检测出我们需要的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var obj={name:'珠峰'};
obj.toString() //=>"[object Object]" 调取的正是Object.prototype.toString

/*
* obj.toString()
* 首先执行Object.prototype.toString方法
* 这个方法中的this就是我们操作的数据值obj
* =>总结:Object.prototype.toString执行的时候会返回当前方法中this的所属类信息
*
* 也就是,我想知道谁的所属类信息,我们就把这个toString方法执行,并且让this变为我们检测的这个数据值,那么方法返回的结果就是当前检测这个值的所属类信息
*
* Object.prototype.toString.call([value])
* ({}).toString.call([value])
*/

因为alert弹出的都是字符串,所以会自动将()中的内容调用toString,而对象类型调用toString,会出现[Object 所属的类型]

坚持原创技术分享,您的支持将鼓励我继续创作!