数据类型,获取数据类型,强制转换数据类型
1、js数据类型分类
- 基本类型(值类型)
字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。 - 对象类型(数据类型)
对象(Object–任意对象)、数组(Array—特殊的对象,数值下标、内部是有序的)、函数(Function—特殊的对象,可以执行)
2、js数据类型判断
【typeof】-------格式:typeof 变量--------输出的是对应类型的小写字符串形式( ‘undefined’, ‘number’,‘string’,‘boolean’,‘function’)
- 可以判断undefined、数值、字符串、布尔值、函數
let a
console.log(a,typeof a,typeof a === 'undefined',a === undefined,'undefined' === undefined)
//undefined,'undefined',true,true,false
let b = 'aaa'
console.log(b,typeof b,typeof b === 'string')
//'aaa','string',true
let c = 1
console.log(c,typeof c,typeof c === 'number')
//1,'number',true
let d = true
console.log(d,typeof d,typeof d === 'boolean')
//true,'boolean',true
console.log(typeof console.log === 'function')
//true
- 不可以判断null与object、object与array
let a = null
console.log(typeof a,typeof a === 'object') //'object',true
//null的类型属于object,如果使用typeof区分则无法区分null与普通对象
let b = []
console.log(b,typeof b,typeof b === 'object')//'object',true
//数组array的类型属于object,如果使用typeof区分则无法区分null与普通对象
【instanceof】-----格式:实例对象 instanceof 构造函数 --------输出的是对应类型的判断 true / false
- 判断对象的具体类型(Object, Array,Function)
let b1 = {
b2: [ 1 , 'abc' , true , console.log ],
b3: function(){
return function(){
return 'meimei'
}
}
}
console.log(b1 instanceof Object ,b1 instanceof Array,) // true,false
console.log(b1.b2 instanceof Object ,b1.b2 instanceof Array,) // true,true
console.log(b1.b3 instanceof Object ,b1.b3 instanceof Function,) // true,true
console.log( typeof b1.b2, typeof b1.b3) // 'object','function'
console.log( typeof b1.b2[3]) // 'function'
console.log( b1.b3, b1.b3()) // 函数,无打印信息
console.log( b1.b3()() ) // 'meimei'
【=== // ==】-----比较两个数据是否相同,返回true / false
- **=== **判断两个数据是否完全相同,多用于undefined以及null的判断
- *== *判断两个数据的值是否相同
- 在比较的时候, **== **会发生数据类型转换,而 **=== **不会发生类型转换,也就是说,对于 **=== **的话,会先判断是否是同一个类型,如果不是的话,直接返回false,而 **== **的话呢,如果不是同一个类型,则会先根据一些规则,把他们转换成同种类型的,然后再进行比较。
console.log(undefined===null,undefined==null) //false,true undefined== null是对的
console.log(undefined===false,undefined==false) //false,false
console.log(undefined===0,undefined==0) //false,false
console.log(undefined==='',undefined=='') //false,false
console.log(null===0,null==0) //false,false
console.log(null===false,null==false) //false,false
console.log(null==='',null=='') //false,false
console.log(0==='',0=='') //false,true 0==''是对的
console.log(0==='0',0=='0') //false,true 0=='0'是对的
console.log(0===false,0==false,'0'==false) //false,true ,true 0==false,'0'==false是对的
console.log(''===false,''==false) //false,true ''==false是对的
3、强制数据类型转换
强制转化:是程序员人为的将数值或者变量存储的数据数值,转化为指定的数据类型
注:所有的强制转化,都不会改变变量中存储的原始数据内容
- 其他类型转为string类型
方法1:调用toString()方法,不会影响到原变量,是在原变量的基础上进行转化,将转换结果返回
注:null与undefined没有toString()方法,object需要使用JSON.stringify()
let a = 1
console.log(a,a.toSring())
//1,'1'
let b = true
console.log(b,b.toSring())
//true,'true'
let d = [1,2,3]
console.log(d,d.toSring())
//[1,2,3],'1,2,3'
console.log(undefined.toString())
//tUncaught TypeError: Cannot read property 'toString' of undefined at <anonymous>:1:11
console.log(null.toString())
//Uncaught TypeError: Cannot read property 'toString' of null at <anonymous>:1:6
let c = {name:'name1'}
console.log(c,JSON.stringify(c))
//1,"{"name":"name1"}"
方法2:调用String()函数,并将被转换的数据作为参数传递给函数。
注意:使用String()函数做强制类型转换时,对于Number和Boolean实际上就是调用的toString()方法,
但是对于null和undefined,就不会调用toString()方法,而是将null直接转换为字符串"null",将undefined直接转换为字符串"undefined"。
let a = 1
console.log(a,String(a))
//1,'1'
let b = true
console.log(b,String(b))
//true,'true'
let d = [1,2,3]
console.log(d,String(d))
//[1,2,3],'1,2,3'
console.log(undefined,String(undefined))
//undefined,'undefined'
console.log(null,String(null))
//null,'null'
- 其他类型转为Number类型
方法1:调用Number()函数
字符串转换成数字时,如果是纯数字的字符串,直接将其转换成数字;如果字符串中有非数字的内容,则转换为NaN.
如果字符串是一个空串或者是一个全是空格的字符串,则转换为0。null转换成number类型为0;undefined转换为number类型为NaN
let a ='1',b = 'nihao'
console.log(a,Number(a),b,Number(b))
//'1',1,'nihao',NaN
let c='',d=' '
console.log(c,Number(c),d,Number(d))
//0,0
let e = [1,2,3]
console.log(e,Number(e))
//[1,2,3],NaN
console.log(Number(undefined),Number(null))
//NaN,0
let f = {name:'name1'}
console.log(Number(f))
//NaN
方法2:针对字符串
- Number()、parseInt() 和 parseFloat() 的区别.
- parseInt()或parseFloat()把一个字符串转换成Number,可以将一个字符串中的有效整数内容取出来然后转换成Number;
- 如果对非String使用parseInt()或parseFloat(),parseInt()或parseFloat()会先将其转换为String然后再操作。
let a = 'sss123ddd',b='111sssdd22fff'
console.log(parseInt(a),parseInt(b),parseFloat(a),parseFloat(b))
//NaN,111,NaN,111
- **将其他数据类型转换为Boolean类型 **
使用Boolean()函数即可
4、undefined与null的相关知识
- undefined与null的区别
undefined:定义未赋值
null:定义并赋值,且值为null
let a ;
let b = null;
console.log(a,b)
//undefined,null
- 什么时候给变量赋值为null
null是基本数据类型,但是typeof(null)----object,比较矛盾
*初始赋值,表明将要赋值为对象
*结束前,让指向的对象成为垃圾对象被垃圾回收器回收
let b = null; //初始赋值为null,表明将要赋值为对象
b=[123,345]; //给对象赋值
b=null; //让b指向的对象成为垃圾对象(被垃圾回收器【存在浏览器内核中】回收)
- 严格区分数据类型和变量类型
数据类型:
基本类型
对象类型
变量类型(变量内存中值的类型):
基本类型:保存的是基本类型的数据
引用类型:保存的的是地址值
let b = null; //初始赋值为null,表明将要赋值为对象
b=[123,345]; //给对象赋值
b=null; //让b指向的对象成为垃圾对象(被垃圾回收器【存在浏览器内核中】回收)