var a = 100;
var b = a;
b = 200;
console.log(a); // 100
var obj1 = { age: 10 };
var obj2 = obj1;
obj2.age = 20;
console.log(obj1.age); // 20 ,obj1和obj2引用的同一个地址的age,obj2的age改了,就是obj1的age改了
var obj1 = { age: 10 };
var obj2 = obj1;
obj2 = { age: 20 }; // obj2引用了一个新地址的age,赋值为20
console.log(obj1.age); // 10 , obj2引用新地址的age,和原先的age无关
var arr = [1, 2, 3];
fn(arr);
console.log(arr); // [10,2,3] ,arr和obj引用同一个地址的数组,obj改数组的值,arr的数组值也改了
function fn(obj) {
obj[0] = 10;
}
console.log('');
//------------------------------------------------------------------------------
var arr1 = [11, 22, 33, 44];
var arr2 = [110, 220, 33];
// arr1和arr2和arr3构造函数都是Array,构造函数相同的话原型相同,三个取原型中的属性address值也相同
arr1.__proto__.address = '上海';
console.log(arr2.address); // 上海
var arr3 = new Array();
console.log(arr.address); // 上海
//原型的age属性值为10,三者原型相同
Array.prototype.age = 10;
console.log(arr1.age); // 10
console.log(arr2.age); // 10
console.log(arr3.age); // 10
Array.prototype = { age: 1000 }; // 因为内置构造函数Array的保护:只能改内置构造函数的值,不能改引用地址,此步正常情况会改地址和值,但是没有改成功
console.log(arr1.age); // 10
console.log(arr2.age); // 10
console.log(arr3.age); // 10
var arr4 = [];
console.log(arr4.age); // 10
var arr5 = new Array();
console.log(arr5.age); // 10
console.log('');
//----------------------------------------------------------------------------
function User() {
};
var u1 = new User();
var u2 = new User();
User.prototype.age = 200;
console.log(u1.age); // 200
console.log(u2.age); // 200
//自定义函数没有保护机制,可以修改其引用地址和值,此处将User.prototype栈中储存的age地址改了,将堆中存储的age的值改了。所以不影响上面的age值,后面该User的实例的原型的age都是新地址新值。
User.prototype = { age: 2000 };
var u3 = new User();
console.log(u3.age); // 2000
console.log(User.prototype.age); // 2000
值类型和引用类型练习
最新推荐文章于 2024-08-12 09:24:46 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)