js入门基础知识自我梳理第一篇之对象数据类型、数组数据类型

107 阅读14分钟

对象数据类型

创建对象

  1. 字面量创建
var obj={}
  1. 内置构造函数创建
var obj=new Object()

对象的操作方法

语法

  • 点语法:对象名.成员名=值
  • 数组关联语法:对象名[成员名]=值

对象两种语法的区别

  • 点语法:不能使用变量、不能拼接字符串
  • 数组关联语法:可以使用变量、可以拼接字符串

操作方法

  • 增:对象名.成员名=值对象名[成员名]=值
  • 删:delete 对象名.成员名delete 对象名[成员名]
  • 查:对象名.成员名对象名[成员名]
  • 改:对象名.成员名=值对象名[成员名]=值

遍历对象 for in

for ( var 变量名 in 对象 ) { 重复执行的代码 }

var obj={
name:'Bob',
age:18
}
forvar key in obj){
    console.log(key) //分别打印 name 和 age
    console.log(obj[key])//分别打印 Bob 和 18
}

对象内有多少个成员就执行多少次,循环的每一次,key分别是是对象的成员名称(字符串类型可以利用key和数组关联法来获取每个成员的值)

判断一个成员是否存在对象里

成员名 in 对象名

var obj={
name:'Bob',
age:18
}
console.log('name' in obj) //true

注:若成员名称为字符串,需加上''引号。

拓展

window 的 name 属性

  • 是一个全局天生自带的属性
  • 作用:在iframe标签和name属性合作进行跨域的
  • 特点:被固定为字符串了

函数也是一个对象

函数保存一段代码,可保存一堆数据,当定义好一个函数后函数就有两个功能:

  1. 函数名() 这是在执行函数
  2. 函数名.成员名=值 这是存储数据
function fn()={
    console.log(123)
}
fn() //这是在执行函数,打印 123

//下面两行代码为把函数当做对象进行操作
fn.age=18
fn['gender']='男'

对象的内存存储

栈内存

基本数据类型的存储(Number、Srting、Boolean、Null、Undefined、Symbol),是有序的

堆内存

复杂数据类型的存储(Object、Array、Function、Date、RegExp、Class、Map和Set),是无序的。先在堆中开辟空间,把内容放进空间里,再把这个空间地址给到变量,变量名存储在栈中

数组数据类型

可存储任意数据类型

创建数组

  1. 字面量创建
var arr=[]
  1. 内置构造函数创建
var arr=new Array()

两种创建数组方式的区别:

  • 字面量创建:直接加入数组成员
  • 内置构造函数创建:当不传参时为空数组;传一个参数时为这个数组的长度;传多个参数时全是数组成员
var arr=new Array(10) //表示长度为10的空数组,结果为[,,,,,,,,,]
var arr=new Array(10,'Rose') //传多个参数时全是数组成员,结果为[10,Rose]

数组的操作

length属性

可读写

  • 读:获取数组的长度
  • 写:设置数组的长度(注:当设置长度比本身数组的长度小,则相当于删除掉多出来的部分;当设置长度比本身数组的长度大,则多出来的部分用空补齐)

数组排列

按索引排列,从 0 开始,依次加 1 ,到 length-1 结束。 可读写:

  • 读:如有这个索引,则为该位置的数据值;如没有这个索引,则为 undefined
  • 写:设置指定索引位置的数据值。如有,直这个索引接更改数据值;如没有这个索引,则添加数据值;如设置索引大于 length-1 ,用空补齐

遍历数组 for

数组也是一个对象,使用点语法存储一些数据,成员不占用length位置,若用for in 循环遍历数组时,里面每一个索引位置、每一个key都会遍历出来

var arr1=new Array(10,'Rose')
for(var i=0;i<=arr1.length-1;i++){
  console.log(i) //打印arr1的索引:0 和 1
  console.log(arr1[i]) //打印arr1的数据值:10 和 Rose
}
for(key in arr1){
  console.log(key) //打印arr1的索引:0 和 1
  console.log(arr1[key]) //打印arr1的数据值:10 和 Rose

}

两种经典排序

冒泡排序

口诀:双层for循环,一层减一次,里层减外层,变量相交换。

var arr=[3,2,10,5,0]
for(var i=0;i<arr.length-1;i++){
  for(var j=0;j<arr.length-1-i;j++){
    if(arr[j]>arr[j+1]){
      var temp=arr[j]
      arr[j]=arr[j+1]
      arr[j+1]=temp
    }
  }
}
console.log(arr) //[0,2,3,5,10]

选择排序

每次找到一个最小的数字放在前面

  1. 如何找到数组里最小的数字?
  • 循环遍历数组
  • 假设索引 [0] 位置的数字最小
  • 如有数字比 [0] 的数字小,则交换索引
  1. 重复步骤1
  • 第二次假设 [1] 位置的数字最小
  • 重复 length-1 遍 总结:外层循环遍历索引 i 代表假设的最小的数字索引,里层从 i+1 开始循环
for(var i=0;i<arr.length;i++){
  var minIndex=i
  for(var j=i+1;j<arr.length;j++){
    if(arr[j]<arr[minIndex]){
      minIndex=j
    }
  }
   var temp=arr[i]
   arr[i]=arr[minIndex]
   arr[minIndex]=temp
}
console.log(arr) //[0,2,3,5,10]

数组的常用方法

push()

  • 语法:数组.push(数据1,数据2,数据3,......)
  • 作用:把所有参数按照顺序追加到数组的末尾
  • 返回值:追加后数组的长度
const array = [1, 2, 3, 4];

const newLength = array.push(5);
console.log(newLength);  // 输出: 5
console.log(array);  // 输出: [1, 2, 3, 4, 5]

注意:push() 方法会修改原始数组,并返回新的长度

pop()

  • 语法:数组.pop()
  • 作用:删除数组最后一个数据
  • 返回值:被删除的数据
const array = [1, 2, 3, 4, 5];

const lastElement = array.pop();
console.log(lastElement);  // 输出: 5
console.log(array);  // 输出: [1, 2, 3, 4]

注意:pop() 方法会修改原始数组,并返回被删除的元素

unshift()

  • 语法:数组.unshift(数据1,数据2,数据3,......)
  • 作用:把所有参数按照顺序追加到数组的最前
  • 返回值:追加后数组的长度
const array = [2, 3, 4, 5];

const newLength = array.unshift(1);
console.log(newLength);  // 输出: 5
console.log(array);  // 输出: [1, 2, 3, 4, 5]

注意:unshift() 方法会修改原始数组,并返回新的长度

shift() 直接操作原数组

  • 语法:数组.shift()
  • 作用:删除数组最前面的数据
  • 返回值:被删除的数据
const array = [1, 2, 3, 4, 5];

const firstElement = array.shift();
console.log(firstElement);  // 输出: 1
console.log(array);  // 输出: [2, 3, 4, 5]

注意:shift() 方法会修改原始数组,并返回被删除的元素

reverse()

  • 语法:数组.reverse()
  • 作用:反转数组
  • 返回值:反转后的数组
onst array = [1, 2, 3, 4, 5];

array.reverse();
console.log(array);  // 输出: [5, 4, 3, 2, 1]

注意:reverse() 方法会原地修改数组,并返回反转后的数组

sort()

  • 语法:
  1. 数组.sort() 默认情况下按照每一个数据的ASCII码进行排列;
  2. 不默认的话可以自定义排序函数,如下代码块:
数组.sort(function(a,b){
    return a-b //升序
})

数组.sort(function(a,b){
    return b-a //降序
})
  • 作用:数组排序
  • 返回值:排序后的数组
const array = [5, 1, 3, 2, 4];

// 默认按照 Unicode 编码排序
array.sort();
console.log(array);  // 输出: [1, 2, 3, 4, 5]

// 自定义排序函数
array.sort((a, b) => a - b);
console.log(array);  // 输出: [1, 2, 3, 4, 5]

注意:sort() 方法会原地修改数组,并返回排序后的数组

splice()

  • 语法:
  1. 数组.splice(开始索引,截取个数) 从开始索引开始,截取多少个,若第二个参数不写,默认截取到末尾;
  2. 数组.splice(开始索引,截取个数,替换数据1,替换数据2,......) 把替换数据按顺序插入到截取的位置(注:从哪个索引开始删除,替换数据的第一个就插到哪个位置;若截取个数为0,则只插入不删除)
  • 作用:
    1.截取数组
    2.替换新的内容
  • 返回值:一定是一个数组,返回一个包含被删除元素的新数组。如截取0个,则返回空数组
const array = ['a', 'b', 'c', 'd', 'e'];

const deleted = array.splice(2, 2);  // 删除从索引位置2开始的2个元素
console.log(array);  // 输出: ['a', 'b', 'e']
console.log(deleted);  // 输出: ['c', 'd']

array.splice(2, 0, 'x', 'y', 'z'); // 在索引位置2插入新元素
console.log(array);  // 输出: ['a', 'b', 'x', 'y', 'z', 'e']

注意:splice() 方法会修改原始数组,并返回一个包含被删除元素的新数组。

slice()

  • 语法: 数组.slice(开始索引,结束索引)
    包前不包后。若开始索引不写,表示从头截取;若结束索引不写,表示默认为原始数组的长度
  • 作用:获取数组里的某些数据
  • 返回值:一个数组,返回截取的值,若一个都不获取,则返回空数组,不改变原数组
const array = [1, 2, 3, 4, 5];

const newArray = array.slice(1, 4); //截取索引位置 1 到索引位置 4(不包括索引位置 4)之间的元素
console.log(newArray);  // 输出: [2, 3, 4]
const array = [1, 2, 3, 4, 5];

const newArray = array.slice(2); //省略结束索引,则提取从开始索引位置到数组末尾的所有元素:
console.log(newArray);  // 输出: [3, 4, 5]

注意:slice() 方法不会修改原始数组,而是返回一个新的数组

concat()

  • 语法: 数组.concat(数组1,数组2,......)
  • 作用:如参数是数组,则把数组拆开,里面每一项追加到原数组后面;如参数是数据,则直接追加在原数组后面
  • 返回值:追加后的数组,不改变原数组
const array2 = [4, 5, 6];

const newArray = array1.concat(array2);
console.log(newArray);  // 输出: [1, 2, 3, 4, 5, 6]
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const array3 = [7, 8, 9];

const newArray = array1.concat(array2, array3);
console.log(newArray);  // 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

注意:concat() 方法不会修改原始数组,而是返回一个新的数组

join()

  • 语法: 数组.join(‘连接符号’) 不传参默认用 ,号隔开
  • 作用:把数组拆开里面每个数据用连接符号连接在一起
  • 返回值:连接号的内容,是一个Srting类型,不改变原数组
const array = [1, 2, 3, 4, 5];

const joinedString = array.join();
console.log(joinedString);  // 输出: "1,2,3,4,5"
const array = [1, 2, 3, 4, 5];

const joinedString = array.join("-");
console.log(joinedString);  // 输出: "1-2-3-4-5"

注意:join() 方法不会修改原始数组,而是返回一个新的字符串

indexOf()

从左到右依次查找

  • 语法:
    1.数组.indexOf(数据)
    2.数组.indexOf(数据,开始索引)
  • 作用:查找数组里指定数据的索引
  • 返回值:如有这个数据,则返回第一个满足条件的索引;如没有这个数据,则返回 -1
const array = [1, 2, 3, 4, 3, 5];

const index = array.indexOf(3);
// 如果要查找的元素在数组中多次出现,`indexOf()` 方法只返回第一个匹配的索引值
console.log(index);  //输出: 2
const array = [1, 2, 3, 4, 5];

const index = array.indexOf(6);
 //如果要查找的元素不存在于数组中,则 `indexOf()` 方法返回 -1
console.log(index);  //输出: -1

注意:indexOf() 方法对于数组和字符串都适用,但对于字符串来说,它查找的是字符而不是元素。

lastIndexOf()

从右到左依次查找

  • 语法:
    1.数组.lastIndexOf(数据)
    2.数组.lastIndexOf(数据,开始索引)
  • 作用:反向查找数组里指定数据的索引
  • 返回值:如有这个数据,则返回第一个满足条件的索引;如没有这个数据,则返回 -1
const array = [1, 2, 3, 4, 3, 5];

const lastIndex = array.lastIndexOf(3);
console.log(lastIndex);  // 输出: 4
const array = [1, 2, 3, 4, 3, 5];

const lastIndex = array.lastIndexOf(3);
//如果要查找的元素在数组中多次出现,`lastIndexOf()` 方法只返回最后一个匹配的索引值
console.log(lastIndex);  // 输出: 4
const array = [1, 2, 3, 4, 5];

const lastIndex = array.lastIndexOf(6);
//如果要查找的元素不存在于数组中,则 `lastIndex()` 方法返回 -1
console.log(lastIndex);  // 输出: -1

forEach()

  • 语法:数组.forEach(function(item,index,arr){})
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:取代for循环的作用,遍历数组
  • 返回值:没有返回值
const array = [1, 2, 3, 4, 5];

array.forEach(function(item, index, arr) {
  console.log(item); //1 2 3 4 5 
  console.log(index); //0 1 2 3 4
  console.log(arr);//打印5次 1,2,3,4,5
});

注意:使用 forEach() 方法时,无法使用 break 或 return 来提前终止循环。如果需要在特定条件下终止循环,可以考虑使用 for 循环或 some() 方法。

map()

  • 语法:数组.map(function(item,index,arr){})
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:对数组中的每个元素进行处理
  • 返回值:返回一个新数组,对原始数组中的每个元素都执行回调函数,并将处理结果存储在新数组中,不会修改原始数组
const array = [1, 2, 3, 4, 5];

const newArray = array.map(function(item) {
  //将每个元素乘以 2,然后将处理结果存储在新数组 newArray 中
  return item * 2;
});
console.log(newArray);  // 输出: [2, 4, 6, 8, 10]
const array = [1, 2, 3, 4, 5];

const newArray = array.map(function(item, index, array) 
  return item * index;
});
console.log(newArray);  // 输出: [0, 2, 6, 12, 20]

注意:与 forEach() 方法不同,map() 方法返回一个新数组,因此它常用于对原始数组的转换和处理操作。如果在 map() 方法的回调函数中省略 return 语句,那么回调函数的执行结果将默认为 undefined,并且新数组中对应位置的元素将是 undefined。 复制

const array = [1, 2, 3];

const newArray = array.map(function(item) {
  item * 2;
});
console.log(newArray);  // 输出: [undefined, undefined, undefined]

filter()

  • 语法:数组.filter(function(item,index,arr){})
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:对原始数组进行过滤,把满足条件的数据放在新数组里
  • 返回值:返回一个新数组,数组里是所有原始数组中满足条件的项,不会修改原始数组
const array = [1, 2, 3, 4, 5];

const newArray = array.filter(function(item) {
 //将满足条件 item % 2 === 0 的元素添加到新数组 newArray 中
  return item % 2 === 0;
});
console.log(newArray);  // 输出: [2, 4]
const array = [1, 2, 3, 4, 5];

const newArray = array.filter(function(item, index, array) {
  return index % 2 === 0;
});
console.log(newArray);  // 输出: [1, 3, 5]

every()

  • 语法:数组.every(function(item,index,arr){})
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:判断原始数组是不是每一项都满足条件
  • 返回值:返回一个布尔值。若原始数组每一项都满足条件返回true;若原始数组只要有一项不满足条件返回false
const array = [2, 4, 6, 8, 10];

const allEven = array.every(function(item) {
  return item % 2 === 0;
});
console.log(allEven);  // 输出: true

注意:every() 方法在遇到第一个不满足条件的元素时就会停止遍历,并返回 false。这意味着如果数组中的任何一个元素不满足条件,every() 方法将立即返回 false,无需继续遍历剩余的元素。

some()

  • 语法:数组.some(function(item,index,arr){})
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:判断原始数组是不是有某一项都满足条件
  • 返回值:返回一个布尔值。若原始数组只要有任意一项满足条件返回true;若原始数组所有项都不满足条件返回false
const array = [1, 2, 3, 4, 5];

const hasEven = array.some(function(item, index, array) {
  return index % 2 === 0;
});
console.log(hasEven);  // 输出: true

注意:some() 方法在遇到第一个满足条件的元素时就会停止遍历,并返回 true。这意味着如果数组中的任何一个元素满足条件,some() 方法将立即返回 true,无需继续遍历剩余的元素。

reduce()

  • 语法:数组.some(function(result,item,index,arr){},初始值)
    result:累积值(上一次回调函数的返回值或初始值)
    item:数组里的每一项
    index:数组里的每一项的索引
    arr:原始数组
  • 作用:对数组中的元素进行累积计算,并返回最终的结果
  • 返回值:返回新的累积值
const array = [1, 2, 3, 4, 5];

const sum = array.reduce(function(result, item) {
  return result + item;
}, 0);
console.log(sum);  // 输出: 15
//1.第一次迭代:累积值为 `0`,当前元素为 `1`,计算结果为 `0 + 1 = 1`
//2.第二次迭代:累积值为 `1`,当前元素为 `2`,计算结果为 `1 + 2 = 3`
//3.第三次迭代:累积值为 `3`,当前元素为 `3`,计算结果为 `3 + 3 = 6`
//4.第四次迭代:累积值为 `6`,当前元素为 `4`,计算结果为 `6 + 4 = 10`
//5. 第五次迭代:累积值为 `10`,当前元素为 `5`,计算结果为 `10 + 5 = 15`

注意:如果不提供初始值参数,则将使用数组的第一个元素作为初始值,并从数组的第二个元素开始迭代。如果数组为空且没有提供初始值,则会抛出一个错误。reduce() 方法可以用于各种累积计算。

第一篇基础知识点整理完毕,接下来会陆续进行后面的梳理,敬请期待吧!!!啾咪~