数组的方法(Array.prototype的属性) |
变更自身 |
会改变数组自身
copyWithin(target, start=0, end=ary.length) |
copyWithin(target[, start[, end]])
复制 begin~end-1 的元素到target
● 返回变化后的新数组
target |
复制到的位置, 负数则+ary.length
|
start |
开始复制的起点, 负数则+ary.length
默认0
|
end |
开始复制的终点(不包含此位置), 负数则+ary.length
默认ary.length
|
a = Array(10);
a[a.length-1] = 2;
a[a.length-2] = 1;
a[a.length-3] = 0;
console.log(a); // => [empty × 7, 0, 1, 2]
a.copyWithin(0, -3);
console.log(a); // => [0, 1, 2, empty × 4, 0, 1, 2]
|
fill(value, start=0, end=array.length) |
fill(value[, start[, end]])
将 begin~end-1 位置的元素替换为value
|
pop() |
删除并返回末尾元素
|
push(data1[, data2, ...]) |
● 在末尾添加data
● 返回变化后的数组长度
注: 参数可以为多个
let a = [];
a.push(1); // [1]
a.push(2, 3); // [1, 2, 3]
|
reverse() |
倒序(改变自身并返回自身)
|
sort(callback) |
● 对元素用callback方法来排序
● 返回排列后的数组
● 参数
f(a, b) |
a: 左元素, b: 右元素
● 返回值
<0 |
a在b前 |
=0 |
a和b位置相同 |
>0 |
a在b后 |
|
|
|
● 省略参数则元素转换成字符串, 按词典顺序排序
undefined放最后
|
splice(index=0, howmany=this.length[, data, ...]) |
splice(index[, howmany[, data, ...]])
● 添加或删除元素
● 返回值为被删除的元素的数组
● 参数含义
index |
开始位置
大于数组长度则设为数组长度
小于零则加上数组长度(即指 倒数第|index|个 )
|
howmany |
删除的元素数
省略则删除index后全部元素(包括index)
|
data... |
|
例:
只指定第一个参数 |
删除第一个参数指定位置及之后的所有元素
a = [0, 1, 2, 3, 4, 5, 6];
// 指定第一个参数则删除之后(包含第一个参数)的
a.splice(1); // => [1, 2, 3, 4, 5, 6]
// a: [0]
|
指定第1,2参数 |
删除第一个参数指定位置起的第二个参数个的元素
第二参数为0则不删除
a.splice(1, 2); // => [1, 2]
// a: [0, 3, 4, 5, 6]
|
指定第1,2参数并继续指定参数 |
删除后第3参数及之后的插入到原第一参数位置上
a.splice(1, 2, 2, 1); // => [1, 2]
// a: [0, 2, 1, 3, 4, 5, 6]
|
|
shift() |
删除并返回开头第一个元素 |
unshift(data1[, data2, ...]) |
● 在开头添加指定元素
● 按参数顺序从前往后:
● 返回变化后的数组长度
[1, 2, 3].unshift(4, 5, 6); //=> [4, 5, 6, 1, 2, 3]
|
|
|
|
|
|
获取 |
不改变自身
concat(array1[,array2,...]) |
把参数的数组连到现在数组最后
● 只展开一次
● 参数的数组内部元素全部都是浅复制(参照则为参照)
|
join(string=",") |
把数组以参数string为分隔字符连接成字符串
● 先把元素转换成字符串
● undefined/null 都转换成空字符串 ""
● 分隔符指定为 "" 则为单纯的连接
|
slice(begin=0, end=array.length) |
获取从begin到end-1的新数组
● 参数
begin |
开始处
● 默认0
● 负数时+array.length
|
end |
结束处(不包含end位置)
● 默认array.length
● 负数时+array.length
|
|
indexOf(searchElement, fromIndex=0) |
indexOf(searchElement[, fromIndex = 0])
获取和第一个searchElement相等元素的index
● 找不到则返回-1
● 参数
searchElement |
需要搜索的值 |
fromIndex |
搜索开始的位置
● 默认0
● 负数时+array.length
● 一直搜索到最后一个(arr.length-1)
故指定arr.length则不搜索(返回-1)
|
|
lastIndexOf(searchElement, fromIndex=0) |
lastIndexOf(searchElement[, fromIndex = 0])
获取最后一个和searchElement相等元素的index
● 找不到则返回-1
● 参数
searchElement |
需要搜索的值 |
fromIndex |
搜索开始的位置(从后万前搜索)
● 默认array.length-1
● 负数时+array.length
● 一直搜索到第一个
|
|
toLocaleString() |
把元素转换成所在地对应的字符串并以 , 连接
● 相当于 join()
|
toString() |
把元素转换成字符串并以 , 连接
● 相当于 join()
|
|
|
|
迭代 |
● 对null/undefined不呼出callback
● thisArg对箭头函数无效
every(callback[, thisArg]) |
若有callback返回false, 则为false。否则为true
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
some(callback[, thisArg]) |
元素中有没有元素满足callback
有至少一个则返回true, 没有满足的则返回false
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
filter(callback[, thisArg]) |
生成callback返回true的元素构成的新数组
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
find(callback[, thisArg]) |
获取第一个使callback返回true的元素
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
findIndex(callback[, thisArg]) |
获取第一个使callback返回true的元素的index
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
forEach(callback[, thisArg]) |
按元素顺序用callback处理元素
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
map(callback[, thisArg]) |
返回callback结果的数组
var b = a.map((v)=>{
return 100;
});
● 参数
callback |
function(value, index, array) {}
可以省略部分或全部参数
value |
现在的值 |
index |
现在的索引 |
array |
现在的数组 |
|
thisArg |
callback里的this的值 |
|
reduce(callback[, initial]) |
用callback把元素从左往右处理返回一个数
● 参数
callback |
function(prev, value[, index[, array]])
参数全都可以省略
prev |
上一次处理的返回值
● 第一次时
(是否指定initial) ? (prev为initial, value为第一个) : (prev为第一个, value为第二个)
|
value |
现在处理的值 |
index |
现在处理的值的索引 |
array |
当前数组 |
|
initial |
第一次呼出callback时, prev的值
● 可省略
|
|
reduceRight(callback[, initial]) |
用callback把元素从右往左处理返回一个数
● 参数
和reduce一样, 但是实际运行为从右往左
|
entries() |
获取要素的index和值的数组构成的迭代器
● 形式: [index, value]
a = [1, 2, 3, 4, 5, 6];
var iter = a.entries();
for (var temp of iter) {
console.log(temp);
}
/*
(2) [0, 1]
(2) [1, 2]
(2) [2, 3]
(2) [3, 4]
(2) [4, 5]
(2) [5, 6]
*/
|
keys() |
返回以index为值的迭代器
|
values() |
返回元素的值的迭代器
|
|
|
|
|
|
|
|
多重数组 |
生成 |
数组的元素设为数组即可
var a = Array(10);
for(var i = 0; i < a.length; i++) {
a[i] = [];
}
|
|
|
类似数组的对象 |
数组 |
● 有属性名为0及自然数的属性
● 有length属性, 增加/删除元素时length会更新, 改变length也会改变数组
● 继承Array.prototype, 可用相关method
可以用instanceof来判断是否由Array生成( a instanceof Array )
|
类似数组的对象 |
满足上面的前两条
● 例: Arguments, NodeList(document.getElementsByTagName, document.getElementsByName等的返回值)
● 不可用直接用Array.prototype的方法
调用方法:
Array.prototype.map.call(a, () => {return 1;});
例外: concat, 返回值为数组
● 可用for, for/in
|
|
|
|
|
|
|
|
|
|
|
ES6对数组和对象的新功能 |
迭代器 |
进行反复的数据结构
● 属性
next方法 |
返回Object
● Object必须有如下属性
|
● 例
数组自带的迭代器: ary[Symbol.iterator]()
var a = Array(10);
for (var i = 0; i < a.length; i++) {
a[i] = i;
}
var iter = a[Symbol.iterator]();
for (var i = 0; i < a.length+1; i++) {
console.log(iter.next());
}
/* =>
{value: 0, done: false}
{value: 1, done: false}
{value: 2, done: false}
{value: 3, done: false}
{value: 4, done: false}
{value: 5, done: false}
{value: 6, done: false}
{value: 7, done: false}
{value: 8, done: false}
{value: 9, done: false}
{value: undefined, done: true}
*/
|
for/of语法 |
直接取出value
● 能用 for/of 的条件
有Symbol.iterator方法 |
|
Symbol.iterator方法返回iterator |
|
● 可用 for/of 的自带Object
Array, String, TypedArray, Map, Set
● 迭代器的迭代语法(不用也可以,但是写法更繁琐)
var a = Array(10);
for (var i = 0; i < a.length; i++) {
a[i] = i;
}
var iter = a[Symbol.iterator]();
for (var v of iter) {
console.log(v);
}
/* =>
0
1
2
3
4
5
6
7
8
9
*/
● 不用for/or的迭代写法
// while写法
while (true) {
const temp = iter.next();
if (temp.done) {
break;
}
console.log(temp);
}
// for写法
for (var i = iter.next();i.done===false; i = iter.next()) {
console.log(i);
}
● 对自己做的迭代器进行反复处理
var iterable = {};
iterable[Symbol.iterator] = function() { return iter; };
for(var v of iterable) {
console.log(v);
}
● 系统自带的迭代器自身也有Symbol.iterator(返回自身)
|
Generator函数 |
返回迭代器, 可以暂停和继续处理
● 语法: function* 来定义, 至少包含一个 yield或 yield* (每一个yield都是一个断点, 此处的值写入value)
function* sample() {
yield 1;
yield 2;
yield 3;
}
const iter = sample();
for(var t of iter) {
console.log(t);
}
/*
1
2
3
*/
● next(arg)
可以带参数, 作为上一次的 yield 式子 的返回值
console.log(iter2.next());
console.log(iter2.next(true));
console.log(iter2.next());
● return(arg)
结束迭代( done:true ), 把value设为arg
● throw(error)
iter.throw(new Error("error)); // 用try-catch来处理
|
yield* |
用于可反复(有Symbol.iterator对象, 返回迭代器)对象
var iter3 = (function* iterator3() {
const str = "i am kedaya";
yield* str;
})();
for (var v of iter3) {
console.log(v);
}
|
分割代入 |
|
展开运算符 |
|
ArrayBuffer |
|
Map |
|
Set |
|
|
|