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 ...
随机推荐
- MongoDB 的创建、查询、更新、删除
MongoDB数据库中,创建.查询.更新.删除操作的对象是集合. 1.查看某个数据库中有哪些集合,在此之前需要使用数据库 C:\Windows\system32>mongo MongoDB sh ...
- 每天进步一点达——MySQL——myisampack
一. 简单介绍 myisampack是一个压缩使用MyISAM引擎表的工具,通常会压缩40%~70%,当须要訪问数据.server会将所须要的信息读入到内存中.所以当訪问详细记录时,性能 ...
- MyEclipse高效开发之必备快捷键技能
学习了Java之后,使用MyEclipse开发已经有一段时间了,奈何MyEclipse的界面是英文版的,很多功能都不了解,对于那些英文,每次在调程序的时候,都需要一个一个的查,效率很是低下.于是,就想 ...
- 关于模拟器不能运行项目问题:Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
我有一个习惯,当做完某一项功能时就想试试运行效果.所以一个程序完成前会运行无数遍.但是有时会出现不能运行的问题,并且这个问题不是来自项目的错误,显示器显示如下错误: [2013-08-31 08:45 ...
- Centos6下yum安装MariaDB5.5(转)
原文地址:http://www.cnblogs.com/kgdxpr/p/3209009.html vi /etc/yum.repos.d/MariaDB.repo 加入下面内容 [mariabd]n ...
- android datepicker源码
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- debugfs恢复文件
echo "this is test" >xx debugfs: ls -d /root/test1 () . () .. () xx <> () test.c ...
- 动作之CCActionInstant(立即动作)家族
立即动作就是不需要时间,马上就完成的动作.立即动作的共同基类是CCActionInstant.CCActionInstant的常用子类有: CCCallFunc:回调函数包装器 CCFlipX:X轴翻 ...
- 如何实现windows和linux之间的文件传输
2010-04-25 18:10 如何实现windows和linux之间的文件传输 如果想从windows中传送大量文件到Linux中,想必会难倒部分Linux初学者,尤其是文件很大时.我曾试过在li ...
- Java实现简单选择排序
package select; import java.util.Scanner; /*采用最简单的选择方式:从头到尾扫描序列找出最小的记录和第一个记录交换,接着在剩下的记录中继续这种选择和交换,最终 ...