一、js的数据类型有哪些?
js的数据类型有8中数据类型:分别是Number、String、Boolean、Null、Unefined、Symbol、BigInt、Object。
其中Symbol和BigInt是ES6新增的数据类型:
Symbol代表创建后独一无二不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
BigInt是一种数字类型的数据,它可以表示任意精度格式的整数,使用BigInt可以安全地存储和操作大整数,即使这个整数已经超过了Number能够表示对安全整数范围。
js数据类型可分为:基本数据类型和引用数据类型。
基本数据类型有:Number、String、Boolean、Null、Undefined、BigInt、Symbol。
引用数据类型有:Object。其中包括普通对象,数组对象,正则对象,日期(Date)对象,Math数学函数对象。
二、判断数据类型的方式?
1.typeof
写法1:typeof 要判断的数据;
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof 'str'); // string
console.log(typeof []); // object
console.log(typeof function () { }); // function
console.log(typeof {}); // object
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof Date); //function
console.log(typeof Math); //object
写法2:typeof(要判断的数据);
console.log(typeof(2)); // number
console.log(typeof(true)); // boolean
console.log(typeof('str')); // string
console.log(typeof([])); // object
console.log(typeof(function () { })); // function
console.log(typeof({})); // object
console.log(typeof(undefined)); // undefined
console.log(typeof(null)); // object
console.log(typeof(Date)); //function
console.log(typeof(Math)); //object
2.instanceof
instanceof可以正确判断对象的类型,其内部运行的机制是判断在其原型链中能否找到该类型的原型
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('str' instanceof String); // false
console.log([] instanceof Array); // true
console.log(function () { } instanceof Function); // true
console.log({} instanceof Object); //true
可以看到,instanceof只能正确判断引用数据类型的数据,而不能判断基本数据类型。instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。
3.constructor
constructor有两个作用,一是判断数据的类型,而是对象实例通过constructor对象访问他的构造函数。
console.log((2).constructor === Number); //true
console.log((true).constructor === Boolean); //true
console.log(('str').constructor === String); //true
console.log(([]).constructor === Array); //true
console.log((function () { }).constructor === Function); //true
console.log(({}).constructor === Object); //true
注意:如果创建一个对象来改变他的原型,constructor就不能用来判断数据类型了。
这里的f的prototype指向的是Array原型对象,而不再是Object原型对象,此时的f.constructor指向的是Array函数对象;
function Fn() { };
Fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor === Fn); // false
console.log(f.constructor === Array); // true
4.Object.prototype.toString.call()
object.prototype.toString.call()使用Object对象原型方法toString来判断数据类型
const obj =Object.prototype.toString
console.log(obj.call(2)); //Nunber
console.log(obj.call(true));//Boolean
console.log(obj.call('str'));//String
console.log(obj.call([]));//Array
console.log(obj.call(function(){}));//Function
console.log(obj.call({}));//Object
console.log(obj.call(undefined));//Undefined
console.log(obj.call(null));//Null