数据类型获取及js堆栈使用原理

一、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的实例对象,检测的是原型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值