javascript中给变量赋值,是引用还是复制?
来源:互联网 发布:mac左右分屏 编辑:程序博客网 时间:2024/06/04 19:48
要搞清这个问题,首先要搞清楚在javascript中的值有哪些类型,总结如下:
javascript中的值类型分为两大类:基本类型和引用类型,所谓的引用类型就是对象,每种类型下面又分为5中类型:
## 基本类型 ##
+ 数字类型
+ 字符串类型
+ 布尔类型(true 和 false)
+ undefined
+ null
## 引用类型 ##
+ 函数
+ 数组
+ 日期
+ 正则
+ 错误
再次强调一边,所有的引用类型都是对象,也就是Object对象下的一个类。
注意:所有的基本类型的值都是不会变的,比如一个字符串’abcd’,它的值永远是’abcd’,不可能发生改变,当然如果你把它赋给一个变量,var a = ‘abcd’,然后给a赋其他的值,那么a的值可以改变,但是’abcd’这个字符串本身的值没有发生任何变化。包括使用某些自带的函数,比如a.toUpperCase();这个函数返回的字符串的大写形式’ABCD’;注意,是“返回”一个新的值,而不是改变原有的值!此时,变量a的值仍然是’abcd’,除非你使用了a=a.toUpperCase()。
以上的分析可以看到,对于基本类型,将其值赋给一个变量时,就是将这个值复制给变量,值本身不会发生任何改变,变量的值可以改变。变量之间是可以比较的,比较的就是他们本身的值。
而引用类型的情况却大不相同:
var a = [1,2,3];//定义一个数组为例var b = a;b[3] = 4;console.log(a.toString(), b.toString())';//输出结果:1,2,3,4 1,2,3,4
上面的例子说明,定义一个对象时,这个对象在内存中建立,如果把这个对象赋给一个变量,那么这个变量仅仅是对这个对象的引用,而不是将对象复制到了该变量中!也就是变量a中存储的是指向对象的地址。将a的值赋给b;也就是将a中的地址赋给了变量b,这时候变量a和b都指向同一个对象,所以b值的改变就会直接引起对象本身的改变,所以变量a所引用的数组值肯定也会发生变化!
注意:对象的比较与基本类型不同。即使两个对象完全相同,比如两个完全相同的数组,它们也是不相等的!只有两个变量指向同一个对象时,它们两个才完全相等。如:
var a=[1,2,3], b=[1,2,3];console.log(a===b);//falsevar c=a;console.log(c===a);//true
- javascript中给变量赋值,是引用还是复制?
- js的赋值语句是复制还是引用?
- javascript中等号赋值究竟是复制还是在等号两边建立了联系
- Javascript的赋值是引用or复制,及参数传递
- jsp中java变量赋值给javascript变量
- Javascript : 变量存放的是引用还是值
- php中变量赋值是引用的例子
- JavaScript函数赋值给变量
- 转载:写了10年Javascript未必全了解的连续赋值运算 --> 说明了JS中变量是引用
- Javascript中判断变量是 array还是object(是数组还是对象)
- javascript大括号赋值给变量
- Asp.net - Razor - 将Model中变量的值赋值给Javascript变量
- 有一种方法给 XSLT 中变量进行赋值,是保持状态的那种
- Python中变量引用与赋值
- iOS OC 成员变量是强引用还是弱引用
- iOS OC 成员变量是强引用还是弱引用
- cuda 中给 __constant__类型变量赋值
- 在存储过程中 给变量赋值
- Linux awk使用浅析
- Visual C++ 64 位迁移的常见问题
- Spring整合JMS(三)——MessageConverter介绍
- 【Android】【Framework】悬浮窗口相关(WindowManager)
- php乱码问题解决
- javascript中给变量赋值,是引用还是复制?
- Spring MVC和Struts2的比较【转】
- 欢迎使用CSDN-markdown编辑器
- js脚本最后面的一对圆括号是什么意思?
- time.h ctime
- 随机森林总结
- hdoj1542_Atlantis(线段树)
- Linux使用者管理(1)---用户账号
- android:padding和android:layout_margin区别