写在前面的话:
经常看到技术博客上写的内容很详细,对于一个问题,大家的博客内容似乎都是一样的。不难发现这些技术博客已经成为各路教程的汇总地,而教程一般都是参考国外博客翻译或者直接在经典的书籍上大片抄录。我不推荐在segementfault或者其他博客上找教程学习编程,因为这样得来的东西是碎片化的,往往也掺杂着作者个人对于程序的理解,很容易误导人,所以学习最好的方法是自己买上一本圣经认真看透,再来博客论坛看看别人的学习心得,然后对比自己的理解,这样收获才会很大。所以今天关于这个javascript数组的总结认识,我写的不是教程,而是根据经典书籍参考学习后得到的一些感悟。想要完整学习,请务必看下列参考书籍
数据结构与算法JavaScript描述 p13~p32
javascript高级程序设计(第三版) p84~p98
先来举个数组栗子
tracy=[{1:"pomelo"},"tracy","2"];
//数组可以保存任何类型的数组,如字符串,对象,数值都可以
typeof(tracy)
//"object"数组是一个对象,对象是一个引用类型,
Array.isArray(tracy);
//”true“ ,这个是ECMAScript5定义的一个方法,
tracy[0][1]
//"pomelo",取出0号数组下属性名为“1”的值。用
tracy[0].1// VM1687:2 Uncaught SyntaxError: Unexpected numbermessage:
//因为对象属性值只能是字符串类型,所以直接用”点表示法“会报错,但是“[]表示法”可以
tracy=[{pomelo:"tracy"},"tracy","2"];
tracy[0].pomelo
//"tracy"。把数组0的对象属性名变成字符串就可以直接取值了
tracy.length//3
tracy[tracy.length]="imooc";
//"imooc", javascript中length是可读写的,因为数组能够实线末尾添加删除操作
tracy//[Object, "tracy", "2", "imooc"]
var tracyStr=tracy.toString();
//"undefined" toString()方法,将数组转化为字符串
tracyStr
//"[object Object],tracy,2,imooc"
tracy.join(";");
//"[object Object];tracy;2;imooc"
//join()方法只接受一个参数用于数组转化为字符串后的分隔符。
//toString()方法只是默认用“,”逗号分割。
以上就是一个简单的数组的栗子,我们可能在平时中也高频使用。总结一下:
1.数组可以保存任何类型的数组,如字符串,对象,数值都可以
2.javascript中length
是可读写的
3.JavaScript 对象中的属性名
必须是字符串。
数组的标准定义是什么?
数组是:一个存储元素的线性集合(collection)---(一段线性分配的内存
),元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。几乎所有的编程语言都有类
似的数据结构。
然而JavaScript 的数组却略有不同
。
1.javascript没有定义中说的那样的数据结构,作为替代。javascript提供类数组对象(array-like
),把下标变成字符串,用其作为属性,所以这就是它慢的原因
2.JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可
能是整数。使用起来方便:属性的检索操作像操作对象属性
一样
3.数组可以由 Array 对象的构造函数创建,也可以用内置的方法
怎么创建数组?
对象的创建:
var pomelo={};//对象字面量表达法
或者 var pomelo=new Object();//Object构造函数的方法
数组的创建:
var pomelo=[];//数组字面量表达法
或者 var pomelo=new Array();//使用array构造函数的方法(可以省略new)
Q
:那么数组字面量表达法创建与构造函数创建有什么不同呢?A
:大多数 JavaScript 专家推荐使用 []操作符,和使用 Array 的构造函数相比,这种方式被认为效率更高.
什么时候使用数组?
因为我们知道数组是一种对象,那么我们应该什么时候用数组?什么时候用对象呢?
其实有一个很简单的规则
就是:当属性名是连续的整数时就使用数组,否则就使用对象.
数组有那些原生的方法呢?
concat()
连接两个或更多的数组,并返回结果。
join()
把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素 slice()
从某个已有的数组返回选定的元素
sort() 对数组的元素进行排序
split() 方法用于把一个字符串分割成字符串数组。和join()方法相反splice()
删除元素,并向数组添加新元素。
toSource() 返回该对象的源代码。
toString() 把数组转换为字符串,并返回结果。
toLocaleString() 把数组转换为本地数组,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
valueOf() 返回数组对象的原始值
这些原生方法的使用我就不一一介绍了,大家自己去查API
javascript怎么去描述这些方法的数据结构和算法呢?
1.为了方便链式调用
,我们可以给Array原型添加自定义的方法来扩充数组功能
Function.prototype.method=function(name,func){
this.prototype[name]=func;
return this;
};
2.利用可读写的length
可以完成数组添加,删除操作
比如 push() 向数组的末尾添加元素
var poemlo=["1","2","3"];
pomelo.push("4");//["1","2","3","4"]
// pomelo[pomelo.length]="4";//["1","2","3","4"]
比如 pop()函数
Array.method("pop_pomelo",function(){
return this.splice(this.length-1,1);
})
pomelo.pop();// “4”
//pomelo.pomelo_pop() //["4"]
3.利用for in
可以完成数组的循环遍历的功能
//比如forEach()方法使得每个数组元素有乘方的效果
var pomelo=["1","2","3"];
function square(num){
console.log(num+": "+num*num);
}
pomelo.forEach(square);
//可以添加数组功能square
Array.method("square",function(){
for (var i=0;i<this.length;i++){
console.log(i+" "+this[i]*this[i]);
}
})
pomelo.square();//得到的效果与forEach()是一样的
4.普通的数组直接赋值是浅赋值,会改变原有的数组对象,我们可以自己写一个copy
数组函数
Array.method("copy_pomelo",function(){
var arr= [];
for (var i=0;i<this.length;i++){
arr[i]=this[i];
}
/*console.log(arr);
console.log(this);*/
arr.length=this.length;
return arr;
})
var new_pomelo=pomelo.copy_pomelo();
//new_pomelo的数组值和pomelo一样,但是是独立的数组
-
区分
splice()
和slice()
函数,split()函数slice() 从某个已有的数组返回选定的元素 slice(start,end) ===取出来的数组是slice[start]--slice[end] (但是不包含slice[end]) splice() 删除元素,并向数组添加新元素。 splice(start,deletecount,item) ===数组从splice[start]开始,移除deletecount个元素,并用新的item数组元素代替 split()函数是把一个`字符串`分割成字符串`数组`。和join()方法恰好相反。 "2:3:4:5".split(":") //将返回["2", "3", "4", "5"]
先写到这儿.持续更新==.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。