js属于弱数据类型语言,一个变量可以赋值不同的数据类型。
目前js的数据类型一共有以下7种:
基本数据类型(操作值)
- string
- number (浮点类型)
- boolean
- undefined
- null
- symbol
引用数据类型(操作地址)
- Object
包括object,array,function,date,RegExp,
基本数据类型
1、number 数字
强制类型转换
1)返回值为数字或者NaN (not a number)
Number(a)
机制:从左往右查找,只要一个不是数字则返回 NaN
"" , [],null, false 的返回值都为0
true 的返回值都为1
undefined 返回值为 NaN
16px 返回 NaN
2)isNaN 表示不是一个数字
不是数字,返回true。是数字返回false
空 null true false 的返回值都为false
undefined 返回值为 true
非强制类型转换
3)parseInt 返回整数,忽略小数
机制:从左往右查找字符不是数字则返回 NaN,是数字则返回数字,取整数。
console.log(parseInt(' ') )
空值 true false null undefined 的返回值都为 NaN
16px 返回 16
4)parseFloat 浮点数 返回小数
NaN跟任何值比较都不相等,包括它自己本身
空值 true false null undefined的返回值都为 NaN
NaN == NaN false
2、string 字符串
toString()
3、boolean (true/false) 布尔类型
如果逻辑对象无初始值或者其值为 0、-0、null、""、false、undefined 或者 NaN,那么对象的值为 false。否则,其值为 true(即使当自变量为字符串 "false" 时)数组,对象都为真
!先转化为布尔,再取反
!! 直接调用布尔
4、undefined 只声明未定义
5、null 空值
console.log(Number(null)) 返回 0
基本数据类型之间互不影响,一个值改变,另一个值不会改变
引用数据类型
一、对象数据类型
1、对象类 (object)
获取属性值的方式:
对象名.属性名
对象名["属性名"]
数字可以作为属性名,但是获取的只能用第二种
2、数组类 (Array)
3、正则类 (RegExp)
4、时间类 Date
js中的所有元素都是对象,对象中分很多类,每一个具体类又可以细分为实例
二、函数数据类型
1、数学类 (Math)
规律
数字和其他类型的数据比较
数字 == 字符串 字符串先调用(number( ))强制转化为数字,再比较
1== '1' //true
1== '123' //false
1=='1px' //false
0==[] //true
0=={} //false
数字和其他类型数据类型比较,都是先把其他数据类型先转化为数字类型。跟对象数据类型,先调用toString( )方法,再调用Number( ) ,转化为数字类型
字符串和其他类型数据的比较
字符串 == 布尔(true false) 都先转化为数字,再比较
字符串 ==对象 都先转化为数字,再比较。空数组为0,空字符串也为0
布尔数据类型和其它数据类型
布尔== 对象 都分别转换为数字类型,再比较
对象数据类型
先调用toString( )方法,再调用Number( ) ,转化为数字类型
比较法则:
- null 或 undefined 跟其他数据类型比较 都为false
null == undefined 为true
null === undefined 为false - 对象 == 对象 false
- 数据类型的比较都要转化为数字,再进行比较
- NaN 跟任何都不相等,都为false
- 同样类型的数据比较数值就可以
基本数据类型和引用数据类型的区别
- 基本数据类型操作的值,引用数据类型,操作的是一个内存地址;
- 基本数据之间互不影响,引用数据类型之间相互有影响
- 浏览器会开辟一个环境,让代码自上而下执行,代码块后面的内容以字符串的形式存在内存地址里
判断数据类型的方法
- typeof 用来检测基本数据类型
返回值是字符串
typeof(null) //"object "
typeof(undefined) //"undefined"
typeof([ ]) //"object"
typeof(function(){}) // "function"
typeof 只要超过两个输出的都是 "string"
局限性:没办法去判断具体的数据类型,比如引用数据类型
- instanceof 用来检测对象数据类型
作用:判断一个实例属不属于这个类
验证原型对象与实例对象之间的关系 - constructor 构造函数 和instanceof 的作用比较像
- object.prototype.toString.call( ); 原型链
数据比较方法
两个值进行比较,如果数据类型不一样的话,会进行默认的数据类型转换
对象==对象:比较的是各自代表的内存地址,地址相同则相等,地址不同则不相等
对象==数字:先把对象toString,然后把结果在Number,最后和数字比较
对象==字符串:先把对象toString,然后在比较
对象==布尔:都转换成数字
字符串==数字:字符串转换成数字
字符串==布尔:都转换成数字
布尔==数字:布尔转换成数字
null==undefined是相等的,他们和自身也相等,除此之外和其它任何的值都不相等
NaN==NaN是不相等的
把一个值转换成布尔类型:!、!!、Boolean、if(num)条件的意思也是先把num转成布尔值验证真假...
只有“0、NaN、空字符串、Null、Undefined”代表false,其余都是true
![]==false:==判断的优先级是最低的,先把左右俩边的表达式执行,执行的结果在进行比较
![] 转换成布尔再取反,结果为true