Javascript中的复制、传参数

按值和按引用的比较

Numbers 和 Boolean 类型的值 (truefalse) 是按值来复制、传递和比较的。当按值复制或传递时,将在计算机内存中分配一块空间并将原值复制到其中。然后,即使更改原来的值,也不会影响所复制的值(反过来也一样),因为这两个值是独立的实体。

对象、数组以及函数是按引用来复制、传递和比较的。 当按地址复制或传递时,实际是创建一个指向原始项的指针,然后就像拷贝一样来使用该指针。如果随后更改原始项,则将同时更改原始项和复制项(反过来也一样)。实际上只有一个实体;“复本”并不是一个真正的复本,而只是该数据的又一个引用。

当按引用比较时,要想比较成功,两个变量必须参照完全相同的实体。例如,两个不同的 Array 对象即使包含相同的元素也将比较为不相等。要想比较成功,其中一个变量必须为另一个的参考。要想检查两个数组是否包含了相同的元素,比较 toString() 方法的结果。

最后,字符串是按引用复制和传递的,但是是按值来比较的。请注意,假如有两个 String 对象(用 new String("something") 创建的),按引用比较它们,但是,如果其中一个或者两者都是字符串值的话,按值比较它们。

注意   鉴于 ASCII和 ANSI 字符集的构造方法,按序列顺序大写字母位于小写字母的前面。例如 "Zoo" 小于 "aardvark"。如果想执行不区分大小写的匹配,可以对两个字符串调用 toUpperCase()toLowerCase()

传递参数给函数

按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。

  1. <script language="JavaScript">
  2.             function Clobber(param)
  3.             {
  4.                 param =new Object();
  5.                 param.message="function Clobber is work!";                              
  6.             }
  7.             function Update(param)
  8.             {
  9.                 param.message="function Update is work,the message is that I was changed!";                             
  10.             }
  11.             
  12.             var obj=new Object();
  13.             obj.message="This is the original";
  14.             
  15.             Clobber(obj);
  16.             window.alert(obj.message);
  17.             
  18.             Update(obj);
  19.             window.alert(obj.message);
  20.                 
  21.             
  22.         </script>

 

 

Javascript中数组的用法跟C#语言中的相似,都可以通过array[int]的形式来访问。但在javascript当中的对象来说就有不同了。

将对象作为关联数组

通常,使用点运算符“.”访问对象的属性。例如,

myObject.aProperty

在这里,属性名称是一个标识符。也可以用索引运算符“[]”访问对象的属性。在这里,是把对象看作一个关联数组。关联数组是一种数据结构,它可以动态地将任意的数据的值与任意的字符串相关联。例如,

myObject["aProperty"] // 与上面相同。

尽管索引运算符更多地用于访问数组元素,当用于对象时,索引总是以字符串文字表示的属性名称。

注意访问对象属性的两种方法的重要差异。

运算符属性名称作为对属性名称的处理
点“.”标识符不能作为数据处理
索引“[]”字符串文字被作为数据处理

在运行之前并不知道属性名称时,这个差异会有用(比如基于用户输入构造对象时)。要想从一个关联数组提取所有的属性,必须用 for … in 循环。

 

特殊字符

JScript 提供了一些特殊字符,允许在字符串中包括一些无法直接键入的字符。每个字符都以反斜杠开始。反斜杠是一个转义字符,表示 JScript 解释器下面的字符为特殊字符。

转义序列字符
/b退格
/f走纸换页
/n换行
/r回车
/t横向跳格 (Ctrl-I)
/'单引号
/"双引号
//反斜杠

请注意,由于反斜杠本身用作转义符,因此不能直接在脚本中键入一个反斜杠。如果要产生一个反斜杠,必须一起键入两个反斜杠 (//)。

document.write('The image path is C://webstuff//mypage//gifs//garden.gif.');
document.write('The caption reads, "After the snow of /'97. Grandma/'s house is covered."');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript,对象和组是引用类型,也就是说,它们在内存存储的是地址。当我们将一个对象或组赋值给另一个变量时,实际上是将这个地址赋值给了新变量,两个变量指向的是同一个对象或组。这就导致了一个问题,当我们改变其一个变量所指向的对象或组时,另一个变量也会受到影响。这种情况下,我们需要实现深复制。 深复制是指在内存创建一个新对象或组,并将原对象或组的所有属性和元素都复制到新对象或,即使原对象或包含其他对象或组,也会对其进行深度复制。这样,我们就可以拥有一个完全独立的副本,对其进行修改不会影响到原对象或组。 下面是一个实现深复制的例子: ```js function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let copy; if (Array.isArray(obj)) { copy = []; for (let i = 0; i < obj.length; i++) { copy[i] = deepCopy(obj[i]); } } else { copy = {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } } return copy; } ``` 上述代码,我们首先判断传入的参数是否为对象或组,如果不是的话,直接返回该参数。如果是对象或组,我们就创建一个新的对象或组,并遍历原对象或组的所有属性或元素,对每个属性或元素进行递归复制,直到复制完成为止。需要注意的是,我们在复制对象属性时,需要使用 hasOwnProperty 方法判断属性是否为对象自身的属性,而不是继承自原型链的属性。 另外,在实际应用,我们也可以使用第三方库来实现深复制,例如 Lodash 库提供了 cloneDeep 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值