js基础3 数组与函数

本文详细介绍了JavaScript中的数组,包括数组概念、遍历、解构赋值、增删改查及常用方法。此外,还深入讲解了函数的注意事项、arguments对象、匿名函数、箭头函数、递归以及函数作用域、作用域链和预解析等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7 数组

7.1 数组概念

  1. 数组是引用数据类型(对象类型)let 变量名称 = new Arrey(n);

  2. 变量名称[i];就可以取出数组内的元素

  3. 如果数组中对应的索引中没有存储数据,默认存储是undefined;js中访问数组中不存在索引不会报错,会返回undefined;js中数组存储空间不够时,会自动扩容;js数组可以存储不同类型数据;js中数组分配的存储空间不一定是连续的;js数组可以存储不同类型的数据;js中数组分配的存储空间不一定是连续的;

  4. 创建数组的其他方式 通过构造函数创建数组let 变量名称 = new Arrey(size);``let 变量名称 = new Arrey();``let 变量名称 = new Arrey(data 1,data2, ...);通过字面量创建数组: let 变量名称 = [];let 变量名称 = [data1, data 2,...];

7.2 数组遍历

  1. 循环语句获取数组内容,数组长度arr.length

7.3 数组解构赋值

  1. es6新增

​ 若数组arr有三个数据,想要对其进行赋值,可以直接使用 let[a,b,c] = arr;就可以按顺序对其赋值

  1. 解构赋值中,等号左边格式必须与右边数组格式一样,才可以完全解构;格式不同的哪一个元素不可解构;如果左右数量不同,则依次解构

  2. 可以使用

    es6新增
    扩展运算符(…)打包剩余数据

    let [a,...b] = [1, 3, 5];那么b中将保存3和5两个数字,变为数组;但是扩展运算符只能写在最后一个数组元素之前

7.4 数组增删改查
  1. 将数组索引为为i的数据修改为m arr[i] = m;

  2. 从索引i开始的m个元素分别替换值 arr.splice( i, m, "数值1", "数值2")

  3. 在数组最后新增数据。let res = arr.push(“d”);res中将存储数组的长度,或直接arr.push(“d”);

  4. 在数组最后新增多条数据。arr.push("d", "e");

  5. 在数组最前面添加数据。let res = arr.unshift("m"); res中将存储数组的长度,或直接arr.unshift("m");

  6. 在数组前面添加多条数据。arr.unshift("m",”w“);

  7. 删除数组最后一条数据。let res = arr.pop();数组将删除最后一条数据,并将删除值返回,或直接arr.pop();

  8. 删除数组最前面一条数据。let res = arr.shift(); 数组将删除最前面一条数据,并将删除值返回,或直接arr.shift();

  9. 删除数组中索引为i的元素,以及其后的m个元素。arr.splice(i,m);

7.5 数组常用方法
  1. 清空数组。一,为数组赋值为空覆盖原来的数据arr = []; 二,将数组的长度改为0,arr.length = 0;三,使用splice删除元素,arr.splice(0, arr.length);

  2. 将数组转换为字符串。let str = arr.toString();

  3. 将数组转换为指定格式字符串。let str = arr.jion(); 如果使用let str = arr.jion(“任意符号”);这个符号就会代替元素之间的连接符号

  4. 数组拼接。如果使用("+")加号拼接数组,就会首先将数组全部转换为字符串,再拼接字符串。一,应使用arr1.concat(arr2);拼接两个数组形成新的数组,并且不改变原来的数组;二,let res = [...arr1, ...arr2];(推荐)扩展运算符在解构赋值中(等号的左边)表示将剩余的数据打包成一个新的数组,扩展运算符在等号右边,表示将数组中的所有数据揭开,放到所在位置

  5. 反转数组内容。arr.reverse();会修改原数组

  6. 截取数组中指定范围的内容。arr.slice(start,end);开始位置start,规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置;end可以不写,如果不写就会选取从开始往后的全部元素,且slice选到end的前一个元素。

  7. 查找元素在数组中的位置。let res = arr.indexOf(3); 会返回元素的位置,若有多个相同元素,会返回第一个元素的位置。如果没有找到指定的元素,就会返回-1。let res =indexOf(参数1,参数2); 参数1:需要查找的元素,参数2:开始查找的位置

arr.lastIndexOf();从后向前查找

  1. 判断数组中是否包含某个元素。一,通过indexOf和lastIndexOf的结果判断是否有这个元素;二,let res = arr.includes(8);包含返回true,不包含返回false;
7.6 二维数组
  1. 获取数组元素。数组名称[二维数组索引]:得到一个一维数组

数组名称[二维数组索引] [一维数组索引]:得到一位数组中的元素

  1. 存储数据。数组名称[二维数组索引] = 一维数组形式的新元素

数组名称[二维数组索引] [一维数组索引]:数值

8 函数

8.1 函数注意点
  1. 函数没有通过return返回值时,默认返回undefined

  2. 函数执行结束后会回到调用函数的地方

  3. renturn立刻结束函数并返回值,后面不可以写其他语句

  4. 当实参比函数声明指定的形参个数要少,剩下的形参都将设置为·undefined·值;当实参比形参个数要多时,剩下的实参没有办法直接获得,但会保存到·arguments·中

  5. 调用函数式实参的个数和形参的个数可以不相同,实参是调函数时传入的数据;

  6. 函数和数组一样是引用数据类型(对象类型),因此可以将函数保存到变量中,通过变量名称找到函数并执行。

8.2 函数arguments
  1. console.log();函数也是通过();来调用的,所以log也是一个函数

  2. log函数的特点 可以接收一个或多个参数,内部的实现原理使用到了甘薯arguments

  3. arguments作用:保存所有传递给函数的实参

  4. arguments实际上是一个伪数组

  5. 当需要传入多个实参时就不需要为每个实参设置不同的形参了

  6. 函数扩展运算符 在等号左边,将剩余的数据打包到一个新的数组中;(扩展运算符必须写在最后一个元素的前面)在等号右边,将数组中的数据解开;扩展运算符在函数形参列表中的作用,将传递给函数的所有实参打包到一个数组中(类似于arguments),function getSum(…value){}, 也必须写在最后一个元素的前面

  7. 函数形参默认值 es6之前,可以通过逻辑运算符给形参指定默认值,不赋值时,默认值为undefined;es6之后可以直接在函数中为形参指定默认值,function miao(a = “1”, b = “0”){};es6之后的形参默认值还可以从其他函数中获取,function miao(a = “1”, b = getSum() ){}。

  8. 函数可以作为参数和返回值 仅在js语言中,函数是可以嵌套定义的

8.3 匿名函数
  1. 匿名函数:没有名称的函数;
  2. 注意点:匿名函数不能之定义不使用
  3. 应用场景:作为其他函数的参数(作为参数传入其他函数中);作为其他函数的返回值;作为一个立即执行的函数;立即执行匿名函数,需要将匿名函数的定义用括号包裹起来,再后面加();即可
8.4 箭头函数
  1. es6新增,目的是简化定义函数的密码

  2. 注意点:箭头函数只有一个形参时,()可以省略;箭头函数封装部分只有一句代码,那么{}可以省略

8.5 递归函数
  1. 定义: 在函数中自己调用自己,在一定程度上可以实现循环功能
8.6 函数作用域
  1. 全局作用域;局部作用域;块级作用域

  2. 块级作用域和局部作用域之间的区别

    var 在块级作用域定义变量仍是全局变量; 在局部作用域定义变量是局部变量

    块级作用域和局部作用域中,省略变量前的var或let,变量将被认为是全局变量

8.7 作用域链
  1. 需要明确: ES6前定义变量使用var;ES6之前没有块级作用域;ES6之前函数大括号外的都是全局作用域;ES6之前函数大括号中的都是局部作用域;
  2. 需要明确:ES6后定义变量通过let;ES6新增块级作用域;
  3. ES6之前的作用域链: 全局作用域又称为0级作用域;定义函数开启的作用域就是1级/2级/3级/…作用域;js会将这些作用域连接在一起形成链条;除0级作用域外,当前作用域级别等于上一级+1
  4. ES6之后的作用域链: 全局作用域又称为0级作用域;定义函数或代码块开启的作用域就是1级/2级/3级/…作用域;js会将这些作用域连接在一起形成链条;除0级作用域外,当前作用域级别等于上一级+1
  5. 变量在作用域链中的查找规则:现在当前找,找到就是用档期啊作用域找到的;如果当前作用域中没有找到,就去上一级作用域中查找,直到0级作用域,找不到报错
8.8 函数预解析
  1. 定义:浏览器在执行js代码的时候会分成两部分操作,预解析以及朱行执行代码(浏览器不会直接执行代码,而是加工处理之后再执行,加工处理的过程就是预解析)
  2. 预解析规则:将变量声明和函数声明(在js中是整个函数)提升到当前作用域最前面,将剩余代码按照书写顺序依次放在后面,先执行变量提升再执行函数提升,如果函数和变量都是a,那么经过预解析后typeof(a)=function
  3. 注意点:通过let定义的变量不会被提升
  4. ES6之前预解析:变量声明和函数会被提升,如果函数被赋值给变量,那么只有变量会被预解析,函数不会;
  5. ES6之后预解析:使用let做变量声明和函数都不会被解析
  6. 注意点:在高级浏览器中,不会对{}进行预解析;如果函数名与变量名同名,那么函数优先级高于变量,首先被预解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值