介绍
- 任何类型的数据,都可以放入数组
var arr = [
1,
2,
'abc',
{p:1},
function(){
console.log(this.p);
}
]
- 数组属于一种特殊的对象,键名是按次序排列的一组整数
typeof [1, 2, 3] //"object"
var arr = ['a', 'b', 'c'];
Object.keys(arr)
//["0", "1", "2"]
arr['0'] // 'a'
arr[0] // 'a'
a[1.00] = 6;
a[1] // 6
arr.0 // SyntaxError
- length
length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值
var arr = [ 'a', 'b', 'c' ];
arr.length // 3
arr.length = 2;
arr // ["a", "b"]
arr.length = 0;
arr // []
如果人为设置length大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空位var a = ['a']; a.length = 3; a[1] // undefined
由于数组本质上是一种对象,所以可以为数组添加属性,但是这不影响length属性的值
var a = []; a['p'] = 'abc'; a.length // 0 a[2.1] = 'abc'; a.length // 0
in
var arr = [ 'a', 'b', 'c' ];
2 in arr // true
'2' in arr // true
4 in arr // false
var arr = [];
arr[100] = 'a';
100 in arr // true
1 in arr // false
数组遍历
不要使用for in,它会把非数字键也遍历出来
var arr = [1,2,3]
arr.xxx = 'xxx'
"xxx"
arr.forEach(function(item){console.log(item)})
VM406:1 1
VM406:1 2
VM406:1 3
for(let a in arr){console.log(a)}
VM478:1 0
VM478:1 1
VM478:1 2
VM478:1 xxx
for
for(var i = 0; i < a.length; i++) {
console.log(a[i]);
}
while
var i = 0;
while (i < a.length) {
console.log(a[i]);
i++;
}
foreach
var colors = ['red', 'green', 'blue'];
colors.forEach(function (color) {
console.log(color);
});
// red
// green
// blue
数组空位
- 当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位
var a = [1, , 1]; a.length // 3
- 如果最后一个元素后面有逗号,并不会产生空位
var a = [1, 2, 3,]; a.length // 3 a // [1, 2, 3]
- 数组的空位是可以读取的,返回undefined
var a = [, , ,]; a[1] // undefined
- 遍历空位都会被跳过,是undefined遍历的时候就不会被跳过
var a = [, , ,];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
})
// 不产生任何输出
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
});
// 0. undefined
// 1. undefined
// 2. undefined
类似数组的对象
典型的“类似数组的对象”是函数的arguments对象,以及大多数 DOM 元素集,还有字符串
- 属性要为索引
- 必须有length属性
- 最好加上push方法
var obj = {
0: 'a',
1: 'b',
2: 'c',
name: 'abc',
age: 123,
length: 3,
push: Array.prototype.push,
splice: Array.prototype.splice,
}
console.log(obj)
// arguments对象
function args() { return arguments }
var arrayLike = args('a', 'b');
arrayLike[0] // 'a'
arrayLike.length // 2
arrayLike instanceof Array // false
// DOM元素集
var elts = document.getElementsByTagName('h3');
elts.length // 3
elts instanceof Array // false
// 字符串
'abc'[1] // 'b'
'abc'.length // 3
'abc' instanceof Array // false
//通过call(),可以把forEach()嫁接到string上面调用
Array.prototype.forEach.call('abc', function (chr) {
console.log(chr);
});
// a
// b
// c
//数组的slice方法可以将“类似数组的对象”变成真正的数组
var arr = Array.prototype.slice.call('abc');
arr.forEach(function (chr) {
console.log(chr);
});
// a
// b
// c
嫁接方法比直接使用数组原生的forEach要慢,所以最好还是先将“类似数组的对象”转为真正的数组,然后再直接调用数组的forEach方法
数组操作
改变原数组
Array.prototype.push 最后增加
Array.prototype.unshift 开头增加
Array.prototype.pop 删除最后一位,
Array.prototype.shift 删除第一位
Array.prototype.reverse 翻转
Array.prototype.splice(第几位开始,截取长度,在切口处添加新数据)
var arr = [1, 2, 3, 4, 5, 6]
// console.log(arr.splice(1, 2))//[2, 3]
// console.log(arr)//[1, 4, 5, 6]
// console.log(arr.splice(1, 2, 0, 0, 0)) //[2, 3]
// console.log(arr) // [1, 0, 0, 0, 4, 5, 6]
// console.log(arr.splice(3, 0, 10)) //[]
// console.log(arr) // [1, 2, 3, 10, 4, 5, 6]
Array.prototype.sort 排序
var arr = [1, 3, 5, 4, 10]
//当返回值为负数时,那么前面的数放在前面,升序
//为正数,那么后面的数在前 降序
//为0 不动
arr.sort(function(x, y) {
return x - y
})
console.log(arr)
不改变原数组
concat 连接数组 返回新数组
slice 返回截取的数组
var arr = [1, 3, 5, 4, 10]
//slice(从该位开始是截取,截取到该长度位)
// console.log(arr.slice(2, 3)) //5
//slice(从该位截取到最后)
// console.log(arr.slice(1))//[3, 5, 4, 10]
//slice(负数)倒着数
console.log(arr.slice(-3)) //[5, 4, 10]
//slice()截取整个数组
join(‘,’) 把数组里每一项用符号连接
split(‘,’) 分离字符串为数组
var arr = [1, 3, 5, 4, 10]
var arr1 = arr.join('-')
console.log(arr1) //1-3-5-4-10
console.log(arr1.split('-')) //['1', '3', '5', '4', '10']
console.log(arr)//[1, 3, 5, 4, 10]
数组去重
- 利用对象属性不能重复的特性
- 利用ES6的set不能重复
```javascript
function distinctByObj(arr) {
var obj = {}
return arr.filter((item) => {
}) }return obj[item] ? false : (obj[item] = 'abc')
function distinctBySet(arr) { return Array.from(new Set(arr)) }
var arr = [1, 2, 3, 4, 3, 5, 4, ‘true’, ‘true’] var newArr = distinctByObj(arr) var newArr1 = distinctBySet(arr)
console.log(newArr1) //[1, 2, 3, 4, 5, ‘true’]
找到第一个不重复的
```javascript
var a = 'opkhijpokhiajpokijhpokipohjkpojhkpohjkphbjpokopkijhkijhpo'
function findSingleChar(str) {
var len = str.length
for (var i = 0; i < len; i++) {
var firStr = str.slice(i + 1)
var secStr = str.slice(0, i)
if (firStr.indexOf(str[i]) == -1 && secStr.indexOf(str[i]) == -1) {
return str[i]
} else {
continue
}
}
}
console.log(findSingleChar(a)) //a