JavaScript数组与对象

数组的长度与数组能包含的数据类型一样,都是不固定的。 数组可以包含任意数量的元素,可以不限次数地往数组中添加元素或者从中移除元素。 总之,数组是可变的(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);

猜你喜欢

转载自blog.csdn.net/Shao_yihao/article/details/121503521