javascript中的基本类型与引用类型

/ 0评 / 0

引发我对于javascript中的基本类型与引用类型的思考是这么一个场景。我在一个类中,我想要将构造函数中传递进来的map作为一个属性,然后获得一个独立的this.map,但是我失败了。先看看我的代码是长什么样的吧。

function MapControler(map) {
    this.map = map;
}

MapControler.prototype = {
    constructor: MapControler,
    modifyPos: function(lonlat) {
        this.map.lonlat = lonlat;
        console.log(this);//MapControler
    }
}

var map = {
    lonlat: '118.42, 22.11'
}
console.log(map.lonlat)//'118.42, 22.11'

var mapControler = new MapControler(map);
mapControler.modifyPos('119.42, 22.27');

console.log(map.lonlat)//'119.42, 22.27'
console.log(mapControler.map.lonlat)//'119.42, 22.27'

为什么会这样子呢?这是因为在javascript的对象引用机制中有这么一条:对象不会被复制,只能通过引用来传递。
后来查了下书,原来是javascript中分为基本类型与引用类型值两种。基本类型值指的是简单的数据段(Undefined/Null/Boolean/Number/String),引用类型值指的是那些可能由多个值构成的对象(Array/Object/Date/RegExp/Function)。
两种类型之间有两个比较明显的区别:动态的属性与复制变量值。

动态属性

引用类型的动态属性是可以访问的,而基本类型是不可以访问的。

var person = {};
person.name = 'Steve Zheng';
console.log(person.name);//'Steve Zheng'

var person = '';
person.name = 'Steve Zheng';
console.log(person.name);//Undefined

复制变量值

基本类型的值在复制过程中,会创建出一个新的值;而引用类型却不会创建新的值,而是指向那个引用值上。

//基本类型
var num1 = 5;
var num2 = num1;
console.log(num1);//5
console.log(num2);//5

num2 = 10;
console.log(num1);//5
console.log(num2);//10

//引用类型
var person1 = {name: 'Steve Zheng'};
var person2 = person1;
console.log(person1.name);//'Steve Zheng'
console.log(person2.name);//'Steve Zheng'

person2.name = 'Yi Zheng';
console.log(person1.name);//'Yi Zheng'
console.log(person2.name);//'Yi Zheng'

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注