一、js中有哪些数据类型:
(1)原始类型
- string
- number
- boolean
- undefined
- null
(2)引用类型
- object
三大引用类型包括:Object,Array,Function(对象,数组,函数)
js堆栈:
什么是堆,什么是栈?
栈:计算机为原始类型开辟的一块内存空间,string,number…
堆:计算机为引用类型开辟的一块内存空间,object
对于引用类型的理解:
例如:var c={key:1};
计算机会给c在栈里面存一个地址值,如[‘x0000123’],计算机会把数据放到堆中,因为对象可能会很大,属性很多,所以计算机会自动把object数据存到堆中,然后c通过栈中的地址值指向堆,
此时var d=c;就相当于c把栈中的地址值[‘x0000123’]赋值给了d,d就通过这个地址值找到了对应的堆中的数据,如果此时d把堆中的数据改掉,那么也就改掉了a指向的堆中的值。
d.key=2;
输出结果,a.key=2,d.key=2;
因为a,和b的地址值是一样的,所以他们再堆中对应的值也是一样的。
对于原始值的理解:
var a='hello';
var b=a;
b="world";
console.log(a);//输出结果a=hello
console.log(b);//输出结果b=world
先定义了一个原始数据a,计算机自动给它分配到栈中,并给它一个内存空间,又定义了一个b,那么计算机会单独给b再分配一个内存空间,把a的值赋值给b,当b中的数据修改时,不会改变a的值,因为他们属于独立的存储空间。
堆和栈最大的区别就是,堆是在栈里面存了一个地址。而栈中存储的数据永远都是原始类型的值。
原始值放在栈中,引用值放在堆中。
关于堆栈理解:
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
实例:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
二、通过typeof可以获取变量的数据类型
如:
typeof 123 输出 number类型
typeof ‘avc’ 输出 string类型
typeof true 输出 boolean类型
typeof undefined 输出 undefined类型
typeof null 输出 object类型
null类型进行typeof操作符后,结果是object,原因在于,null类型被当做一个空对象引用。
typeof {} 输出 object类型
typeof [] 输出 object类型
typeof(new Date());输出object类型
typeof(Array)输出function类型
说明:typeof在ECMA中定义,当object中不包括[[call]]时,返回object,如果包括call时,返回function
typeof(function(){})输出function类型
实例:
如下代码,输出function类型
let a=function(){console.log("haha")};
typeof a//打印结果是 function
如下代码,输出undefined,当没有给变量赋值时,返回的就是undefined类型
var a;
typeof a;//打印结果是undefined
实例2:
var str='mooc';
console.log(typeof(str));//输出结果是string
var str1=new String('mooc');//通过一个new,String的构造函数,实例化后的对象
//str1实例化,底层逻辑其实是,通过key,value的方式,通过索引的方式把mooc拆分开每一个字母都输入到索引上面。0:'m',1:'o',2:'o',3:'c'
console.log(typeof str1);//输出结果是object
三、通过instanceof来检测
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
返回结果是一个boolean值,包括:true,false
语法结构:
A instanceof B,就是判断A对象是否由B对象实例化后得出来的。
instanceof检测的时候是顺着原型链来检测的
实例如下:
console.log({} instanceof Object);//输出结果是true
console.log(new Date() instanceof Date);//输出结果是true
function Person(){};
console.log(new Person() instanceof Person);//输出结果是true
console.log([] instanceof Array);//输出结果是true
console.log([] instanceof Object);//输出结果是true,是由于instanceof是顺着原型链来检测的。
说明:
如判断A instanceof B,判断A是否是B实例化出来的,如果返回一个true,然后B instanceof C返回true,那么A instanceof C返回的就是true,这既是原型链的关系
检测我们某个对象属于那种内置类型
可以通过Object.prototype.toString方法,判断某个对象之属于哪种内置类型。
实例:
Object.prototype.toString.call([]);//输出结果'[object Array]'
Object.prototype.toString.call(new Date());//输出结果'[object Date]'
Object.prototype.toString.call(null);//输出结果'[object Null]'
object类型:
js中对象是一组属性与方法的集合。
详情参考:https://blog.csdn.net/qq_42238554/article/details/86161970
总结:
typeof返回值是一个字符串,该字符串说明运算数的类型,结果为number,boolean,string,function(函数),object(NULL,数组,对象),undefined.
instanceof是用来判断A是否为B的实例对象,检测的是原型