1. js的七种数据类型
基本数据类型
:Number、String、Boolean、Undefined、Null、Symbol
引用数据类型
:统称为 Object 类型。细分的话,有 Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型。
基本数据类型与引用数据类型的区别:
- 从内存角度来说,基本数据类型在内存中占据一块空间,空间里存储的就是数据。获取数据是直接获取。
引用数据类型在内存中占据两块空间,第一块空间存储的是地址,第二块空间存储的是数据。获取数据是间接获取。 - 从赋值角度来说,基本数据类型赋的是值,引用数据类型赋的是地址。
- 从函数传参角度来说,基本数据类型传的是值,引用数据类型传的是地址。
Undefined 类型与Null 类型的区别
Undefined 类型只有一个值,就是特殊值 undefined。当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值。
Null 类型同样只有一个值,就是特殊值 null。逻辑上讲,null 值表示一个空对象指针。如果未来要定义的变量是一个对象,而当时又没有对象可保存,此时就可以使用 null 来对变量进行初始化。表示这个对象目前还没有存储地址。
2. js判断数据类型
下面将对如下数据进行判断它们的类型
let bool = true; //Boolean
let num = 1; //Number
let str = 'abc'; //String
let und = undefined; //Undefined
let nul = null; //Null
let arr = [1,2,3]; //Object数组
let obj = {name:'haoxl',age:18}; //Object对象
let fun = function(){console.log('I am a function')}; // Object函数
1. 使用Object.prototype.toString.call() —推荐方法
日常使用,这个就足够了
console.log(Object.prototype.toString.call(bool));//[object Boolean]
console.log(Object.prototype.toString.call(num));//[object Number]
console.log(Object.prototype.toString.call(str));//[object String]
console.log(Object.prototype.toString.call(und));//[object Undefined]
console.log(Object.prototype.toString.call(nul));//[object Null]
console.log(Object.prototype.toString.call(arr));//[object Array]
console.log(Object.prototype.toString.call(obj));//[object Object]
console.log(Object.prototype.toString.call(fun));//[object Function]
判断原生JSON对象
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
console.log(isNativeJSON);// 输出结果为”[object JSON]”说明JSON是原生的,否则不是;
2. 使用typeof
typeof可以测试出number、string、boolean、undefined及function,
而对于null、数组、对象,typeof均检测出为object,不能进一步判断它们的类型。
console.log(typeof bool); //boolean
console.log(typeof num);//number
console.log(typeof str);//string
console.log(typeof und);//undefined
console.log(typeof nul);//object
console.log(typeof arr);//object
console.log(typeof obj);//object
console.log(typeof fun);//function
3. 使用instanceof
instanceof不能区别undefined和null,而且对于基本类型如果不是用new声明的则也测试不出来,对于是使用new声明的类型,它还可以检测出多层继承关系。
console.log(bool instanceof Boolean);// false
console.log(num instanceof Number);// false
console.log(str instanceof String);// false
console.log(und instanceof Object);// false
console.log(nul instanceof Object);// false
console.log(arr instanceof Array);// true
console.log(obj instanceof Object);// true
console.log(fun instanceof Function);// true
4. 使用constructor
undefined和null没有contructor属性
, constructor不能判断undefined和null,并且使用它是不安全的,因为contructor的指向是可以改变的
console.log(bool.constructor === Boolean);// true
console.log(num.constructor === Number);// true
console.log(str.constructor === String);// true
console.log(arr.constructor === Array);// true
console.log(obj.constructor === Object);// true
console.log(fun.constructor === Function);// true