<script type="text/javascript">
//基本数据类型和复杂数据类型的比较
//基本数据类型:number、string、Boolean、undefined、null
//复杂数据类型(引用数据类型):数组、对象、函数、正则表达式
//内存分为堆和栈,1.基本数据类型仅仅在栈里面,2.复杂数据类型,在栈里面储存地址,在堆里面储存数据。
//基本类型赋值
let str1 = "hello";
let str2 = str1; //此时str2:hello
str1 = "world"; //此时strl:world
console.log(str1); //hello
console.log(str2); // world
//简单数据类型的值都存储在栈里面,对原始数据类型赋值,真的就是值发生了变化,所以str1改变了,打印的str1的值也就发生了相应的变化。
//引用类型的赋值
let stu1 = {name: "小明"};
let stu2 = stu1; //此时stu2 name:小明 在栈里面此时多出来了一个地址,它的指向与stu1的执行相同
stu1.name = "小红"; //此时stul name:小红 此时,
console.log(stu1.name); //打印的结果为 小红
console.log(stu2.name); // 打印的结果为 小红
//引用数据类型的内存分为堆和栈,堆里面是数据,栈里面是地址,在堆里面的name数据,变为了小红,因为在栈里面的两个地址都指向这个数据,
//所以此时stu1和stu2都打印小红
//基本数据类型的比较
let str3 = 'abc'
let str4 = 'abc'
console.log(str3===str4) //打印的结果为true
//基本数据类型的内存仅仅为栈,其值仅存储在栈中,所以当它们的比较,就是值的比较,值相同就为true,不同则为false
//引用数据类型的比较
let stu3 = {name: "小明"};
let stu4 = {name: "小明"};
console.log(stu3===stu4)//打印的结果为false
//复杂数据类型的内存分为堆和栈,栈中存储地址,堆中存储值,它们的比较,要满足堆和栈都相同才为true,此处虽然他们的值是相同的
// 但是它们的地址不同,所以为false
//基本数据类型传参
function fn(num){
num = 100
console.log(num) //100
}
let n = 10
fn(n)
console.log(n) //10
//同样的道理,因为基本数据类型的内存中,仅仅是栈,现在有一个函数,函数中有一个num=100,在栈中开辟一个空间存储这个值。
//let n = 10此时又会在栈中开辟一个空间,即使将n传入这个函数,打印的n的值仍然是不变的
//复杂数据类型传参
function fun(arr){
arr.push(10)
}
let arr1 = [1,2,3]
fun(arr1)
console.log(arr1)
//复杂数据类型,现在声明了一个let arr1 = [1,2,3],它会在堆中存值,在栈中存地址,在这个函数中虽然,传入了这个数组arr1,
//但是它的指向没有发生变化,所以打印的结果为[1,2,3,10]
</script>