Note:this blog copied from: http://www.k99k.com/ ,if u reship it,pls note the resource.
在javascript中,对象实际上就是一个哈希表,比如下面这个user对象:
function user(n, a)
{
this.name = n;
this.age = a;
this.toString = function() {
return 'Name:' + this.name + ', Age:' + this.age;
}
}
var u = new user('tom', 18);
for (var k in u) {
alert('key: ' + k + ', value:' + u[k]);
}
稍作改动,使用Array对象来代替对象:
var user = new Array();
user['name']='tom';
user['age']=18;
user['toString']=function(){
return 'Name:' + this.name + ', Age:' + this.age;
}
alert(user.toString());
更简单的写法:
var u = {
'name':'tom',
'age':18
}
u.toString = function(){return 'Name:' + this.name + ', Age:' + this.age;};
alert(u.toString());
由以上这些代码可以看出:
- 所有的javascript对象,包括Array对象在内实际上就是一个哈希表,属性名称就是哈希表的key,而属性的值就是哈希表的值。
- Array对象与通常意义的数组对象并不相关,通常的数组仅能通过下标来定位,而javascript中的Array却可以像哈希表一个通过key来定位集合中的对象。
- 可以将一个function直接作为值赋给对象的“哈希表”。
前端时间看了阮一峰的 《数据类型与Json格式》 一文,提到在yaml描述数据时,将所有的数据分成三种类型:
- 第一种类型是scalar(标量),一个单独的string或数字,比如“北京”这个单独的词。
- 第二种类型是sequence(序列),若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如“北京,东京”。
- 第三种类型是map(映射),一个键/值对(Key/value),又称作hash(散列)或dictionary(字典),比如“首都:北京”。
可能这三种类型我们都很熟悉,但文中提到的对json的四条规则却正好剖析了javascript描述数据的方式:
- 并列的数据之间用逗号(“,”)分隔。
- 映射用冒号(“:”)表示。
- 并列数据的集合(数组)用方括号('[]')表示。
- 映射的集合(对象)用大括号(“{}”)表示。
有了这四条规则(再加上对function的理解),对于很多看上去非常“诡异”的写法,都可以理解了。因此,一个javascript对象,实际上就是一个数组或是映射。
关于数组与映射的不同,可以看下面这个例子:
var m = {
name:'keel',
age:5
}
var a = [m,'sss',3];
//以下请求成功定位到name属性
alert(m['name']);
alert(a[0]['name']);//a[0]定位到m
alert(a[0].name);
//以下失败
alert(m[0]);//映射无法以数组下标的方式访问
- 从定位到成员的方法来看,映射使用key来定位其中的成员,而数组使用下标,映射无法使用下标定位,同样数组也无法使用key(理所当然,根本就没有key);
- 从表示方法来看,映射可以使用类似对象属性的方式来访问(如:m.name),也可以使用带key的[]方式(如:m['name'],这是javascript一个特例,看上去像数组,实际上仍是映射);但数组仅能使用下标的方式;
- 从顺序来看:数组是有顺序的,映射是无序的;
数据类型和json格式:(Note:this blog copied from:http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html ,if u reship it,pls note the resource.)
1.
前几天,我才知道有一种简化的数据交换格式,叫做yaml。
我翻了一遍它的文档,看懂的地方不多,但是有一句话令我茅塞顿开。
它说,从结构上看,所有的数据最终都可以分成三种类型:
第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词。
第二种类型是sequence(序列),也就是若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如“北京,东京”。
第三种类型是mapping(映射),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作hash(散列)或dictionary(字典),比如“首都:北京”。
我恍然大悟,数据构成的最小单位原来如此简单!难怪在编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。
2.
我马上想到了json。
21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。这其实需要二步,第一步是将各种数据转化为一个字符串,也就是数据的串行化(serialization),第二步才是交换这个字符串。
当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。
Json的规格非常简单,只用一个页面、几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(“,”)分隔。
2) 映射用冒号(“:”)表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号(“{}”)表示。
上面四条规则,就是Json格式的所有内容。
比如,下面这句话:
“北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。”
写成json格式就是这样:
[
{"城市":"北京","面积":16800,"人口":1600},
{"城市":"上海","面积":6400,"人口":1800}
]
如果事先知道数据的结构,上面的写法还可以进一步简化:
[
["北京",16800,1600],
["上海",6400,1800]
]
由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。
我猜想,Douglas Crockford一定事先就知道,数据结构可以简化成三种形式,否则怎么可能将json定义得如此精炼呢!
3.
我还记得,在学习javascript的时候,我一度搞不清楚“数组”(array)和“对象”(object)的根本区别在哪里,两者都可以用来表示数据的集合。
比如有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后你运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?
我后来才知道,数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
4.
当然,数组和对象的另一个区别是,数组中的数据没有“名称”(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';
alert(a.length);
最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最后的结果是5,也就是说,数组a的元素个数是5个。
分享到:
相关推荐
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立...
JavaScript Object Browser扩展是一种针对开发人员的实用工具,它专门设计用于可视化和探索JavaScript对象的结构。这个扩展在浏览器环境中提供了一个交互式的界面,允许开发者深入理解代码中的对象、属性和方法,...
这篇名为“JavaScript Object toString 初始补充”的博客文章可能深入探讨了`toString`方法在JavaScript中的应用和一些不常见的用法。作者Will-2011在iteye.com上分享了这个话题,这通常意味着这篇文章会包含代码...
Mastering JavaScript Object-Oriented Programming 2016 | ISBN: 1785889109 | English | 287 pages | PDF | 1.9 MB With this book, we'll provide you with a comprehensive overview of OOP principles in ...
JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式。它采用完全独立于语言的文本格式,同时也被广泛用于非JavaScript环境。JSON的设计目标是简洁和易于阅读及编写,同时也易于机器解析和生成。它是...
JavaScript Object Programming 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传...
Javascript Object Oriented Programming 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请...
那位大哥有javascript object 大全
JavaScript Object和JSON是Web开发中两个非常重要的概念,它们在数据交换和存储中扮演着关键角色。这篇博客将深入探讨这两个主题,以及它们之间的关系。 首先,JavaScript Object(JS对象)是JavaScript语言中的...
This brief book explains the advantages of the object model, inheritance, both classical and prototypical, and shows how these concepts can be implemented in JavaScript. It also shows how object ...
Mastering JavaScript Object-Oriented Programming 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
Build sophisticated web applications by mastering the art of Object-Oriented Javascript About This Book Learn popular Object-Oriented programming (OOP) principles and design patterns to build robust ...
### JavaScript中的Object与Function #### 一、引言 随着JavaScript的发展与标准化,这门语言已经成为Web开发领域不可或缺的一部分。然而,在深入学习JavaScript的过程中,不少开发者对于语言内部的一些概念仍感...
首先,`toString`方法是所有JavaScript对象的原型`Object.prototype`上的一个方法。这意味着,无论你创建何种类型的对象,它们都继承了这个方法。默认情况下,如果直接对一个对象调用`toString`,它会返回一个表示该...
在这份“Javascript Object 对象学习笔记”中,将深入探讨JavaScript对象的基础知识、属性和方法。首先,我们需要明白什么是对象。在JavaScript中,对象是一种复合数据类型,它将许多值(原始值或其他对象)聚合在...
JavaScript中的`Object.extend`是一个用于实现对象继承的关键技术。它允许你将一个对象的属性和方法扩展或复制到另一个对象中。在这个过程中,我们可以探讨几个关键概念:对象、类、原型(prototype)、实例成员和...