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. Cassandra的登录认证授权

    cassandra的登录验证机制是独自的,数据是集群共享的 参考:http://blog.csdn.net/y_y_y_k_k_k_k/article/category/5943357 1.初始安装启 ...

  2. CSS 选择器及其优先级

    CSS 的选择器有很多类型,我们将常用的这些列表如下: 一.CSS 选择器的类别 1. 基本选择器 基本选择器 解释 备注 * 通用选择器,匹配所有元素 CSS2 E 元素选择器,匹配类型为 E 的所 ...

  3. Python 3. 里filter与generator expression的区别

    # -*- coding: utf-8 -*- """ A test to show the difference between filter and genrator ...

  4. 通过WMI配置IP

    $wmi = gwmi win32_networkadapterconfiguration -filter "ipenabled = 'true'"$wmi.EnableStati ...

  5. ThinkPHP函数详解:D方法

    从本篇开始,我们会陆续给大家详细说明下框架内置函数的用法. D方法 D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持 ...

  6. jekyll bootstrap更改主题theme

    使用主题 介绍: 由于JB版本号0.2.X的主题,如今全然是模块化的.他们跟踪和单独版本号的主题包. 这让每一个人都能够自由公布和共享主题. Jekyll-Bootstrap v 0.2.x仅仅附带t ...

  7. JFinalo操作框架racle数据库

    JFinal操作框架oracle数据库.在需求configPlugin()方法来配置链路oracle配置数据库 组态JFinal数据库操作窗口小部件,configPlugin方法 在这里,我打开jdb ...

  8. android87 Service

    ---------------------------------------------------------------------------- #Service(服务和Activity是运行 ...

  9. systemtap 列出所有linux 内核模块与相关函数0

    diskiohttp://blog.163.com/digoal%40126/blog/static/16387704020131015105532435/ [root@localhost linux ...

  10. C#泛型对类型参数的推断

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...