js 不可变的原始值和可变的对象引用

javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值。对数字和布尔值来说显然如此----改变数字的值本身就说不通,而对字符串来说就不那么明显了,因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来假改字符串中的字符。实际上,javascript是禁止这样做的。字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值。

代码如下:

1 <script>
2      var s = "hello"  //定义了一个文本为hello的字符串
3      console.log(s.toUpperCase())  //返回的是大写的HELLO,但是并没有改变字符串的S的值
4      console.log(s)   //返回hello
5 </script>

对象和原始值不同,首先,它们是可变的--它们的值是可修改的

代码如下:

 1 <script>
 2      var m = {x:1} //定义一个对象
 3      m.x = 2;   //通过修改对象的属性值来更改对象
 4      m.y = 3;   //再次更改这个对象,给这个对象新加一个属性
 5
 6      var m =[1,2,3]   //定义一个数组
 7      m[0] = 3;     //对过更改数组的下标,来更改数组
 8      m[3] = 4;     //能过添加新下标,来更改数组
 9
10 </script>

对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的。各个索引元素相等的两个数组也不相等。

代码如下:

 1 <script>
 2      var o = {x:1}
 3      var m = {x:1}
 4      console.log(o == m)   //=> false  他们的值不相等 说明数组对象的比较并不是对象值的比较
 5      console.log(o === m)  //=> false
 6
 7      var a = []
 8      var b = []
 9      console.log(a == b)   //=> false  他们的值不相等 说明数组对象的比较并不是对象值的比较
10      console.log(a === b)  //=> false
11
12 </script>

我们通常将对象称为引用类型(reference type),以此来和javascript的基本类型区分开来。依

照术语的叫法,对象值都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。

代码如下:

1 <script>
2     var a = {x:1};  //声明一个对象
3     var b= a;     //变量b引用同一个对象
4     b.x =2;        //当把对象b的x属性改变时,引用同一个对象的a同时也会改变
5     console.log(a.x)   //=>2
6     console.log(a===b)  //=>true  此时他们相等
7 </script>
1 <script>
2     var a = [1,2,3];  //声明一个数组对象
3     var b= a;     //变量b引用同一个数组对象
4     b[0] =5;        //当把对象b第一个索引值改变时,引用同一个数组对象的a同时也会改变
5     console.log(a[0])   //=>5
6     console.log(a===b)  //=>true  此时他们相等
7 </script>

上两段代码将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。如果你想得到一个对象或数组的副本,则必须显式复制对象的每个属性或数组的每个元素。下面这个例子则是通过循环来完成复制

 1 <script>
 2    var a= [1,2,3]   //声明一个数组a
 3    var b=[]       //声明一个空数组b
 4    for(var i =0;i< a.length;i++){   //循环遍历
 5        b[i] = a[i]      //把a数组里的值传给b
 6    }
 7    console.log(b)     //=> 1,2,3
 8    b[0] =5;         //=>当我改变b第一个索引值时
 9    console.log(a[0])   //=>此时a第一个索引值还是等于1,因为此时b是a的副本,他们并没有引用同一个数组对象。
10    console.log(a==b)   //对象的比较是引用的比较,因为他们引用的并不是同一个数组对象,所以他们还是不相等
11    console.log(a==b)
12 </script>

同样的,如果我们想比较两个单独的对象或者数组,则必须比较它们的属性或元素。

代码如下:

 1 <script>
 2     function arrays(a,b){
 3         if(a.length != b.length){         //先比较两上对象的长度
 4             return false
 5         }
 6         for(var i =0; i< a.length;i++){
 7             if(a[i] != b[i]){            //再比较两个对象上索引的值
 8                 return false
 9             }
10             return true;
11         }
12     }
13     console.log(arrays("this","this")) //=>true
14 </script>
时间: 2024-12-17 22:56:43

js 不可变的原始值和可变的对象引用的相关文章

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

javascript的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值来说显然如此—改变数字的值本身就说不通,而对字符串来说就不那么明显了,因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来修改字符串中的字符.实际上,javascript是禁止这样做的.字符串中所有的方法看上去返回一个修改后的字符串,实际上返回的是一个新的字符串. 原始值得比较是值得比较:只

原始值

不可变的原始值和可变的对象引用: 原始值是不可以改变的,字符串中所有的办法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串. var s = "hello" s.toUpperCae(); //=>""HELLO" s //=>"hello" 原始字符串的值并未改变 对象的比较并非值的比较:即使对象包含两个同样的属性及相同的值,它们也是不相等的.各个元素完全相等的两个数组也不相等. var o = {x:1};

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

今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的.当时看的一脸懵逼,String str = "abc"; str = "abcde"这两行代码没有任何的错误的.上网百度了许久,还是整理下来防止以后忘记吧. 首先要理解的是,string说的不可变是其值不可变,比如String str = "abc",不可变值得是abc不可变,当我们str = "abcde"时,abc

js中 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值-----存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置; 引用值-----存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 如果一个值是引用类型的,那么它的存储空间将从堆中分配.由于引用值的大小会改变,所以不能把它放在栈中,否则 会降低变量查寻的速度.相反,放在变量的栈空间中的值是该对象存储在堆中的地址.地址的大小是固定的,

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

一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: Person.java package cn.qlq.test; public class Person { private int age; private String name; public int getAge() { return age; } public void setAge(int

?Swift语言中为外部参数设置默认值,可变参数,常量参数,变量参数,输入输出参数

引用自这里:Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 目录[-] 7.4.4  为外部参数设置默认值 7.4.5  可变参数 7.4.6  常量参数和变量参数 7.4.7  输入-输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和&qu

JS浅谈原始值与引用值操作

值的操作分为三大类:复制,传递,比较 一:复制 原始值 let a = 10; let b = a; 注释:2018-7-30 17:33:49 1 原始类型的值都是存放在栈内存当中,所以他们的赋值操作,其实相当于在栈内存开辟新的空间,然后将值的副本赋给新的内存,所以他们互不干扰 引用值 let obj = { name:'panrui' }; let obj1 = obj; 1 引用类型的值是存放在堆内存当中,栈内存中变量保存的只是一个堆内存的地址,所以赋值操作,也是开辟一个新的栈内存,然后将

javascript中的原始值和复杂值

前面的话 javascript的数据类型可以分为两种:原始类型(基本类型或者简单类型)和引用类型. 原始类型:Undefined,Null,Boolean,Number,String五种: 引用类型:Object,Array,Function: 与此相对应的,它们的值分别被称为原始值和复杂值. 特性 原始值 原始值是表示javascript中可用的数据或信息的最底层的形式或者最简单的形式.原始类型的值被称为原始值,因为它们的值是不可被细化的.也就是说,数字是数字,字符串是字符串,布尔值是true

ECMAScript 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值和引用值 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型.要实现这一点,解释程序则需尝试判断该值是否