arr = [] 数组自变量 相当于new Array 所有方法都是 Array.prototype
js里的数组基于对象,当访问没有的属性时返回undefined 不报错
var arr = [,] // [empty] length 1
var arr = [, , ] // [empty*2] // length 3
var arr = [ 1, ,1 ] // [1, empty ,1] // length 3
var arr = new Array(1,2,3,4,5) // [1,2,3,4,5]
var arr = new Array(10)
// [empty*10] 当newArray只有一个参数,参数为length
var arr = new Array(10.3) // 报错 数组长度不能为小数
Array() // []
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
Array(7); // [ , , , , , , ]
Array(1, 2, 3); // [1, 2, 3]
String(arr) 返回一个与数组视觉上一样的字符串
var arr = [1, 2, 3, 4]
var str = String(arr)
str // "1, 2, 3, 4"
arr. join(“分隔符”) 如果分隔符""则无缝拼接,如果括号里不写,则等同于 String()
var arr = [1, 2, 3, 4]
console.log(arr.join("")); // 1234
console.log(arr.join()); // "1,2,3,4"
console.log(arr.join("~")); //1~2~3~4
arr.concat() 将两个数组合并成一个数组,concat的参数中包含数组,则打散数组,以单个元素拼接
// 字符串拼数组
var arr1 = [1, 2, 3], arr2 = [4, 5, 6]
console.log(arr1.concat(1, 2)); //[1, 2, 3, 1, 2]
// 数组拼数组
var arr1 = [1, 2, 3], arr2 = [4, 5, 6]
console.log(arr1.concat(arr2)); //[1, 2, 3, 4, 5, 6]
arr.slice(start,end+1) 含头不含尾
获得arr中starti位置开始,到endi位置的所有元素组成的新数组
省略第二个参数:表示从starti一直取到结尾
可支持负数参数:-n表示倒数第n个元素,相当于length-n
var arr = [1, 2, 3, 4]
arr.slice(0)//[1, 2, 3, 4]
arr.slice(0, 2)//[1, 2]
arr.slice(-3)//[2, 3, 4]
arr.slice(-3, -1)//[2, 3]
arr.slice(0, 2)//[1, 2]
arr//[1, 2, 3, 4]
arr.splice(start,n) 删除从start开始的n个元素 返回被删除的元素组成的临时新数组
arr.splice(start,0,1,2,3) 从start开始删除0个元素,添加1,2,3
arr.splice(start,3,1,2,3) 从start开始删除n个,添加1,2,3
// 删除
var arr = [1, 2, 3, 4]
arr.splice(0)//[1, 2, 3, 4]
var arr = [1, 2, 3, 4]
arr.splice(-1)//[4]
var arr = [1, 2, 3, 4]
arr.splice(0, 3)//[1, 2, 3]
arr // [4]
// 添加
var arr = [1, 2, 3, 4]
arr.splice(2, 0, 22, 33)
arr//[1, 2, 22, 33, 3, 4] 在 2 的位置上删除0个 添22,33
// 替换
var arr = [1, 2, 3, 4]
arr.splice(2, 2, 5, 6)
arr//[1, 2, 5, 6]
arr.sort() 默认升序
sort()括号里是一个接口,可以通过回调函数按照想要的方式排序
要求: 必须写两个形参 ; 排序根据返回值
当为负数升序 前面的数在前,正数降序 后面的数在前, 0不动
arr=[1,5,3,2]
arr.sort()//[1, 2, 3, 5]
arr=[1,5,32,2]
arr.sort()//[1, 2, 32, 5]
arr//[1, 2, 32, 5] 这里有个bug 因为排序是按照Unicode码来排序 3在5之前
var arr = [1, 4, 3, 10, 42]
arr.sort(function (a, b){
if(a > b){ // 可以直接写成 return a-b 升序
return 1; // return b-a 降序
}else {
return -1;
}
})
// [1, 3, 4, 10, 42] 降序只需要把判断改掉
// 对象也可以排序
var a = {
age: 21
}
var b = {
age: 51
}
var c = {
age: 17
}
var d = {
age: 24
}
var arr = [a, b, c, d]
arr.sort(function (a, b) {
return a.age - b.age
})
(4) [{…}, {…}, {…}, {…}]
/*
0:{age: 17}
1:{age: 21}
2:{age: 24}
3:{age: 51}
*/
// 根据字节长度排序
String.prototype.bytes = function retBytes() {
var num = this.length
for (var i = 0; i < this.length; i++) {
if (this.charCodeAt(i) > 255) {
num++
}
}
return num
}
var arr = ["dfafd", "sfdfffdsss", "cd", "sdfdfss"]
arr.sort(function (a, b) {
return a.bytes() - b.bytes()
})
console.log(arr); //["cd", "dfafd", "sdfdfss", "sfdfffdsss"]
arr.reverse() 将数组里的数值反转,并修改原数组
自己封装思路 就是将原数组逆向循环,然后push新数组里,最后重新赋值给原数组
var arr = [1, 2, 3]
arr.reverse()
arr // [3,2,1]
// 原理
var arr = [1, 2, 3]
var index=[]
for (let i = arr.length; i ; i--) {
index.push(i)
}
console.log(index); // [3,2,1]
结尾入栈 arr.push() 返回新数组的length
结尾出栈arr.pop()
// 入栈
var arr=[1,2,3,4]
arr2=arr.push(1)//5
//返回新数组的长度
arr//[1, 2, 3, 4, 1]
// push 原理
Array.prototype.push = function (target) {
this[this.length] = target;
this.length++
}
// 出栈
var arr=[1,2,3,4]
arr.pop()//4
//返回弹出的元素
arr//[1,2,3]
入栈 arr.unshift()
出栈arr.shift() 返回取出的元素
// 入栈
var arr=[1,2,3,4]
arr.unshift(22)//5
arr//[22, 1, 2, 3, 4]
// 原理 新建一个数组,然后再拼接
// 出栈
var arr=[1,2,3,4]
arr.shift()//1
arr//[2, 3, 4]
1.arr.splice();
2.arr.reverse();
3.arr.sort();
4.arr.push(值);arr.pop();
5.arr.unshift(值);arr.shift();
1.String(arr);
2.arr.join(“自定义分隔符”);
3.arr1.concat(值1,值2,arr2,…);
4.arr.slice(starti,endi+1);
console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
Array.isArray([1, 2, 3]);
// true
Array.isArray({foo: 123});
// false
Array.isArray("foobar");
// false
Array.isArray(undefined);
// false
var array1 = [1, 2, 3, 4, 5];
// place at position 0 the element between position 3 and 4
console.log(array1.copyWithin(0, 3, 4));
// expected output: Array [4, 2, 3, 4, 5]
// place at position 1 the elements after position 3
console.log(array1.copyWithin(1, 3));
// expected output: Array [4, 4, 5, 4, 5]
var array1 = ['a', 'b', 'c'];
var iterator1 = array1.entries();
console.log(iterator1.next().value);
// expected output: Array [0, "a"]
console.log(iterator1.next().value);
// expected output: Array [1, "b"]
{
value:[0:index,1:'value'],
done:false
}
//结束时value:undefine, done: true
function isBelowThreshold(currentValue) {
return currentValue < 40;
}
var array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every(isBelowThreshold));
// expected output: true
var array1 = [1, 2, 3, 4];
// fill with 0 from position 2 until position 4
console.log(array1.fill(0, 1, 3));
// expected output: [1, 0, 0, 4]
// fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5]
console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]
callback
用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
返回true表示保留该元素(通过测试),false则不保留。它接受三个参数:
element
当前在数组中处理的元素。
array可选
调用了filter的数组。
thisArg可选
可选。执行 callback 时的用于 this 的值。
var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
function findCherries(fruit) {
return fruit.name === 'cherries';
}
console.log(inventory.find(findCherries)); // { name: 'cherries', quantity: 5 }
相当于一个以数字为索引的对象
属性为索引
有length属性
最好有push方法
var obj = {
'0': 'a',
'1': 'b',
'2': 'c',
"length": 3,
"push": Array.prototype.push, // push方法为人为添加
"splice": Array.prototype.splice // 加了splice方法后,打印出来就和数组一样
}
// alibaba 面试题:
var obj = {
'2': 'a',
'3': 'b',
"length": 2,
"push": Array.prototype.push
}
obj.push("c")
obj.push("d")
console.log(obj); // {'2':"c",'3':"d",'length':4}
typeof (arguments) // Object
// 类数组也是对象 即使是数组返回也是Object