1、基础类型保存在栈中的类型就是基础类型,基础类型占用空间小,存放在栈中放查找,且不易于改变。
JS中的基础类型:
Undefined, Null, Boolean, Number, String,Symbol(es6新加类型)
2、引用类型:
多个值构成的对象,引用数据类型存储的堆中,相当于存储在变量出的值是一个指针,指针指向存储对象的内存地址。存在堆中的原因:引用值得大小会改变,所以不能放在栈中,否则会降低变量的查询速度。
JS中的引用类型:
Object
3、如何判断类型
3.1 typeof
console.log(typeof 1); //number
console.log(typeof '1'); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof NaN); // number
console.log(typeof true); // boolean
let soro = new String() || {};
console.log(typeof soro); // object
let f = function() {};
console.log(typeof f); // function
typeof 判断引用类型不能细分出来,如:
const a = null typeof a //object
const b = { a: 1 } typeof a // object
const c = ['a'] typeof a // object
所以我们使用 instanceof 来判断引用类型更加准确, instanceof 判断一个实例是否属于某种类型,使用如下:
3.2 instanceof
使用instanceof判断基础类型:
console.log(null instanceof Object) // false
console.log(1 instanceof Number) // false
console.log('1' instanceof String) // false
console.log(true instanceof String) // false
使用instanceof判断引用类型:
console.log(function f() {} instanceof Function) // true
console.log(function f() {} instanceof Object) // true
console.log({} instanceof Object) // true
console.log([] instanceof Array) // true
console.log([] instanceof Object) // true
从以上可以看出instanceof对引用类型可精准判断,因为instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数的pototype属性,意思就是判断对象是否是某一种数据类型的实例 1 ‘1’ true 并不是实例,所以为false。
console.log(new Number(1) instanceof Number) // true
console.log(new String('1') instanceof String) // true
console.log(new Boolean(true) instanceof Boolean) //true
console.log(new null() instanceof Null); //Uncaught TypeError: null is not a constructor
console.log(new undefined() instanceof Undefined); //Uncaught TypeError: undefined is not a constructor
之所以不能判断null,undefined,因为null,undefined 不是构造函数。
3.3 constructor
具体使用:
console.log((1).constructor === Number) // true
console.log(('1').constructor === String) // true
console.log(true.constructor === Boolean) // true
console.log({}.constructor === Object) // true
console.log([].constructor === Array) // true
console.log(function f() {}.constructor === Function) // true
使用constructor也可以判断,但当改变对象的原型时候,在判断就问题
function Foo() {}
Foo.prototype = new Array();
let foo = new Foo();
console.log(foo.constructor === Array); //true
这是因为js每个函数都有个prototype 属性,指向原型对象,对象.prototype.constructor 指向的是该对象的构造函数,当把该对象的原型对象更改时,该函数的构造对象也会更改,所以就会出现如上的问题。