注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

①嗰亽挺ぬ

莈亽噯,僦洎巳噯洎巳

 
 
 

日志

 
 
 
 

JS 按值和按引用比较  

2013-11-18 10:29:54|  分类: web开发~js |  标签: |举报 |字号 订阅

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

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

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

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

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

//String demo
var str1 = new String("zhuzi");
var str2 = new String("zhuzi");

alert(str1 == str2);//false

var str11 = "zhuzi";
var str22 = "zhuzi";
alert(str11 == str22);//true

//对象调用 demo
//***按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。
// 本代码段破坏(覆盖)其参数,所以
// 调用代码中反映不出变化。
function Clobber(param) {
    // 破坏参数;在调用代码中
    // 看不到。
    param = new Object();
    param.message = "This will not work";
}

// 本段代码改变参数的属性,
// 在调用代码中可看到属性改变。
function Update(param){
    // 改变对象的属性;
    // 可从调用代码中看到改变。
    param.message = "I was changed";
}

// 创建一个对象,并赋给一个属性。
var obj = new Object();
obj.message = "This is the original";

// 调用 Clobber,并输出 obj.message。注意,它没有发生变化。
Clobber(obj);
window.alert(obj.message); // 仍然显示 "This is the original"。

// 调用 Update,并输出 obj.message。注意,它已经被改变了。
Update(obj);
window.alert(obj.message); // 显示 "I was changed"。

  评论这张
 
阅读(7)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017