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学习笔记--变量和赋值
- asp.net 把后台数据赋值给js的变量的方法
- python,js, java全局变量对比
- python变量赋值(可变与不可变)
- python变量赋值(可变与不可变) 分类: python基础学习 python Module 2013-10-30 11:59 1036人阅读 评论(0) 收藏
- Python中有趣的变量赋值
- python多个变量同时赋值
- Python的变量赋值及函数参数传递规则
- Python学习笔记--变量赋值过程
- python 变量名及赋值操作的本质
- js变量声明与赋值---看汤姆大叔博客所做笔记(一)
- js中多个Date对象变量间赋值互相影响
- Python学习(一)----变量与赋值
- python变量赋值不可更改,形参可赋新值
- js字符串变量赋值的时候,一行写不下,想在下一行继续写
- python的直接赋值不会拷贝,只相当于变量的一个别名
- JS变量的未定义和未赋值
- 一个讨论引发关于js中函数声明,函数表达式,形参与变量声明赋值引发的一些事
- ajax得到的数据赋值给js中的全局变量
- Python 变量赋值过程