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 不可变的原始值和可变的对象引用的更多相关文章

  1. JavaScript不可变原始值和可变的对象引用

    一.JavaScript不可变原始值 JavaScript中的原始值(undefined,null,布尔值,数字和字符串)与对象(包括了数组和函数)有着根本的区别.原始值是不可变的(undefined ...

  2. [JS高程] 特殊的原始值类型

    目录 原始值包装类型 (特殊引用类型) 原始值包装类型和应用类型的区别 原始值包装类型 (特殊引用类型) 在ES6 时,ECMAScript 数据类型是这样去分类的: 原始值(基本数据类型) Numb ...

  3. 对String值不可变的理解以及String类型的引用传递问题

    今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的.当时看的一脸懵逼,String str = "abc"; str = ...

  4. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  5. 【JavaScript 从零开始】 原始值和对象引用、类型转换

    JavaScript 中的原始值(undefined.null . 布尔值.数值和字符串)于对象(包括数组和函数)有着根本区别. 原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值. 对于 ...

  6. javascript中可变值与不可变值(原始值)

    字符串原始值修改不了1 var str = "abc"; 2 str[0] = "d"; 3 console.log(str[1]="f") ...

  7. JS中原始值和引用值分析

    JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...

  8. JAVA不可变类与可变类、值传递与引用传递深入理解

    一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...

  9. Js 中的原始值和引用值

    最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...

随机推荐

  1. SQL Server:OA权限管理设计的实现 下

    SQL Server:OA权限管理设计的实现 下   OA系统权限管理设计方案     不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.     可以对“组”进行权限 ...

  2. 【JAVA - SSM】之MyBatis动态SQL

    动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑.通常用到的动态SQL标签有<if>.<choose>.<where>.<trim>.<s ...

  3. linq to sql 博客集锦

    Linq to sql  比较全面的学习博客 http://www.cnblogs.com/aehyok/tag/Linq%20To%20Sql/ 使用LINQ TO SQL基于Respository ...

  4. CSS_使用css布局

    本文出自:http://blog.csdn.net/svitter 1.   创建一个HTML页面, 其内容为一个无序列表,列表中至少包括了5本畅销书,每本书之前的项目符号必须採用概述封面的缩略图.这 ...

  5. Linux内核:关于中断你须要知道的

    1.中断处理程序与其它内核函数真正的差别在于,中断处理程序是被内核调用来对应中断的,而它们执行于中断上下文(原子上下文)中,在该上下文中执行的代码不可堵塞. 中断就是由硬件打断操作系统. 2.异常与中 ...

  6. Some current MySQL Architecture writings

    Posted on 19/09/2014 by Stewart Smith So, I’ve been looking around for a while (and a few times now) ...

  7. mysql优化之连接优化

    Posted by Money Talks on 2012/02/23 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四篇 查询优化第五篇 到实战中去 连接优化 连接优化主要指客户端连接数据库以及 ...

  8. linuxcon-europe 2015 linux大会

    http://events.linuxfoundation.org/events/archive/2015/linuxcon-europe

  9. Ubuntu 12.04 root默认密码? 如何使用root登录?

    在安装Ubuntu 12.04时并没有设置root的密码,登录的时候也没有使用root账户.当我们使用root权限时,一般都使用sudo命令进行.那么当我们安装完毕Ubuntu 12.04时,root ...

  10. struts----用Action的属性接收参数

    本次学习的内容是用Action的属性接收参数 具体内容为: 一.准备工作 1.新建Web工程 2.添加struts:右键点击工程名选择My Eclipse-->点击add struts..--& ...