简单理解的基本数据类型和引用数据类型
基本变量存在 栈中 ,赋值时是把自己拷贝一份放在栈中,两者是没关系的,只是value相同而已。
引用类 存在堆中,栈中存的是他们的内存地址,所以引用数据类型 赋值 时,给的是内存地址,指向相同,都指向同一个堆内存中。
function checkAge(data) {
if (data === { age: 18 }) {
console.log('You are an adult!')
} else if (data == { age: 18 }) {
console.log('You are still an adult.')
} else {
console.log('Hmm.. You don't have an age I guess')
}
}
checkAge({ age: 18 })`
• A: You are an adult!
• B: You are still an adult.
• C: Hmm.. You don't have an age I guess //(选C)
在测试相等性时,基本类型通过它们的值(value)进行比较,而对象通过它们的引用(reference)进行比较。JavaScript 检查对象是否具有对内存中相同位置的引用。
题目中我们正在比较的两个对象不是同一个引用:作为参数传递的对象引用的内存位置,与用于判断相等的对象所引用的内存位置并不同。
这也是 { age: 18 } === { age: 18 } 和 { age: 18 } == { age: 18 } 都返回 false 的原因。
参数传递的不同(把实参复制给形参的过程)
首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
1.原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2.引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
浙公网安备 33010602011771号