js 不可变的原始值和可变的对象引用
javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值。对数字和布尔值来说显然如此----改变数字的值本身就说不通,而对字符串来说就不那么明显了,因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来假改字符串中的字符。实际上,javascript是禁止这样做的。字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值。
代码如下:
<script>
var s = "hello" //定义了一个文本为hello的字符串
console.log(s.toUpperCase()) //返回的是大写的HELLO,但是并没有改变字符串的S的值
console.log(s) //返回hello
</script>
对象和原始值不同,首先,它们是可变的--它们的值是可修改的
代码如下:
<script>
var m = {x:1} //定义一个对象
m.x = 2; //通过修改对象的属性值来更改对象
m.y = 3; //再次更改这个对象,给这个对象新加一个属性 var m =[1,2,3] //定义一个数组
m[0] = 3; //对过更改数组的下标,来更改数组
m[3] = 4; //能过添加新下标,来更改数组 </script>
对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的。各个索引元素相等的两个数组也不相等。
代码如下:
<script>
var o = {x:1}
var m = {x:1}
console.log(o == m) //=> false 他们的值不相等 说明数组对象的比较并不是对象值的比较
console.log(o === m) //=> false var a = []
var b = []
console.log(a == b) //=> false 他们的值不相等 说明数组对象的比较并不是对象值的比较
console.log(a === b) //=> false </script>
我们通常将对象称为引用类型(reference type),以此来和javascript的基本类型区分开来。依
照术语的叫法,对象值都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。
代码如下:
<script>
var a = {x:1}; //声明一个对象
var b= a; //变量b引用同一个对象
b.x =2; //当把对象b的x属性改变时,引用同一个对象的a同时也会改变
console.log(a.x) //=>2
console.log(a===b) //=>true 此时他们相等
</script>
<script>
var a = [1,2,3]; //声明一个数组对象
var b= a; //变量b引用同一个数组对象
b[0] =5; //当把对象b第一个索引值改变时,引用同一个数组对象的a同时也会改变
console.log(a[0]) //=>5
console.log(a===b) //=>true 此时他们相等
</script>
上两段代码将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。如果你想得到一个对象或数组的副本,则必须显式复制对象的每个属性或数组的每个元素。下面这个例子则是通过循环来完成复制
<script>
var a= [1,2,3] //声明一个数组a
var b=[] //声明一个空数组b
for(var i =0;i< a.length;i++){ //循环遍历
b[i] = a[i] //把a数组里的值传给b
}
console.log(b) //=> 1,2,3
b[0] =5; //=>当我改变b第一个索引值时
console.log(a[0]) //=>此时a第一个索引值还是等于1,因为此时b是a的副本,他们并没有引用同一个数组对象。
console.log(a==b) //对象的比较是引用的比较,因为他们引用的并不是同一个数组对象,所以他们还是不相等
console.log(a==b)
</script>
同样的,如果我们想比较两个单独的对象或者数组,则必须比较它们的属性或元素。
代码如下:
<script>
function arrays(a,b){
if(a.length != b.length){ //先比较两上对象的长度
return false
}
for(var i =0; i< a.length;i++){
if(a[i] != b[i]){ //再比较两个对象上索引的值
return false
}
return true;
}
}
console.log(arrays("this","this")) //=>true
</script>
js 不可变的原始值和可变的对象引用的更多相关文章
- JavaScript不可变原始值和可变的对象引用
一.JavaScript不可变原始值 JavaScript中的原始值(undefined,null,布尔值,数字和字符串)与对象(包括了数组和函数)有着根本的区别.原始值是不可变的(undefined ...
- [JS高程] 特殊的原始值类型
目录 原始值包装类型 (特殊引用类型) 原始值包装类型和应用类型的区别 原始值包装类型 (特殊引用类型) 在ES6 时,ECMAScript 数据类型是这样去分类的: 原始值(基本数据类型) Numb ...
- 对String值不可变的理解以及String类型的引用传递问题
今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的.当时看的一脸懵逼,String str = "abc"; str = ...
- javascript原始值和引用值类型及区别
原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...
- 【JavaScript 从零开始】 原始值和对象引用、类型转换
JavaScript 中的原始值(undefined.null . 布尔值.数值和字符串)于对象(包括数组和函数)有着根本区别. 原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值. 对于 ...
- javascript中可变值与不可变值(原始值)
字符串原始值修改不了1 var str = "abc"; 2 str[0] = "d"; 3 console.log(str[1]="f") ...
- JS中原始值和引用值分析
JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...
- JAVA不可变类与可变类、值传递与引用传递深入理解
一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...
- Js 中的原始值和引用值
最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...
随机推荐
- 用Windbg来看看CLR的JIT是什么时候发生的
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Windbg来看看CLR的JIT是什么时候发生的.
- 实现app上对csdn的文章查看,以及文章中图片的保存 (制作csdn app 完结篇)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24022165 今天给大家带来CSDN的完结篇,即增加文章的查看和文章中图片的保存 ...
- 秋叶PPT-三分钟教程
http://yuedu.baidu.com/ebook/0596e5f858f5f61fb73666be <说服力-让你的PPT会说话>原创PPT分享 http://www.docin. ...
- 读完了csapp(中文名:深入理解计算机系统)
上个星期最终把csapp看完了. 我买的是中文版的,由于除了貌似评价不错以外,由于涉及到些自己不了解的底层东西,怕是看英文会云里雾里.如今看来,大概不能算是个长处,可是的确可以加快我的看书速度,否则一 ...
- core dump + LINUX 内核系列博客
参考:http://www.cnblogs.com/ahuo/category/72819.html http://blog.csdn.net/tenfyguo/article/details/815 ...
- C# - 集合类 - 集合类型
Stack类 ns:System.Collections 此类模仿了一个简单的先进后出(LIFO)的集合 它实现了ICollection接口 可以通过三种方式创建Stack类对象 Stack stac ...
- UISenior之数据的本地化持久化
数据的本地化主要分为两个方面:1.简单数据的本地持久化(NSString.NSArray.NSDictionary.NSData)2.复杂数据的本地持久化(本文以Person类为例) 简单对象的本地化 ...
- redhat 6.4 双网卡绑定
linux系统配置 1.redhat 6.4 双网卡绑定 1)#ethtool eth* //在服务器网口接网线至笔记本,确定各网口的配置文件: 2)切换目录 #cd /etc/sysconfig/n ...
- struts2学生信息管理系统篇章①
最近在看java1234分享的一个Struts2的学生信息管理系统的知识.因为本身java没什么底子.所以就没有什么好的技术去解决问题.一直在百度,不懂就百度.这样子下来其实也能学到一些东西,过阵子等 ...
- Linq常用查询运算符
Linq一共包含五十几个查询运算符,常用的根据类型来区分一共有5类左右,这五类里面一些事在项目查询中经常用到的.不过linq运算符的命名十分规范,基本从字面意思就能猜测出来是干嘛用的,下面我们挑选一些 ...