数据类型
引用类型:
内存空间分为两种:
1.栈内存:
(1)存储的值大小固定
(2)空间较小
(3)相互之间操作就保存
(4)由系统自由分配存储空间
2.堆内存:
(1)存储的值大小不定,可动态调整
(2)空间较大,运行效率低
(3)无法直接操作其内存存储,使用引用地址读取
(4)通过代码进行分配空间
例子:
//引用类型的值实际存储在栈内存中
//它在栈中只存储一个固定长度的地址
//这个地址指向堆内存中的值
var obj1 = {name:"ConardLi"}
//obj1 = 0X000001
var obj2 = {age:18}
//obj2 = 0X000002
var obj3 = function(){...}
//obj3 = 0X000003
var obj4 = [1,2,3,4,5,6,7,8,9]
//obj4 = 0X000004
//引用类型可以轻易改变
obj1.name = "ConardLi6"
obj2.age = 19
obj4.length = 0
console.log(obj1)
console.log(obj2)
console.log(obj4)
赋值
赋值:
原始类型的赋值(赋的是值):
var name = "ConardLi"
var name2 = name
name2 = 'code秘密花园'
console.log(name)
引用类型的赋值(赋的是地址):
var obj = {name:"ConardLi"}
var obj2 = obj
obj2.name = 'code秘密花园'
console.log(obj.name)
比较
比较:
原始类型的比较(只要变量值一样,比较结果为true)
var name ='ConardLi'
var name2 = 'ConardLi'
console.log(name === name2)
引用类型的比较(尽管变量值一样,只要地址不一样,就返回false)
var obj = {name:"ConardLi"}
var obj2 = {name:'ConardLi'}
console.log(obj === obj2)
传递
传递:
//ECMAScript中所有的函数的参数都是按值传递的
//原始类型传递的就是自身
//引用类型传递时对应栈空间的地址
原始类型传递
let nmae = 'ConardLi'
function chageValue(name){
//等效于在函数内var name = 'ConardLi'
name = 'code秘密花园'
}
changeValue(name)
console.log(name)
//函数参数传递的是变量的值
//对应两个栈空间,分别独立
引用类型传递1:
let obj = {name:"ConardLi"}
function changeValue(obj){
//等效于在函数内var obj = XAF0000
obj.name = 'code秘密花园'
}
changeValue(obj)
console.log(obj.name)
//函数参数传递的是变量对应的地址
//所以函数体中去修改时,也会对原变量的值发生变化(它们都指向这个地址)
引用类型传递2:
let obj = {}
function changeValue(obj){
obj.name = 'ConardLi'
obj = {name:'code秘密花园'}
console.log(obj.name)
}
chengValue(obj)
console.log(obj.name)