(2)引用类型:对象、数组、函数
(1)值类型:
1、占用空间固定,保存在栈中
2、保持和复制的都是值的本身
3、基本数据类型都是值类型
4、一个方法在执行时会创建一个内存栈,并在执行结束后自然销毁,栈里面存储的是基础变量和一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的指向堆中的数组或者对象的地址,这就是为什么 修改引用类型 总会影响到其他这个动作的引用变量。
(2)引用类型:
1、占用空间不固定,保存在堆。
2、保存和复制的是指向对象的一个指针。
3、堆内存的对象不会随方法的结束而被销毁,即使方法结束后,这个对象还可能被另一个引用变量所使用,那么这个对象依然不会销毁,只有一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会去核实的时候回收它。
(1)动态属性;定义基本类型值和引用类型值的方式是类似的。但是,当这个值保存到变量中以后,对不同类型值可以自行的操作大相径庭。对于引用类型的值,我们可以为它已经属性和方法,也可以改变和删除其属性的方法,但是,我们不能给基本类型的值添加属性,只能给引用类型值动态的添加属性,以便将来使用。
(2)如果从一个变量向另一个变量复制基本类型值,会在变量对象上创建一个新值,然后把该值分钟到为新变量分配的位置上。
(3)传递参数;在向参数传递基本类型的值时,被传递的值会分钟给一个局部变量(即命名参数)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
js的数据类型分为两大类:
基本类型:也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度, 将其存储在栈中,即按值访问 。
引用类型:也称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此, 其值存储在堆中 ,而存储在变量处的值,是一个指针,指向存储对象的内存处,即 按址访问 。引用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。
引用类型和基本类型的区别:
1、基本类型按 值 访问
需要注意的是:
A instanceof B用来判断A是否属于B的实例,返回true或者false。
需要注意的是:
ES5中可以用Array.isArray([])来准确判断数组的实例
当创建变量b时,js会在b的原型上添加constructor属性,指向b的引用
js在创建内置对象时,也是这么做的:
Object对象有tostring方法返回:
而非object对象,则需要call/apply才能正确返回类型,返回格式为字符串类型的 "[object 数据类型xxx]" :
以上几种方式可以在不同场景使用。