1、介绍一下js的数据类型有哪些,值是如何存储的
JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(es6新增,表示独一无二的值)和BigInt(es10新增);
1种引用数据类型——Object(Object本质上是由一组无序的名值对组成的)。里面包含 function、Array、Date等。JavaScript不支持任何创建自定义类型的机制,而所有值最终都将是上述 8 种数据类型之一。
原始数据类型:直接存储在栈(stack)中,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
引用数据类型:同时存储在栈(stack)和堆(heap)中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
2、JS中数据类型的判断( typeof,instanceof,constructor,Object.prototype.toString.call()
(1)typeof对于原始类型来说,除了null都可以显示正确的类型。
typeof对于对象来说,只有function能正确显示,其他都显示object。
所以,typeof并不能准确判断变量的类型,可以使用instanceof。
(2)instanceof能够正确判断类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的prototype。
instanceof可以精准的判断引用类型(object array function),而基本数据类型不可以被instanceof精准判断。
(3)constructor利用全等可以判断全部数据类型。
1 console.log((2).constructor === Number); // true 2 console.log((true).constructor === Boolean); // true 3 console.log(('str').constructor === String); // true
但是有一个坑,如果更改了一个对象的原型,它的constructor就会变得不可靠。
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 对象的原型方法 toString ,使用 call 进行狸猫换太子,借用Object的 toString 方法。
1 var a = Object.prototype.toString; 2 console.log(a.call(2)); 3 console.log(a.call(true));
3、null 和 undefined 的区别?
首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。
undefined 代表的含义是未定义, null 代表的含义是空对象(其实不是真的对象,请看下面的注意!)。一般变量声明了但还没有定义的时候会返回 undefined,null 主要用于赋值给一些可能会返回对象的变量,作为初始化。
当我们对两种类型使用 typeof 进行判断的时候,Null 类型化会返回 “object”,这是一个历史遗留的问题。当我们使用双等 号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。
4、 对this、call、apply和bind的理解
-
在浏览器里,在全局范围内this 指向window对象;
-
在函数中,this永远指向最后调用他的那个对象;
-
构造函数中,this指向new出来的那个新的对象;
-
call、apply、bind中的this被强绑定在指定的那个对象上;
-
箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
-
apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。