原始类型与引用类型
原始类型
1.Numbe
r
2.String
3.undefinde
4.Boolean
5.null
引用类型
1.Array
g
2.Object
3.Function
4.Date
5.Math
原始类型与引用类型的区别
1.赋值
// 原始类型赋值
let str1 = 'hello'
str2 = str1
str1 = 'world'
console.log(str1) // world
console.log(str2) // hello
// 2. 引用类型赋值
let obj = {name:'xiangcai'}
obj1 = obj
obj.name = 'conghua'
console.log(obj.name) // 'conghua'
console.log(obj1.name)// 'conghua'
当我们改变一个原始类型的值的时候,只会改变当前修改的这个原始类型的值,并不会影响到已赋值的其他原始类型,而当我们去改变一个引用类型的值,则会影响到所有已赋值的其他引用类型的值,这是因为原始类型时存储在栈里的,每一个原始类型都是一个独立的个体,而引用类型时存储在堆里的,堆里的引用类型存储的时候是有内存地址的,当我们把obj1 = obj
的时候,他们两个指向的是同一个内存地址,所以我们改变了其中一个引用类型的值,都会影响到相同内存地址的其他引用类型
2. 比较
// 原始类型的比较
let str = 'xiangcai'
let str1 = 'xiangcai'
console.log(str1 === str); // true
// 引用类型的比较
let obj = {name:'xiangcai'}
let obj1 = {name:'xiangcai'}
console.log(obj === obj1); // false
因为原始类型没有内存地址,所以值相等就是true,而引用类型是有内存地址的,即使obj和obj1的值是相等的,但是他们指向的是两个不同的内存地址,所以就是false
3.函数传参方式
// 原始类型传参
function fun(num) {
num = 100
}
let n = 10
fun(n)
console.log(n) // 10
// 引用类型传参
function fun(arr) {
arr.push(4)
}
let a = [1,2,3]
fun(a)
console.log(a) // [1,2,3,4]
当用原始类型来当函数的参数时,函数内部改变了原始类型的值并不会影响到函数外部的原始类型的值,而当用引用类型来当函数的参数时,函数内部改变了引用类型的值会影响到函数外部指向同一个内存地址的引用类型的值