六种原始数据类型:undefined,null,number,string,boolean,Symbol
一种引用数据类型:Object
null和undefined的区别:
null值表示一个空对象指针
类型上:
typeof null === ‘object’
typeof undefined = 'undefined’
数值上:
Number(null) === 0
Number(undefined) === NaN
但是注意null==0、undefined==0
都为false,记住null和undefined比较类型时都不做自动的类型转换。
Symbol:
作用:保证每个属性的名字都是独一无二的,实现一个唯一的不重复的不可改变的值(独一无二的值),防止变量或属性名重名。
arr=Object.getOwnPropertySymbols(popUp);
之所以把数据类型区分为两种不同的类型,是因为它们在内存中存放的位置不一样。原始类型的数据是存放在栈中的,引用类型的数据是存放在堆中的,JavaScript 引擎并不是直接将该对象存放到变量环境中,而是将它分配到堆空间里面,分配后该对象会有一个在“堆”中的地址,然后再将该数据的地址写进栈中变量的变量值,堆中的数据通过引用和栈中的变量关联起来。
从上图可以看出,对象类型是存放在堆空间的,在栈空间中只是保留了对象的引用地址,当 JavaScript 需要访问该数据的时候,是通过栈中的引用地址来访问的。
为什么一定要分“堆”和“栈”两个存储空间呢?所有数据直接存放在“栈”中不就可以了吗?答案是不可以的。这是因为 JavaScript 引擎需要用栈来维护程序执行期间上下文的状态,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文切换的效率,进而又影响到整个程序的执行效率。
在 JavaScript 中将一个原始类型的变量 a 赋值给 b,那么 a 和 b 会相互独立、互不影响;但是将引用类型的变量 c赋值给变量 d,那会导致 c、d 两个变量都同时指向了堆中的同一块数据。
闭包也是存放在堆中的!!!
Object上的一些方法:
Object.assign(target,source)浅拷贝
Object.defineProperty()直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。Object.defineProperty(obj, prop, descriptor)
Object.entries(obj).forEach([key,val])