js数据类型
共有八种数据类型
undefined、Null、 Boolean、 String、 Number、 Symbol、 BigInt、 Object
基本数据类型: undefined Null Boolean String Number
引用数据类型: Object
Symbol和Bigint是ES6中新提出来的数据类型。
Symbol: 表示创建的数据是独一无二的不可变的,主要是用来解决全局变量冲突的问题。
BigInt: 是一种数字类型,可以用来表示任意精度的整数,可以解决大数运算的精度问题,即使运算的结果已经超出Number能够表示的范围。
基本数据类型与引用数据类型的区别主要在于存储区域的不同。
基本数据类型:存储在栈中,它的占据空间小、大小固定,属于频繁使用的数据,所以放入栈存储空间。
引用数据类型:存储在堆中,它的占据空间大、大小不固定。如果存储在栈中会影响程序运行的性能。它在栈中存储有一个指针,用于指定当前自己在堆存储空间中的位置,当解释器寻找引用值时,会首先检索其在栈中的指针,取得地址后在堆中获取引用实体。
判断数据类型的方式
使用typeof
typeof undefined //undefined
typeof Null //object
typeof [] //object
typeof function(){} //function
typeof "" //string
typeof 1 //number
typeof false //boolean
typeof NaN //number
使用instanceof
instanceof只能正确判断引用数据类型,而不能判断基本数据类型。
原理:判断构造函数的prototype对象是否在实例对象的原型链上。
{} instanceof Object //true
[] instanceof Array //true
function(){} instanceof Function //true
let obj = new String("abc")
obj instanceof String //true
obj = new Boolean("true")
obj instanceof Boolean //true
obj = new Number(1)
obj instanceof Number //Number
使用constructor
查看实例对象的构造器是否是某构造函数
let obj = []
obj.constructor === Array //true
obj = {}
obj.constructor === Object //true
function Person(){}
obj = new Person()
obj.constructor === Person //true
(2).constructor === Number //true
(true).constructor === Boolean //true
使用Object.prototype.toString()
Object.prototype.toString.call(2) //"[object Number]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call({}) //"[object Object]"
Object.prototype.toString.call(function(){}) //"[object Function]"
为什么不直接使用Array或Function的toString()方法?
由于Array和Function是Object的实例,都重写了Object的toString()方法,Function的toString()方法返回的是函数体的字符串,数组的toString()方法返回的是包含所有元素的字符串,当调用方法时由于原型链的查找规则,会就近调用同名方法,所以当他们的实例对象直接调用toString()方法时,调用的是自身重写的toString()方法,此时的返回值无法准确的判断对象的类型,所以需要使用顶层对象Object的toString()方法才能获取对象的类型字符串。
判断是数组的其他方法
Array.isArray()
Array.isArray([]) ///true
Array.prototypr.isPrototypeOf()
判断Array的原型对象prototype是否是目标对象的对象原型__proto__所指向的原型对象。
每个实例对象都有一个__proto__属性在js中叫做对象原型,每个构造函数有一个prototype属性在js中叫做该构造函数的原型对象,一般情况下对象原型都指向实例对象的构造函数的原型对象。
Array.prototype.isPrototypeOf([]) //true
判断数据是非数值的方法
isNaN()
isNaN(2) //false
isNaN("a") //true
isNaN("2") //false
Number.isNaN()
Number.isNaN(1) //false
Number.isNaN("1") //true
Number.isNaN("a") //true
isNaN()与Number.isNaN()的区别:
isNaN():会先将非数字数据强制转换为Number数据类型,如果不能转换为Number类型或转换类型为NaN则返回true,否则为false
Number.isNaN():ES6中新引入的一个方法。用于判断数据是否严格等于NaN。与isNaN的区别在于它不会将数据强制转换为Nunber类型,只有在参数严格等于NaN时才返回true否则返回false。