您的位置:首页 > 编程语言 > Python开发

js与python的变量赋值

2017-05-02 00:00 155 查看

变量复制

var a = 'asd';
var b = a;
a = 'mac';
console.log(b) //b = 'asd';

是否会认为b=='mac'?然而b='asd';

var a = {name: 'asd'};
var b = a;
a.name = 'mac';
console.log(b.name); //b.name = 'mac'

这会b却又跟着a变...

var a = {name: 'asd'};
var b = a;
a = {name: 'mac'};
console.log(b.name) b.name = 'asd'

这会b又没有跟着a变

var a = {name: 'asd'};
var b = a.name;
a.name = 'mac';
console.log(b); //b = 'asd'

这会b还是没有跟着a变

javascript的基本类型

其实可以从ECMAScript的变量类型说起。其类型分为两种:

基本类型: Undefined,Null,Boolean,Number和String

引用类型: 除此之外的类型,即保存在内存中的对象,只能对其地址的引用进行操作。如果关联起C语言的指针那就很好理解,虽然ECMAScript的解析引擎不一定是用c或者c++来写。

var a = 'asd'
;
则a存储的是String类型的,其值是'asd';
var b = a
;
因为是a的类型是基本类型String,所以是在内存中开辟一个新的空间,直接copy a存储在内存中内容,所以b = 'asd';

var a = {name: 'asd'}
,a是一个Object类型,属于引用类型,a中存储的是{name: 'asd'}的逻辑地址。
var b = a
,其实质是共同指向同一个地址,都是{name: 'asd'}这个对象的引用,当修改a的属性的时候(即a.name = 'xxx'),其实也就是修改了所引用的对象。所以b也会跟着变。

但是,当
a = {name: 'mac'}
的时候,并不是取修改所引用的对象,而是a存储的地址变成了一个新的对象的一个地址,此时b仍然是原来对象的引用,a和b所指向是两个完全不相同的对象,所以此时b并没有改变。

var b = a.name
,因为a.name是基本类型的String,所以b直接存储的是a.name的值,再也和a没有任何瓜葛。

python下的变量赋值

推断一下python的变量机制

a = 3
b = a
a = 5
print b  ## 3

a = ['x', 'y']
b = a
a[0] = 3
print b ## [3, 'y']

a = {'name': 'asd'}
b = a
a['name'] = 'mac'
print b ## {'name': 'mac'}

变量的比较

var a = 'asd';
var b = 'asd';
a == b //true
var c = ['asd'];
var d = ['asd'];
c == d //false

这也很容易得到结论了。

深复制与浅复制

如前面所提到的直接复制就是浅复制。对于基本类型而言,没有什么差异,但是对于引用类型,相当于传递一个指针。这就不好说了。

javascript的语言特性比较特别,继承方式是基于原型继承。

Object.prototype.clone = function () {
var Constructor = this.constructor;
var obj = new Constructor();

for (var attr in this) {
if (this.hasOwnProperty(attr)) {
if (typeof(this[attr]) !== "function") {
if (this[attr] === null) {
obj[attr] = null;
}
else {
obj[attr] = this[attr].clone();
}
}
}
}
return obj;
};

定义在Object.prototype上的clone()函数是整个方法的核心,对于任意一个非js预定义的对象,都会调用这个函数。而对于所有js预定义的对象,如Number,Array等,我们就要实现一个辅助clone()函数来实现完整的克隆过程:

```javascript
/* Method of Array*/
Array.prototype.clone = function () {
var thisArr = this.valueOf();
var newArr = [];
for (var i=0; i<thisArr.length; i++) {
newArr.push(thisArr[i].clone());
}
return newArr;
};

/* Method of Boolean, Number, String*/
Boolean.prototype.clone = function() { return this.valueOf(); };
Number.prototype.clone = function() { return this.valueOf(); };
String.prototype.clone = function() { return this.valueOf(); };

/* Method of Date*/
Date.prototype.clone = function() { return new Date(this.valueOf()); };

/* Method of RegExp*/
RegExp.prototype.clone = function() {
var pattern = this.valueOf();
var flags = '';
flags += pattern.global ? 'g' : '';
flags += pattern.ignoreCase ? 'i' : '';
flags += pattern.multiline ? 'm' : '';
return new RegExp(pattern.source, flags);
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python js 变量赋值