数据类型之间的区别
数据类型分为两种
- 基本数据类型(简单数据类型)
- 引用数据类型(复杂数据类型)
1,存储
变量的数据存储的地方是 内存中, 内存分为两个 栈内存, 堆内存
基本数据类型存储在 栈内存中, 比如: string number undefined null boolean
复杂数据类型, 将数据本体存放在堆内存中, 比如对象或者数组或者函数
然后将指向该内存的地址, 存放在数组名或者对象名或者函数名中
数组/对象/函数 名 存放在 栈内存中
面试官: 数据类型之间有什么区别?
基本数据类型有哪些, 然后他们存储的地方是 栈内存中
引用数据类型有哪些, 然后他们数据本体存放的地方是 堆内存中, 然后变量名存储的位置是 栈内存中
基本数据类型内部存储的是值; 引用数据类型内部存储的是地址
2. 赋值
基本数据类型: 赋值以后, 两个变量之间没有任何关系, 相当于将我自己的某一个东西, 复制一份给你, 然后你的就是你的, 我的就是我的
例子: 我有一张考试卷, 然后我复制一份给你, 然后你在卷子上书写答案, 并不会影响到我自己原本的这张卷子
复杂数据类型: 因为变量内部存储的是指向堆内存的地址, 所以在赋值的时候, 其实是将 这个地址给到了另外一个变量
那么相当于这两个变量存储的是 同一个 钥匙, 所以操作其中一个变量的时候, 会影响另外一个变量
例子: 我房间有一个开门的钥匙, 我将我的钥匙复制一份, 给到你, 那么此时我们两个共同拥有了一个房间的钥匙
此时如果我对房间的布局做了修改, 那么你进入房间的时候你能看到布局的修改
此时如果你将房间的所有东西全都偷走, 那么我进入房间的时候 能看到房间所有东西都被偷走了
3. 比较
基本数据类型:就是值的比较
引用数据类型: 比较的时候 比较的是 存储地址
4. 传参
基本数据类型: 将值拷贝一份传递给形参, 在函数内修改不会影响外界
引用数据类型: 将存储地址赋值给形参, 在函数内修改会影响外界
//1. 存储
var num = 100
var str = 'abc'
var obj = {
a: 1,
b: 2
}
var arr = [1, 2, 3, 4]
//2. 赋值
var num1 = 100
var num2 = num1 // num2 === 100
num2 = 666
console.log(num1) // 100
console.log(num2) // 666
var obj1 = {
name: 'QF001',
age: 18
}
// 这一步相当于将 变量 obj1 内部存储的 "钥匙", 给到了 变量 obj2, 那么此时 obj2 和 obj1 相当于操作的是一个内存空间
var obj2 = obj1
console.log(obj2) // {name: 'QF001', age: 18}
obj2.name = 'QF666'
console.log(obj2) // {name: 'QF666', age: 18}
console.log(obj1) // {name: 'QF666', age: 18}
/*
* 首先创建了一个 对象 obj1 数据本体为: {name: 'QF001', age: 18} 然后变量名存储的是指向堆内存的地址, 我们假设为 XF001
* 然后创建了一个对象 obj2 内部存储的是 和 obj1一样的地址
* 此时相当于 obj2 和 obj1 共同保管一个内存空间
* 换句话说: 操作obj2会影响 obj1 操作obj1也会影响obj2
*/
var obj1 = {
name: 'QF001',
age: 18
}
var obj2 = {
name: 'QF001',
age: 18
}
obj2.name = 'QF666'
console.log(obj1.name) // QF001
/*
* 1. 创建一个对象 obj1 内部存储的地址假设为 XF001
* 2. 创建一个对象 obj2 内部存储的地址假设为 XF002
* 注意此时两个对象除了长得一模一样之外 毫无关系
* 也就是说 操作 其中一个对象, 并不会影响另外一个
*/
// 3. 比较
console.log(obj1 === obj2) // false
/*
* 引用数据类型在对比的时候, 对比的是 地址 而这两个对象的地址完全不同, 所以返回的结果就是 false
*/
var num1 = 100
var num2 = '100'
console.log(num1 === num2) // false
var arr1 = [1, 2, 3]
var arr2 = arr1
console.log(arr1 === arr2) // true
/*
* 引用数据类型在对比的时候, 对比的是 地址 因为 他们两个的地址完全相同, 所以返回的结果是 true
*/
// 4. 传参
function fn(num) {
num = 'QF001'
}
var str = 'abc'
fn(str)
// console.log(str) // 'abc'
function fn1(o) {
o.name = 'qwer'
}
var obj = {
name: 'ABC'
}
fn1(obj)
console.log(obj.name) // 'qwer'