字符串是类数组,所以想要调用join方法时不同。
小结------
字符串与数组类似,可以当作数组来使用,但它不是数组
通过Array.prototype.join方法拿到数组方法,通过.call方式去把字符串传进来,这样可以将字符串当作数组用_来拼接
数组的各种方法都是从Array.prototype继承下来的,Array.prototype的原型是Objec.prototype,所以tostring等也可以使用
可以通过对象方式添加数组元素,如arr.a1=1,arr.a2=2
数组小节:
字符串和数组
可把字符串看成一个伪数组
字符串访问元素的方法可类似数组:str[n];
字符串自己的方法:str.charAt(n);
字符串也可用数组的Array.prototype上的方法
但不能arr.method()这样直接用
要Array.prototype,method.call(str);这样用
数组VS一般对象
Array.prototype的原型是Object.prototype
按索引访问数组常常比访问一般对象属性明显迅速,因为许多浏览器的js的引擎或者node的js引擎会对按索引访问数组进行优化
一般对象不会有Array.prototype上的那些方法
本章的小结
1)创建数组、数组的增删改查
首先是数组的创建,有两种方式:
var arr = [1,2,3]; //以字面量的形式创建
var arr = new Array(1,2,3); //以构造函数的形式创建
其中第二种以构造函数的形式有两种参数形式,第一种是直接传入数组的元素,第二种则是传入数组的length大小
数组创建好了,如何去增删改查?
增加:栈方法里的push()或者unshift(),前者是表示从数组的后面插入,后者则是从数组的前面插入(老司机开车了- -)
删除:栈方法里的pop()或者shift(),跟上面一样,前者是从数组的后面删除,后者是从前面删除,还有一种方法是Array.prototype.splice(),它有删除功能,可以传入两个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数
修改:可以通过索引去修改值或者用上面说到的Array.prototype.splice(),它有替换功能,可以传入三个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数,第三个参数表示替换的元素
查找:可以通过索引方法indexOf()或者lastIndexOf()去查找某个元素,方法有两个参数,第一个表示要查找的元素,第二个参数可以指定查找的起点位置
2)数组方法
Array.prototype.join(sep)
将数组转化为字符串,其中sep是分隔符,当sep没传入时默认的分隔符为逗号,如下:
var arr = [1,2,3];
arr.join(); //"1,2,3"
arr.join("||"); //"1||2||3"
Array.prototype.sort()
数组排序方法,默认是按字母先后顺序进行排列,如:
var arr = ["a","c","b"]; //["a","b","c"]
如果想要比较数字,则需要给sort传入一个比较函数,如:
arr.sort(function(a,b){
return a-b;
});
传入的函数返回值若为负数则表示a排在b前面,若为正数则相反,所以当我们想要升序排序则return a-b;若想要降序排序则return b-a;
Array.prototype.reverse()
数组的倒序排序,没什么好解释的啦- -
Array.prototype.concat()
数组的拼接方法,传入的参数是我们想要跟数组拼接起来的数或者另外一个数组
当传入数字或者数组时则附加到原数组的后面,当传入数组时,如果数组里还有数组就不会进行二级的拼接,如下:
arr.concat(4,5); //[1,2,3,4,5]
arr.concat(4,5,[6,7]); //[1,2,3,4,5,6,7]
arr.concat(4,5,[6,[7,8]]); //[1,2,3,4,5,6,[7,8]]
PS:Array.prototype.concat()并不会影响原数组,只是会返回一个新的数组
Array.prototype.slice()
生成子数组方法,参数有两个,第一个表示起始位置,第二个表示结束位置的后面一位,如:
var arr = [1,2,3,4,5,6,7,8];
arr.slice(2,4); //[3,4]
PS:Array.prototype.slice()并不会影响原数组,只是会返回一个新的数组
Array.prototype.splice()
这个方法很强大,它能够执行数组的删除,替换,插入操作
删除:传入两个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数
arr.splice(2,1); //[3]
替换:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数,第三个则是要替换的元素
arr.splice(2,1,9); //[3]
插入:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数(此处为0),第三个则是要插入的元素
arr.splice(2,0,10,11); //[]
PS:Array.prototype.splice()会影响原数组,返回一个删除的元素数组
迭代方法:
Array.prototype.forEach():对数组的每一项运行给定函数,不返回值
Array.prototype.map():对数组的每一项运行给定函数,返回运行结果所组成的数组
Array.prototype.filter():对数组的每一项运行给定函数,返回运行结果为true所组成的数组
Array.prototype.every():对数组的每一项运行给定函数,当所有运行结果为true时才返回true
Array.prototype.some():对数组的每一项运行给定函数,当有运行结果为true时才返回true
归并方法:
Array.prototype.reduce():从左到右对数组进行依次累积操作,返回最后的运行结果,如:
求数组的累加
var arr = [1,2,3];
arr.reduce(function(x,y,index,arr){
return x + y;
});
Array.prototype.reduceRight():从右到左对数组进行依次累积操作,返回最后的运行结果
var arr = [1,2,3];
arr.reduceRight(function(x,y,index,arr){
return x + y;
});
查找方法:
Array.prototype.indexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
Array.prototype.lastIndexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
1)创建数组、数组的增删改查
首先是数组的创建,有两种方式:
var
arr = [1,2,3];
//以字面量的形式创建
var
arr =
new
Array(1,2,3);
//以构造函数的形式创建
其中第二种以构造函数的形式有两种参数形式,第一种是直接传入数组的元素,第二种则是传入数组的length大小
数组创建好了,如何去增删改查?
增加:栈方法里的push()或者unshift(),前者是表示从数组的后面插入,后者则是从数组的前面插入(老司机开车了- -)
删除:栈方法里的pop()或者shift(),跟上面一样,前者是从数组的后面删除,后者是从前面删除,还有一种方法是Array.prototype.splice(),它有删除功能,可以传入两个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数
修改:可以通过索引去修改值或者用上面说到的Array.prototype.splice(),它有替换功能,可以传入三个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数,第三个参数表示替换的元素
查找:可以通过索引方法indexOf()或者lastIndexOf()去查找某个元素,方法有两个参数,第一个表示要查找的元素,第二个参数可以指定查找的起点位置
2)数组方法
Array.prototype.join(sep)
将数组转化为字符串,其中sep是分隔符,当sep没传入时默认的分隔符为逗号,如下:
var
arr = [1,2,3];
arr.join();
//"1,2,3"
arr.join(
"||"
);
//"1||2||3"
Array.prototype.sort()
数组排序方法,默认是按字母先后顺序进行排列,如:
var
arr = [
"a"
,
"c"
,
"b"
];
//["a","b","c"]
如果想要比较数字,则需要给sort传入一个比较函数,如:
arr.sort(
function
(a,b){
return
a-b;
});
传入的函数返回值若为负数则表示a排在b前面,若为正数则相反,所以当我们想要升序排序则
return
a-b;若想要降序排序则
return
b-a;
Array.prototype.reverse()
数组的倒序排序,没什么好解释的啦- -
Array.prototype.concat()
数组的拼接方法,传入的参数是我们想要跟数组拼接起来的数或者另外一个数组
当传入数字或者数组时则附加到原数组的后面,当传入数组时,如果数组里还有数组就不会进行二级的拼接,如下:
arr.concat(4,5);
//[1,2,3,4,5]
arr.concat(4,5,[6,7]);
//[1,2,3,4,5,6,7]
arr.concat(4,5,[6,[7,8]]);
//[1,2,3,4,5,6,[7,8]]
PS:Array.prototype.concat()并不会影响原数组,只是会返回一个新的数组
Array.prototype.slice()
生成子数组方法,参数有两个,第一个表示起始位置,第二个表示结束位置的后面一位,如:
var
arr = [1,2,3,4,5,6,7,8];
arr.slice(2,4);
//[3,4]
PS:Array.prototype.slice()并不会影响原数组,只是会返回一个新的数组
Array.prototype.splice()
这个方法很强大,它能够执行数组的删除,替换,插入操作
删除:传入两个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数
arr.splice(2,1);
//[3]
替换:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数,第三个则是要替换的元素
arr.splice(2,1,9);
//[3]
插入:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数(此处为0),第三个则是要插入的元素
arr.splice(2,0,10,11);
//[]
PS:Array.prototype.splice()会影响原数组,返回一个删除的元素数组
迭代方法:
Array.prototype.forEach():对数组的每一项运行给定函数,不返回值
Array.prototype.map():对数组的每一项运行给定函数,返回运行结果所组成的数组
Array.prototype.filter():对数组的每一项运行给定函数,返回运行结果为
true
所组成的数组
Array.prototype.every():对数组的每一项运行给定函数,当所有运行结果为
true
时才返回
true
Array.prototype.some():对数组的每一项运行给定函数,当有运行结果为
true
时才返回
true
归并方法:
Array.prototype.reduce():从左到右对数组进行依次累积操作,返回最后的运行结果,如:
求数组的累加
var
arr = [1,2,3];
arr.reduce(
function
(x,y,index,arr){
return
x + y;
});
Array.prototype.reduceRight():从右到左对数组进行依次累积操作,返回最后的运行结果
var
arr = [1,2,3];
arr.reduceRight(
function
(x,y,index,arr){
return
x + y;
});
查找方法:
Array.prototype.indexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
Array.prototype.lastIndexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
数组VS一般对象
相同:都可以继承,数组是对象,对象不一定是数组,都可以当作对象添加删除属性
不同:数组自动更新length;按索引访问数组常常比访问一般对象属性明显迅速。数组对象继承Array.prototype上的大量数组操作方法。
var str = "hello world"; str.charAt();// "h" str[1];//e Array.prototype.join.call(str, "_"); // "h_e_l_l_o__w_o_r_l_d"
字符串和数组
数组与一般对象的对比
1)创建数组、数组的增删改查
首先是数组的创建,有两种方式:
var arr = [1,2,3]; //以字面量的形式创建
var arr = new Array(1,2,3); //以构造函数的形式创建
其中第二种以构造函数的形式有两种参数形式,第一种是直接传入数组的元素,第二种则是传入数组的length大小
数组创建好了,如何去增删改查?
增加:栈方法里的push()或者unshift(),前者是表示从数组的后面插入,后者则是从数组的前面插入(老司机开车了- -)
删除:栈方法里的pop()或者shift(),跟上面一样,前者是从数组的后面删除,后者是从前面删除,还有一种方法是Array.prototype.splice(),它有删除功能,可以传入两个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数
修改:可以通过索引去修改值或者用上面说到的Array.prototype.splice(),它有替换功能,可以传入三个参数,第一个表示删除的起点位置,第二个参数表示删除的元素个数,第三个参数表示替换的元素
查找:可以通过索引方法indexOf()或者lastIndexOf()去查找某个元素,方法有两个参数,第一个表示要查找的元素,第二个参数可以指定查找的起点位置
2)数组方法
Array.prototype.join(sep)
将数组转化为字符串,其中sep是分隔符,当sep没传入时默认的分隔符为逗号,如下:
var arr = [1,2,3];
arr.join(); //"1,2,3"
arr.join("||"); //"1||2||3"
Array.prototype.sort()
数组排序方法,默认是按字母先后顺序进行排列,如:
var arr = ["a","c","b"]; //["a","b","c"]
如果想要比较数字,则需要给sort传入一个比较函数,如:
arr.sort(function(a,b){
return a-b;
});
传入的函数返回值若为负数则表示a排在b前面,若为正数则相反,所以当我们想要升序排序则return a-b;若想要降序排序则return b-a;
Array.prototype.reverse()
数组的倒序排序,没什么好解释的啦- -
Array.prototype.concat()
数组的拼接方法,传入的参数是我们想要跟数组拼接起来的数或者另外一个数组
当传入数字或者数组时则附加到原数组的后面,当传入数组时,如果数组里还有数组就不会进行二级的拼接,如下:
arr.concat(4,5); //[1,2,3,4,5]
arr.concat(4,5,[6,7]); //[1,2,3,4,5,6,7]
arr.concat(4,5,[6,[7,8]]); //[1,2,3,4,5,6,[7,8]]
PS:Array.prototype.concat()并不会影响原数组,只是会返回一个新的数组
Array.prototype.slice()
生成子数组方法,参数有两个,第一个表示起始位置,第二个表示结束位置的后面一位,如:
var arr = [1,2,3,4,5,6,7,8];
arr.slice(2,4); //[3,4]
PS:Array.prototype.slice()并不会影响原数组,只是会返回一个新的数组
Array.prototype.splice()
这个方法很强大,它能够执行数组的删除,替换,插入操作
删除:传入两个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数
arr.splice(2,1); //[3]
替换:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数,第三个则是要替换的元素
arr.splice(2,1,9); //[3]
插入:传入三个参数,第一个表示起始位置,第二个表示从起始位置起删除的元素个数(此处为0),第三个则是要插入的元素
arr.splice(2,0,10,11); //[]
PS:Array.prototype.splice()会影响原数组,返回一个删除的元素数组
迭代方法:
Array.prototype.forEach():对数组的每一项运行给定函数,不返回值
Array.prototype.map():对数组的每一项运行给定函数,返回运行结果所组成的数组
Array.prototype.filter():对数组的每一项运行给定函数,返回运行结果为true所组成的数组
Array.prototype.every():对数组的每一项运行给定函数,当所有运行结果为true时才返回true
Array.prototype.some():对数组的每一项运行给定函数,当有运行结果为true时才返回true
归并方法:
Array.prototype.reduce():从左到右对数组进行依次累积操作,返回最后的运行结果,如:
求数组的累加
var arr = [1,2,3];
arr.reduce(function(x,y,index,arr){
return x + y;
});
Array.prototype.reduceRight():从右到左对数组进行依次累积操作,返回最后的运行结果
var arr = [1,2,3];
arr.reduceRight(function(x,y,index,arr){
return x + y;
});
查找方法:
Array.prototype.indexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
Array.prototype.lastIndexOf():两个参数,第一个表示查找的元素,第二个表示查找的起点位置
字符串不是数组,但字符串是“类数组”
我们知道只有数组有join的方法
但是我们可以通过
Array.prototype.join.call(str, "_");
的方法对字符串也进行join的操作
数组和一般对象的区别