JavaScript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的(字符串是不可更改的!)。
原始值的比较是值的比较;对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不相等。两个单独的对象永不相等,两个单独的数组永不相等。通常将对象称为引用类型,对象值都是引用,对象的比较均是引用的比较:当前仅当它们引用同一个基对象时,它们才相等。
如果想得到一个对象或数组的副本,必须显示复制对象的每个属性或数组的每个元素。相比较两个单独的对象或数组,必须比较它们的属性或元素。
JavaScript中的内存分为栈内存和堆内存。一般来说,栈内存中存放的是存储对象的地址,堆内存中存放的是存储对象的具体内容。对于原始类型,地址和具体内容都存放在栈内存中;对于引用类型,地址在栈内存,具体内容存放在堆内存中。栈空间小,但可以被解释器直接检索,响应速度快。堆空间大,但不能被程序栈直接检索,响应速度慢。
内存中存储对象的生命周期:
- 当对象将被需要时为其分配内存
- 使用已分配的内存进行读写操作
- 对象不再被需要时,释放存储这个对象的内存