如果你读书、看报,那么你会理解 JavaScript 的数组和对象之间的不同之处。
当你刚开始学 JavaScript 时,用哪一种方式组织和存储数据更好往往会让人困惑。
一方面,你可能在学习 “for” 循环的时候熟悉了数组。但是,一旦你尽可能多地将数据塞进数组,当你在检查你的代码的时候,你创造的乱七八糟的东西将会让你难以理解。
当你可以快速地决定每个结构的目标时,在对象和数组之间选择会简单得多。数组和书籍存储信息的方式相差无几,而对象则和报纸存储信息的方式差不多。
让我们来看看!
数组:数据的顺序是最重要的
这是超短篇小说的章节,以数组的形式。
var book = ['foreword', 'boyWhoLived', 'vanishingGlass', 'lettersFromNoOne', 'afterword'];
好吧,我承认,这是《哈利波特》系列的第一本的前三章。这是数组的可视化的形式:
当顺序成为组织信息的最重要的因素时你应该使用数组。没有人(我希望)这样看《哈利波特》的章节标题,“嗯…,那章看起来很有趣,让我跳到那!”章节的顺序告诉你下一章是什么。
当你从数组中检索信息时,你使用每个元素的下标。数组是从零开始索引的,这意味着从 0 开始计数而不是 1。
如果你想要访问下标为 0 的书籍数组,你要用:
books[0]
然后你会得到:
'foreword'
如果你想得到这本书第三章的章节标题,你要用:
books[2]
你会基于书的章节顺序来读下一章,而不是基于书的章节标题。
对象:数据标签是最重要的
报纸可能看起来是这样的,以对象的形式。
var newspaper= { sports: 'ARod Hits Home Run', business: 'GE Stock Dips Again', movies: 'Superman Is A Flop'}
下面是以可视化的形式来看同样的数据。
当你要基于数据标签来组织数据时,对象是最好的。当你看报纸时,你可能不会从前往后一页页地读。你会基于新闻标题来跳过特定的部分。无论在报纸的哪个地方,你都可以快速的跳过并且有合适的上下文。这和书不一样,书的章节顺序很重要。
对象通过键/值对来组织数据。看起来像这样:
key: value
如果你想要进入报纸的商业部分,你会使用这样的键:
newspaper[‘business’]
或者:
new
这回返回值 ‘GE Stock Dips Again’。所以,通过数据的标签(键)来访问数据是最简单的,你想要把数据存在对象里。
结合对象和数组
目前为止,我们只是在数组和对象中保存了 strings,你也可以保存其他类型的数据,比如 numbers 和 booleans,同时:
- 对象内的数组
- 数组中的对象
- 数组中的数组
- 对象中的对象
现在开始变复杂了。但是,你几乎只需要两种以扩展方式的组合来存储你的数据。当你一星期后回顾代码也想要理解。
让我们再看下书的例子。如果我们想要保存每章的页数会怎样呢?用对象来填满我们的数组可能是最好的。像这样:
var book =[ [‘foreword’, 14], [‘boywholived’, 18]]
var book = [ {name:'foreword', pageCount: 14}, {name:'boyWhoLived', pageCount: 18}, {name:'vanishingGlass', pageCount: 13}, {name:'lettersFromNoOne', pageCount: 17}, {name:'afterword', pageCount: 19}];
我们维护了每章的顺序,现在我们可以叫出每章的特定的属性。所以,如果我们想要知道第二张的页数,我们可以用:
book[1][‘pageCount’]
这会返回一个 18 的值。
现在假设你想知道你当地报纸每个栏目的顶级作者的排名,基于他们的资历。你可以在报纸对象中用一个数组来表达,像这样:
var newspaper= { sports: 'ARod Hits Home Run', sportsWriters: ['Miramon Nuevo', 'Rick Reilly', 'Woddy Paige'], business: 'GE Stock Dips Again', businessWriters: ['Adam Smith', 'Albert Humphrey', 'Charles Handy'], movies: 'Superman Is A Flop', moviesWriters: ['Rogert Ebert', 'Andrew Sarris', 'Wesley Morris']}
比如有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后你运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?
数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
当然,数组和对象的另一个区别是,数组中的数据没有“名称”(name),对象中的数据有“名称”(name)。但是问题是,很多编程语言中,都有一种叫做“关联数组”(associative array)的东西。这种数组中的数据是有名称的。
比如在javascript中,可以这样定义一个对象:
var a={"城市":"北京","面积":16800,"人口":1600};
但是,也可以定义成一个关联数组:
a["城市"]="北京";
a["面积"]=16800;
a["人口"]=1600;
在Javascript语言中,关联数组就是对象,对象就是关联数组。这一点与php语言完全不同,在php中,关联数组也是数组。
比如运行下面这段javascript:
var a=[1,2,3,4];
a['foo']='Hello World';
aler);
最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最后的结果是5,也就是说,数组a的元素个数是5个。
一个数组用来存储作者很合适,因为顺序很重要。你知道每个数组中靠前的作者排名更高。下标为 0 的作者是排名最高的。
你可以通过创建对象来优化报纸对象。比如,一个包含标题和作者列表的体育对象。但我会让你来尝试!
觉得本文对你有帮助?请分享给更多人
关注「Java架构师日记」,提升自己