js的数组与对象关系
有的时候总犯糊涂,不理解对象和数组的关系,转载一篇文章,深刻记忆一下
http://hi.baidu.com/samdan/item/05179313d1ee4b9e99ce3371
比如有一个数组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';
alert(a.length);
最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最后的结果是5,也就是说,数组a的元素个数是5个。
JS数组”(array)和“对象”(object)
2009-12-30 16:15:45| 分类:JS技术|字号 订阅
比如有一个数组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';
alert(a.length);
最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最后的结果是5,也就是说,数组a的元素个数是5个。
遍历方法:
一:
var news = { id:'101', title:'这是标题', content:'这里是内容'}
for(var n in news){
document.write(n+'---'+news[n]+'<br>')
}
二:
var news = {
0:{id:'101', title:'这是标题111', content:'这里是内容111'},
1:{id:'101', title:'这是标题222', content:'这里是内容222'},
2:{id:'101', title:'这是标题333', content:'这里是内容333'}
}
for(var n in news){
document.write(n+'---'+news[n].title+'<br>')
}
/////调用值的方法 news.id 或 news['id']
字符转成对象
s = '{"address":"","email":"123@123.com","name":"test5","id":"6"};';
eval('o='+s);
alert(o.name);
或:
data=eval('(' +s+ ')');
-------------------------------------------------------------
对象是一种复合数据类型.
创建对象最简单的方法是你的javascript代码中包含对象直接量,也可以通过运算符new创建。
var empty = {}; // An object with no properties
var point = { x:0, y:0 };
var circle = { x:point.x, y:point.y+1, radius:2 };
var homer = {
"name": "Homer Simpson",
"age": 34,
"married": true,
"occupation": "plant operator",
'email':
};
var a = new Array(); // Create an empty array
var d = new Date(); // Create an object representing the current date and time
var r = new RegExp("javascript", "i"); // Create a pattern-matching object
创建对象后,我们可以通过"."运算符,在对象中创建新属性、引用已有属性、设置属性值等。
var book = new Object(); //创建对象
book.title="JavaScript: The Definitive Guide";
book.chapter1=new Object(); //作为对象属性的,嵌套对象
book.chapter1.title = "Introduction to JavaScript";
book.chapter1.pages = 11;
book.chapter2 = { title: "Lexical Structure", pages: 6 };
alert("Outline: " + book.title + "\n\t" +
"Chapter 1 " + book.chapter1.title + "\n\t" +
"Chapter 2 " + book.chapter2.title); // 从对象中读取一些属性.
在上例中,需注意,可以通过把一个值赋给对象的一个新属性来创建它.
在JavaScript语句中提到过用for/in语句可以遍历对象的属性和方法。
用in运算符检查属性是否存在.如:
if ("x" in o) o.x = 1;//如果存在就设置其属性值为1.
如果这样写:o.x=undefined //属性x是存在的,但是没有值.我常常会这样写:if (o.x !== undefined) o.x = 1;
另外,!= =常代替!=.!= =和= = = 区别在于undefined和null,不用区分时可以省略,如:if (o.doSomething) o.doSomething();
删除属性:delete book.chapter2;
作为关联数组的对象:object.property 和object["property"]是等价的.
通用对象的属性和方法
constructor属性:var d = new Date();d.constructor == Date; // true
由于构造函数定义了一个对象的类,所以属性constructor在有助于确定给定对象的类型.如,可以使用如下代码来确定一个未知对象的类型:if ((typeof o == "object") && (o.constructor == Date)),也可以用instanceof运算符:if ((typeof o == "object") && (o instanceof Date))
toString()方法:返回一个字符串,该字符串代表了调用它的对象的类型或值.当javascript需要将一个对象转换成字符串时就调用这个对象的toString()方法.例如当用"+"连接一个字符和一个对象时,或者把一个对象传递给alert()或document.write()方法时,就会调用toString().
默认的toString()方法提供的信息并不多.例如下面的代码只能得到字符串"[object Object]":var s = { x:1, y:1 }.toString();所以许多类都定义了自己的toString()方法,例如,当一个数组被转换成一个字符串时,就得到一个数组元素列表,其中每个元素都被转换成了字符串,当一个函数被转换成字符串时,就会获得该函数的源代码.第九章将详细讲述.
toLocaleString()方法:返回该对象局部化的字符串表示.Oject类定义的默认toLocaleString()方法自身不做任何局部化,返回的结果与toString()方法返回的完全相同,但是Object 类的子类则可能定义自己的toLocaleString()方法.
valueOf()方法:与toString()相似,当javascript需要将一个对象转换成字符串之外的原始类型(通常是数字)时,就需要调用它.
hasOwnProperty方法:如果对象局部定义一个非继承的属性,属性名是由一个字符串实际参数指定的,那么该方法将返回true,否则,它将返回false.如:
var o = {};
o.hasOwnProperty("undef"); // false: 没有定义该属性
o.hasOwnProperty("toString"); // false: toString是一个继承属性
Math.hasOwnProperty("cos"); // true: Math对象有cos属性
propertyIsEnumerable()方法:如果对象定义了一个属性,属性名是由一个字符串实际参数指定的,而且该属性可以用for/in循环枚举出来,那么该方法返回true,否则,返回false.例如:
var o = { x:1 };
o.propertyIsEnumerable("x"); // true: property exists and is enumerable
o.propertyIsEnumerable("y"); // false: property doesn't exist
o.propertyIsEnumerable("valueOf"); // false: property is inherited
isPrototypeOf()方法:如果调用对象是实际参数指定的对象的原型对象,该方法返回true,否则返回false.该方法的用途和对象的constructor属性相似.例如:
var o = {}
Object.prototype.isPrototypeOf(o); // true: o.constructor == Object
Object.isPrototypeOf(o); // false
o.isPrototypeOf(Object.prototype); // false
Function.prototype.isPrototypeOf(Object); // true: Object.constructor==Function
数组方法:
join():可以把一个数组的所有元素都转换成字符串,然后再把它们连接起来,你可以指定一个可选字符串来分隔结果字符串中的元素.如果没有指定分隔字符串,那么可以使用逗号分隔元素.
reverse():将颠倒数组元素的顺序并返回颠倒后的数组.它在原数组上执行这一操作,也就是说,它并不 创建一个重排了元素的新数组,而是在已经存在的数组中对数组元素进行重排.
sort():是在原数组上对数组元素进行排序,返回排序后的数组.如果调用sort()时不传递给它参数,那么它将按照字母顺序对数组元素进行排序(如果必要的话,可以暂时将元素转成字符串以执行比较操作)
concat():能创建并返回一个数组.这个数组包含了调用concat()的原始数组的元素,其后跟随的是concat()的参数.如果其中有些参数是数组,那么它就将被展开,其元素将被添加到返回的数组中.但是要注意,concat()并不能递归地展开一个元素为数组.
slice():返回的是指定数组是一个片段.
splice():插入或删除数组元素的通用方法.它在原数组上修改数组.
push()和pop():使我们可以像使用栈那样来使用数组.方法push()可以将一个或多个新元素附加到数组的尾部.然后返回数组的新长度.方法pop()恰恰相反.
unshift()和shift():与push()和pop() 非常相似,只不过它们是在数组的头部进行元素的插入和删除,而不是在尾部进行元素的插入和删除.
toString()和toLocaleString():注意,在输出的结果中,数组值的周围没有方括号或者其他定界符.
数组附加:indexof()和lastIndexof(),forEach(),map(),filter()
///////////////////
对象实例:
<script>
var news ={
1:{id:101,title:'这是标题1',content:'这里是内容1'},
2:{id:102,title:'这是标题2',content:'这里是内容2'},
3:{id:103,title:'这是标题3',content:'这里是内容3'},
4:{id:104,title:'这是标题4',content:'这里是内容4'},
jingdian:{101:'AAA',102:'BBB',103:'CCC',104:'DDD'}
}
var jingdian ={
101:{1101:'天安门',1102:'地安门',1103:'东安门'},
102:{2101:'天安门2',2102:'地安门2',2103:'东安门2'},
103:{3101:'天安门3',3102:'地安门3',3103:'东安门3'}
}
for (var n in news){
if(n!='jingdian'){
document.write(n+"--"+news[n].id+"--"+news[n].title+'----'+news[n].content+'======'+get_jingdian(news[n].id)+'=========<br>');
}
}
document.write('<hr>');
document.write(news[1]['title']+'--');
document.write(news[1].title);
document.write('<hr>');
for (var J in news['jingdian']){
document.write(news['jingdian'][J]+'<br>');
}
document.write('<hr>');
function get_jingdian(id){
//document.write(id);
//alert('id:'+id);
var str='';
for (var j in jingdian){
if(j==id){
//alert(j+'----'+id);
for (j2 in jingdian[id]){
str+='<a href='+j2+'>'+jingdian[id][j2]+'('+j2+')</a> ';
}
}
}
return str;
}
</script>
js的数组与对象关系的更多相关文章
- js之数组,对象,类数组对象
许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...
- js 空数组 空对象判断
js 空数组是true还是false 1 2 var arr = new Array(); // 或 var arr = []; 我们知道,初始化后,即使数组arr中没有元素,也是一个object ...
- js 判断 数组和对象
提方案的时候顺便会引申一下该方法的使用. 一,instanceOf:(可以判断) instanceOf运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性. 也可以这样说 ...
- js 笔记 数组(对象)
一.javascript push 的元素为指针 var data = {"test":{"201308":"23","20130 ...
- js中数组Array对象的方法sort()的应用
一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...
- js 中数组或者对象的深拷贝和浅拷贝
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...
- js引用类型数组去重-对象标记法
前言 Js数组去重已经有很多种实现方式:包括逐个检索对比(使用Array.property.indexOf),先排序后对比,使用hash表,利用ES6中的Set()等.这些数组去重办法中速度最快的是h ...
- js实现数组、对象深度克隆的两种办法
1.深度克隆的原理 JS中的深度克隆,指的是原对象改变了,克隆出来的新对象也不会改变,原对象与新对象是完全独立的关系. 实现深度克隆的原理得从对象是一种引用类型说起 众所周知,对象是一种引用类型,对象 ...
- js对数组、对象的深拷贝、复制
基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的 基本类型:Number Boolean undefined String Null 引用类型:Object Function js ...
随机推荐
- linux注意的一些地方
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行 #include <assert.h>void assert( int expr ...
- Java开发环境的搭建(jdk,eclipse)
一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可. http://www.orac ...
- 04Add.ashx(新增班级)
04Add.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- C# tostring 格式化输出
C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...
- angular $http服务详解
它是对原生XMLHttpRequest对象的简单封装, 这个方法会返回一个promise对象,具有sccess和error两个方法. 当然,我们也可以在响应返回时用then 方法来处理,会得到一个特殊 ...
- Django之views.py详解
http请求中产生的两个核心对象: http请求:HttpRequesthttp响应:HttpResponse 所在位置:from django.http import HttpRequest,Htt ...
- toml-lang - Tom's Obvious, Minimal Language
Tom's Obvious, Minimal Languagehttps://github.com/toml-lang/toml
- 第一个Shader程序
fx文件: float4x4 matWorld; float Time=1.0f; struct VS_OUTPUT { float4 Pos :POSITION; float4 Color :COL ...
- EasyUI Pagination 分页
通过 $.fn.pagination.defaults 重写默认的 defaults. 分页(pagination)允许用户通过翻页导航数据.它支持页面导航和页面长度选择的可配置选项.用户可以在分页的 ...
- Java系列介绍
Java系列目录 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述函数 Java 7新增功能 Java应用程序中System.out. ...