惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

博客园 - zitiger

33.99-36.99 万,特斯拉 Model Y 售价公布 treegridview - zitiger - 博客园 1 老虎Sitemap生成器 0.5.3 老虎Sitemap生成器 0.5.2 老虎Sitemap生成器 0.3 老虎Sitemap生成器 0.2 诚聘ASP.NET开发人员[杭州] 老虎SEO助手 0.3 欢迎使用 老虎关键词排名查询器 v0.2.5 给金猪宝宝取名起名的策略和技巧 东北虎介绍 面向对象的 Javascript 语言特性:闭包 - zitiger 面向对象的 Javascript 语言特性:作用域 面向对象的 Javascript 函数重载和类型检查 《搜索引擎优化SEO知识完全手册》在线阅读(一) 这种选项卡有现成的控件吗? 更换桌面壁纸的小工具。 关于Assembly.CreateInstance中被启动对象读取配置文件的问题
面向对象的 Javascript 语言特性:引用
zitiger · 2007-06-08 · via 博客园 - zitiger

引用

  JavaScript的一个重要的方面是引用的概念。引用就是指向对象实际位置的指针。这是一项极其强大的功能。前提是,实际的对象决不是一个引用:字符串总是一个字符串,数组总是一个数组。然而,多个变量可以引用相同的对象。JavaScript就是以这种引用引用机制为基础。通过维护一系列的指向其它对象的引用,语言为你提供了更大的弹性。
  另外,对象能包括一系列的属性,这些属性简单地引用其它对象(如字符串,数字,数组等等)。当几个变量指向相同对象时,修改底层对象类型将会在所有的指点向它的变量上有所反映。例2-1即此一例,两个变量指向同一个对象,但是对对象内容的修改的反映是全局的。

  程序2-1. 多变量引用单个对象的示例

//设置obj为一个空对象
var obj = new Object();

//objRef现在引用了别的对象
var objRef = obj;

//修改原始对象的属性
obj.oneProperty = true;

//我们可以发现该变化在两个变量中都可以看到
//(因为他们引用了同一个对象)
alert( obj.oneProperty === objRef.oneProperty );

  我从前提到过自更改的对象在JavaScript里非常少见的。让我们看一个发生这一状况的实例。数组对象能够用push方法给它自己增加额外的项。因为在数组对象的核心,值是作为对象的属性存储的,结果类似程序2-1中的情形,一个对象成为全局被改动的(导致了多个变量的值被同时改变)。见程序2-2.

  程序2-2. 自修改对象的例子

//创建一组项目的数组
var items = new Array( "one", "two", "three" );

//创建一个对项目数组的引用
var itemsRef = items;

//给原始数组添加一项
items.push( "four" );

//两个数组的长度应该相同,
//因为它们都指向相同的数组对象
alert( items.length == itemsRef.length );

  记住这一点是很重要的:引用总是只指向最终被引用的对象,而不会是引用本身。例如,在Perl语言里,很可能有一个引用指向另一个也是引用的变量。但在JavaScript里,它会沿着引用链向下追溯直到指向核心的对象。程序2-3演示了这种情形,物理的目标已经改变而引用仍然指向原来的对象。

  程序2-3. Changing the Reference of an Object While Maintaining Integrity(见#9 oerrite 的回复)

// 设置items为一个字符串的数组(对象)
var items = new Array( "one", "two", "three" );

// 设置itemsRef为对items的引用
var itemsRef = items;

//让items指向一个新的对象
items = new Array( "new", "array" );

// items和itemsRef现在指向不同的对象
// items指向new Array( "new", "array" )
// itemsRef则指向new Array( "one", "two", "three" )
alert( items !== itemsRef );

  最后,让我们来看一个陌生的例子,表面似乎是一个自修改的对象,却作用于一个新的未被引用的对象。当执行字符串串联时,结果总是一个新的字符串对象,而非原字符串更改后的版本。这在程序2-4中可以看出。

  程序2-4. 对象修改作用于一个新的对象而非自修改对象的示例

//让item等于一个新的字符串对象
var item = "test";

//itemRef也引用相同的字符串对象
var itemRef = item;

//在字符串对象上串联一个新的对象
//注意:这创建了一个新的对象,并不修改初始对象
item += "ing";

//item和itemRef的值并不相等,因为
//一个全新的对象被创建了
alert( item != itemRef );

  如果你刚刚接触,引用可能是个令人头大的刁钻话题。然而,理解引用是如何工作的对于编写良好、干净的JavaScript代码是极其重要的。接下来的几节我们将探究几种未必新鲜和令人激动的,但是同样对编写良好、干净的代码很重要的特性。