数据类型之间的区别
- 数据类型分为两种
- 1. 基本数据类型(简单数据类型)
- 2. 引用数据类型(复杂数据类型)
1. 存储
变量的数据存储地方是内存中,内存分为两个 栈内存 和 堆内存
基础数据类型存储在栈内存,如:string,number,boolean,undefined,null
引用数据类型的本体存放在堆内存中,然后将指向内存的地址,存放在数组名或者对象名或者函数名中
数组名,对象名,函数名 存放在栈内存中,如:函数,对象,数组
2: 赋值
基本数据类型:赋值以后,两个变量之间没有任何关系,
例子:我有一张卷子,然后我复制了一份给你,然后你在卷子上修改东西,并不会影响到我的试卷
引用数据类型:因为变量内存储的是指向堆内存的地址,所以在赋值的时候,其实是将这个地址给了另外一个变量
那么相当于这两个变量里面存储的是同一个钥匙,那么其中一个变量做修改的时候,会影响到另外一个
例子:我房间有一把钥匙,我复制了一把给你,那么我们就拥有了同一个房间,
我对这个房间进行改变的时候,你进来的时候也能看到改变,同理,你改变了房间的东西,相当于我内部也做了改变
3: 比较:
基本数据类型,就是值的比较
引用数据类型,比较的是存储地址
4: 传参
基本数据类型:将值拷贝一份传递给形参,在函数内部修改不会影响外界
引用数据类型:将存储地址赋值给形参,在函数内部修改会影响外界
var obj = {
name: 'jack'
}
function fn(){
obj.name = 'rose'
obj = {}
obj.name = 'jerry'
console.log(obj.name); //???
}
fn()
console.log(obj.name); //???
var obj
// 解析:
// 代码从上往下开始执行
// 第 1 行,声明了一个 obj 的变量,内部存储的一个地址
// 第 5 行,发现了函数,但是没有调用,继续向下执行
// 第 11 行,调用了这个函数,那么回去执行函数内部代码
// 第 6 行, obj.name = 'Rose'
// 会先在当前作用域内查找,发现没有定义 obj 这个对象, 所以会向父级作用域查找
// 在父级作用域, 找到了 全局变量 obj
// 所以第 6 行相当于 修改了 全局变量 obj 的 name 属性
// 第 7 行,obj = {}
// 会先在当前作用域内查找,发现没有定义 obj 这个对象, 所以会向父级作用域查找
// 在父级作用域, 找到了 全局变量 obj
// 所以第 7 行相当于 修改了 全局变量 obj,把它变成了空对象
// 第 8 行,obj.name = 'jerry'
// 会先在当前作用域内查找,发现没有定义 obj 这个对象, 所以会向父级作用域查找
// 在父级作用域, 找到了 全局变量 obj
// 所以第 7 行相当于 给这个对象内部 添加一个 name 属性, 值 Jerry
// 第 9 行,console.log(obj.name)
// 根据分析我们此时可以得知, 我现在打印的对象应该是 全局对象 obj, 此时他的值已经被修改了
// 所以此时打印的值 应该是 Jerry
// 此时函数执行完毕, 代码继续向下执行
// 第 13 行,console.log(obj.name) 此时打印的是 当前作用域的变量 obj 因为现在 在全局作用域
// 所以会打印全局作用域的变量 obj, 因为在打印之前函数 fn执行时 已经修改过 obj 对象的内容
// 所以 此时 打印的时候 obj.name 应该是 Jerry