深入理解JS中的数据、变量以及内存
数据
数据在内存中代表指定信息的“东西”,本质上是010101二进制
数据的特点
可传递、可运算
内存
内存的理解
可存储数据的空间
一个内存中有两个数据
内存存储的数据(变量)、地址值(引用地址)
内存分类
栈内存:全局变量、局部变量
堆内存:对象、引用数据类型
变量
可以变化的量,由变量名和变量值组成,每个变量都对应一块内存
变量名用来查找对应的内存,变量值就是内存中存储的数据
内存,数据,变量三者之间的关系
内存用来存储数据的空间
变量是内存的标识
JS传递变量是值传递还是地址传递?
回答一:值传递,这个值可以是基本数据也可以是引用数据(地址)
回答二:把传递的地址看做是引用(地址)传递
一般都会认为是地址传递,地址里面把存放的数据;其实深入理解就是值传递,这个值就是地址
引用变量赋值问题(重点,深入理解)
案例一
var obj1={name:'LIDI',age:'25'}
var obj2=obj1
obj1.name='尤雨溪'
console.log(obj2.name);//尤雨溪
解析:第二行代码,是将obj1的内存内容赋值给obj2,这个内存内容就是地址值,两个变量指向同一个地址。
结果为:尤雨溪
案例二
let obj1={name:'obj1'}
let obj2=obj1
obj2.age=12
console.log(obj1.age);
结果:12
案例三
var obj1={name:"老王"}
var obj2=obj1
function fn(obj){
console.log(obj.name);
// 这个obj就是obj1
// 这一步是把obj中的name重新赋值了
obj.name="小王"
}
fn(obj1)
console.log(obj2.name);
答案:老王 小王
案例四
let a={age:12}
let b=a
a={name:'Tom',age:13}
//这里把a重新指向了一个新对象
console.log(a);
console.log(b.age);
答案:Tom13
12
案例五
let a={age:13}
function fn1(obj){
// 这里是重新指向了一个新对象
// 局部变量在函数执行完后会自动销毁,无法访问
obj={age:15}
}
fn1(a)
console.log(a.age);
答案:13
案例六
let a=3
function fn(a){
a=a+1
}
fn(a)
console.log(a);
答案:3