数组的长度与数组能包含的数据类型一样,都是不固定的。 数组可以包含任意数量的元素,可以不限次数地往数组中添加元素或者从中移除元素。 总之,数组是可变的(mutable)。
pop、shift每次只能删除数组中的一个元素,且会返回所删除的元素
如果我们想删除数组中间的一个元素, 或者想一次删除多个元素,该如何操作呢? 这时候我们就需要使用 splice() 方法了。
splice() 可以让我们从数组中的任意位置连续删除任意数量的元素,并返回删除元素所构成的数组。
splice() 的第一个参数代表从数组中的哪个下标开始移除元素,而第二个参数表示要从数组中的这个位置开始(包括该位置)删除多少个元素。
还可以用splice函数在删除的同时进行替换:splice函数可以最多可传入3个参数,第3个参数新替换的元素。
a = [1, 2, 2, 5, 6];
a.splice(2, 1, 3, 4); //将【3、4】看作一个整体插入
console.log(a); // [1 2 3 4 5 6]
方法slice() 不会修改数组,而是会复制,或者说提取(extract)给定数量的元素到一个新数组,即返回一个新数组。
slice() 只接收 2 个输入参数:第一个是开始提取元素的位置(下标),第二个是提取元素的结束位置(下标)。注意: 提取的元素中不包括第二个参数所对应的元素。
a = [1, 2, 3, 4];
b = a.slice(0, 2);
console.log(b); // 1 2
如果想要将整个数组复制到另一个数组,除了可以使用slice方法之外,ES6还提供了一种更加简便的方法:使用展开运算符
a = [1, 2, 3, 4];
b = [...a];
console.log(b);
function copy_K_times(arr, num)
{
let newArr = [];
while (num >= 1)
{
let a = [...arr];
newArr.push(a);
num--;
}
return newArr;
}
console.log(copy_K_times([1, 2, 1], 2));
展开语法(spread)的另一个重要用途是合并数组,或者将某个数组的所有元素插入到另一个数组的任意位置。 我们也可以使用 ES5 的语法连接两个数组,但只能让它们首尾相接。 而展开语法可以让这样的操作变得极其简单:
a = [3, 4, 5];
b = [1, 2, ...a, 6, 7];
console.log(b);
由于数组随时都可以修改或发生 mutated,我们很难保证某个数据始终处于数组中的特定位置,甚至不能保证该元素是否还存在于该数组中。
我们可以用indexOf()
方法来方便地检查某个元素是否存在于数组中。
indexOf()
方法接受一个元素作为输入参数,并返回该元素在数组中的位置(下标);若该元素不存在于数组中则返回 -1。
function quickCheck(arr, elem)
{
if (arr.indexOf(elem) != -1) return true;
else return false;
}
遍历数组
JavaScript 为我们提供了几个内置的方法,它们以不同的方式遍历数组,以便我们可以用于不同的场景(如 every()、forEach()、map() 等等)。
数组的一个强大的特性是,它可以包含其他数组,甚至完全由其他数组组成。数组中的数组还可以再包含其他数组,即可以嵌套任意多层数组。 习惯上,我们称这种数据结构为多维(multi-dimensional)数组或嵌套(nested)数组。
对象(object)本质上是键值对(key-value pair)的集合。 或者说,一系列被映射到唯一标识符的数据就是对象;习惯上,唯一标识符叫做属性(property)或者键(key);数据叫做值(value)。
const tekkenCharacter = {
player: 'Hwoarang',
fightingStyle: 'Tae Kwon Doe',
human: true
};
如果我们想为它再添加一个叫做 origin 的属性,可以这样写:
tekkenCharacter.origin = 'South Korea'; //点号表示法
tekkenCharacter['hair color'] = 'dyed orange'; //方括号表示法
如果要设置的属性中存在空格,或者要设置的属性是一个变量,那我们必须使用方括号表示法(bracket notation)来为对象添加属性。
使用方括号表示法时,属性名要放在引号内。
可以通过delete关键字删除对象属性。
delete a.age;
判断一个对象中是否含有某个属性有两种方法: 一个是通过 hasOwnProperty() 方法,另一个是使用 in 关键字。
users.hasOwnProperty('Alan');
'Alan' in users;
//这两种表示方式均为一个布尔值
如果我们想要遍历对象中的所有属性, 只需要使用 JavaScript 中的 for…in 语句即可。
a = {
age: 18,
name: 'shao'
};
for (let i in Obj) //遍历了a中的所有属性 (本质上是遍历数组中的每个元素)
{
console.log(i); //输出属性名
console.log(Obj[i]); //输出属性值
}
在上面的代码中,我们定义了一个 i 变量。 可以观察到,这个变量在遍历对象的语句执行过程中会一直被重置并赋予新值。
**注意:**对象中的键是无序的,这与数组不同。 因此,一个对象中某个属性的位置,或者说它出现的相对顺序,在引用或访问该属性时是不确定的。
利用函数Object.keys(obj)
可以将对象obj中的所有属性名提取出来,形成一个数组并返回。
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
u = Object.keys(users);
console.log(u);