JS基础类型和引用类型--学习笔记

78 阅读2分钟

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 指向的是该对象的构造函数,当把该对象的原型对象更改时,该函数的构造对象也会更改,所以就会出现如上的问题。