目录
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
函数剩余参数(arguments 可以输出函数接受的所有实参,是一个类数组)
假设确定第一个传参是1 但是不确定后面需要传的参数,单独获取第一个参数,后面的参数用剩余参数去获取
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
let 和 var 都是用来声明变量,但是 let 命令只在所在的代码块里有效
- {
- var a = 10
- let b = 5
-
- console.log(a);//10
- console.log(b);//5
- }
- console.log(a);//10
- console.log(b);//undefined
ES5 只有 全局作用域 和 函数作用域,没有 块级作用域
会 内层变量可能会覆盖外层变量
计数的循环变量泄露为全局变量
ES6 标准中,由一对大括号包裹形成的作用域就是块级作用域
- function f1() {
- let n = 5;
- if (true) {
- let n = 10;
- }
- console.log(n); // 5
- }
- 表示外层代码不受内层代码块的影响,如果 使用的 var ,最后输出的值是 10
- function f1() {
- let n = 5;
- if (true) {
- var n = 10;
- }
- console.log(n); // 10
- }
-
不允许在相同作用域内重复声明
let 不允许在相同作用域内,重复声明同一个变量
- //报错
- function func() {
- let a = 10;
- var a = 1;
- }
- //报错
- function func() {
- let a = 10;
- let a = 1;
- }
- 不能在函数内部重新声明参数
不存在变量提升
var 命令会发生 “变量提升” 现象,即变量可以在声明之前使用,值为 undefined
- // var 的情况
- console.log(foo); // 输出undefined
- var foo = 2;
- //脚本开始运行时,foo 就已经存在,只不过是没有值而已
-
- // let 的情况
- console.log(bar); // 报错ReferenceError
- let bar = 2;
- //变量 bar 用 let 声明,就不会发生变量提升,所以 在脚本运行前 bar 是不存在的,所有抛出了一个错误
暂时性死区(tempoal dead zone 简称 TDZ)
只要块级作用域内存在 let 命令,它所声明的变量就 “绑定” 这个区域,不在受外部影响
- var tmp = 123;//存在了 全局变量 tmp
-
- if (true) {
- tmp = 'abc';
- let tmp;// 在块级作用域内 let 又声明一个局部变量 tmp
- }
- //导致后者绑定了这个 块级作用域,所以在 let 声明变量前,对 tmp 赋值都会报错
-
- if (true) {
- // TDZ开始
- tmp = 'abc'; // ReferenceError
- console.log(tmp); // ReferenceError
- let tmp; // TDZ结束 在 let 声明变量前都属于 tmp 的 “死区”
- console.log(tmp); // undefined
- tmp = 123;
- console.log(tmp); // 123
- }
其他的死区
- function bar(x = y, y = 2) {
- return [x, y];
- }
- bar(); // 报错
- //参数x 默认值等于另一个参数 y ,此时y 还没有声明,属于 “死区”
-
- ///
-
- function bar(x = 2, y = x) {
- return [x, y];
- }
- bar(); // [2, 2]
-
- ///
-
-
- // 不报错
- var x = x;
-
-
- // 报错
- let x = x;
- // ReferenceError: x is not defined
-
const 声明 一个只读的常量,一旦声明,常量的值不能改变
- const PI = 3.1415;
- console.log(PI); // 3.1415
-
-
- PI = 3;
- // TypeError: Assignment to constant variable.
const 一旦声明变量,就必须立即初始化,不能留到以后赋值,就会报错(只声明不赋值,就会报错)
- const foo;
- // SyntaxError: Missing initializer in const declaration
const 的作用域与let命令相同:只在声明所在的块级作用域内有效
- if (true) {
- const MAX = 5;
- console.log(MAX);// 5
- }
-
-
- Console.log(MAX); // Uncaught ReferenceError: MAX is not defined
-
const 命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用
- if (true) {
- console.log(MAX); // ReferenceError
- const MAX = 5;
- }
const 声明的常量,也和 let 一样不可重复声明
- // 以下两行都会报错
- const message = "Goodbye!";
- const age = 30;
const 保证是变量指向的那个内存地址所保存的数据不得改动
- const foo = {};//foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,不能把 foo 指向另一个地址,对象本身是可变的,所以可以添加新的属性
-
-
- // 为 foo 添加一个属性,可以成功
- foo.prop = 123;
- foo.prop // 123
-
-
- // 将 foo 指向另一个对象,就会报错
- foo = {}; // TypeError: "foo" is read-only
-
- //对象本身是可变的
- const a = [];
- a.push('Hello'); // 可执行
- a.length = 0; // 可执行
- a = ['Dave']; // 报错
冻结 对象 使用 Object.freeze方法
- const foo = Object.freeze({});
-
-
- // 常规模式时,下面一行不起作用;
- // 严格模式时,该行会报错
- foo.prop = 123;
除了将对象本身冻结,对象的属性也可以冻结。下面是一个将对象彻底冻结的函数。
- var constantize = (obj) => {
- Object.freeze(obj);
- Object.keys(obj).forEach( (key, i) => {
- if ( typeof obj[key] === 'object' ) {
- constantize( obj[key] );
- }
- });
- };
题目一:
下面不属于关键字let的特点的是:( B )
A.只在 let 命令所在的代码块内有效
B.会产生变量提升现象
C.同一个作用域,不能重复声明同一个变量
D.不能在函数内部重新声明参数
题目二:
关于关键字const,下列说法错误的是:( D )
A.用于声明常量,声明后不可修改
B.不会发生变量提升现象
C.不能重复声明同一个变量
D.可以先声明,不赋值。
题目三:
写出下面两段代码运行结果:
for(var i=0; i<3; i++){
console.log(i);
}
console.log(i);
运行结果?
i = 3
for(let j=0; j<3; j++){
console.log(j);
}
console.log(j);
运行结果?
undefined
题目四:
1. {
2. const person = {name:"小明",gender:"男"};
3. person.name = "张三";
4. person.age = "18";
5. person = {name:"小明",gender:"男",age:"18"}
6. }
语句3能否执行 能
语句4能否执行 能
语句5能否执行 不能
以前 输出对象 (冗余)
- //对象中有 三个属性
- const obj = {
- nickname:'大帅哥',
- age:22,
- gender:'男'
- }
- //定义三个变量 接受 三个属性
- const nickname = obj.nickname
- const age = obj.age
- const gender = obj.gender
- //依次输出 名称 年龄 性别
- console.log (nickname,age,gender)
ES6
- const obj = {
- nickname:'大帅哥',
- age:22,
- gender:'男'
- }
- const{ nickname ,age , gender) = obj
- //依次输出 名称 年龄 性别
- console.log (nickname, age, gender)//大帅哥 22 男
- const obj = {
- nickname:'大帅哥',
- age:22,
- gender:'男',
- doing:{
- morning:'play',
- evening:'sleep'
- }
- const { nickname:myname ,doing {morining} }= obj
- //定义的nickname已经不存在了,被 myname替代了
- console.log(myname ,doing)//大帅哥 play
- const arr = [1,2,3]
- const [a,b,c] = arr
- console.log(a, b, c)// 1 2 3
- const arr = [1,2,3]
- const {1:a,2:b,0:c} = arr
- console.log(a, b, c)// 2 3 1
三种:pending(等待) fulfilled(成功) rejected(失败)
从等待 变成 成功 或者是 等待 变成 失败(状态改变后,状态不可逆,状态不可以进行第二次改变)
- coust p = new Promise ((resolve,reject) = > {
- //ressolve(1) // 1
- //reject(1) //<rejected>1
- //throw 1 //<rejected>1
- })
- cousole.log(p)
- new Promise ((resolve,reject) =>{
- // resolve(100) // 成功 100 222
- // reject(1111) // 失败 1111 222
- // throw 111
- }).then (res = >console.log('成功',res)}
- .catch(err = >console.log('失败',err)}
- .finally(() = > console.log(222)
- new Promise ((resolve,reject) =>{
- // resolve(100) // 第二个then 900
- // reject(1) // catch <reject>1
- // throw 111
- }).then (res = > new Promise((resolve, reject) = > reject(800 + res)
- .then(err = >console.log('第二个then',res)}
- .catch(err = >console.log('catch',err)}
all 方法传入数组,返回一个对象
- const createPromise = (delay,flag = true) =>{
- return new Promise((resolve, reject) = >{
- setTimeout(() = >{
- flag ? resolve (‘成功${dalay}’):rejevt(‘失败${delay}’)},delay)
- })
- }
-
- //all
- Promise.all ([createPromise(1000),createPromise(1500),createPromise(2000)
- .then(res = > console.log('成功',res))
- .then(err = > console.log('失败',err))
- // 成功 ['成功1000','成功1500','成功2000']
-
- Promise.all ([createPromise(1000),createPromise(1500,false),createPromise(2000)
- .then(res = > console.log('成功',res))
- .then(err = > console.log('失败',err))
- // 失败 失败1500
-
- //race
- //输出第一个执行完的(无论成功还是失败)
- Promise.race ([createPromise(2000),createPromise(1500),createPromise(1000)
- .then(res = > console.log('成功',res))
- .then(err = > console.log('失败',err))
- // 成功 成功1000
-
- Promise.race ([createPromise(2000),createPromise(1500),createPromise(1000,false)
- .then(res = > console.log('成功',res))
- .then(err = > console.log('失败',err))
- // 失败 失败1000
-
保证了用同步的方式 执行异步操作 实现了排队的效果
默认是返回一个 Promise ,Promise 值就是这个函数的return
- const requestLogin = (params) = >{
- return new Promise (resolve => {
- resolve(‘${params.username}很帅’)
- })
- }
- const requestUserInfo = (params) = >{
- return new Promise (resolve => {
- resolve(‘${params},也很高’)
- })
- }
- const handleLogin = async () = > {
- const res = await requestLogin({
- username:'大帅哥',
- password:'123456'
- })
- const info = await requestUserInfo(res)
- console.log(info)
- }
- // 大帅哥很帅,也很高
foreach()方法用于遍历数组,调用数组的每个元素,并将元素传递给回调函数进行处理
语法:array.forEach(function(currentValue,index,arr),thisValue)
参数:
function(currentValue,index,arr) 数组中每个元素需要调用的函数,必需
currentValue:当前元素,必需
index:当前元素的索引值,可选
arr:当前元素所属的数组对象,可选
thisValue 传递给函数的值,用作"this"的值,可选
如果这个参数为空,"this"值为"undefined"
在数组的原始长度以外添加元素 (元素否传递给回调函数)
- var words = [1, 2, 3, 4];
- var sum=0;
- words.forEach(function(word) {
- sum+=word;
- if(word == 2){
- words.push(5);
- }
- });
- console.log(sum);// 10
- console.log(words);// [1,2,3,4,5]
添加元素以填充数组中缺少的元素(是,如果该索引尚未传递给回调函数)
- var words = ["one", ,"three", "four"];
- words.forEach(function(word,index) {
- console.log(word);
- if (word === "one") {
- words[index+1] = "two";
- }
- });
- console.log(words);//['one','two','three','four']
从数组中删除元素(否,除非该元素已传递给回调函数)
- var words = ["one", "two", "three", "four"];
- words.forEach(function(word) {
- console.log(word);
- if (word === "two") {
- words.pop();
- }
- });
- console.log(words);//['one','two','three']
ES6的 forEach 循环只能通过 return 中断档次循环
- let data = [1,2,3,4,5,6]
- data.forEach((val,index,arr)=>{
- console.log("当前第"+(index+1)+"次循环开始");
- if(val>3){
- return ;
- }
- console.log('val', val);
- });
- // 当前第1次循环开始
- // var 1
- // 当前第2次循环开始
- // var 2
- // 当前第3次循环开始
- // var 3
- // 当前第4次循环开始
- // 当前第5次循环开始
- // 当前第6次循环开始
forEach只能通过抛异常的方式终止循环
- let arr = [0, 1, "stop", 3, 4];
- try {
- arr.forEach(element => {
- if (element === "stop") {
- throw new Error("forEachBreak");
- }
- console.log(element); // 输出 0 1 后面不输出
- });
- } catch (e) {
- console.log(e.message); // forEachBreak
- };
- // 0
- // 1
- // forEachBreak
当遇到需要终止循环的时候,forEach不再合适。
改写用 foreach
var arr = [1,2,3,4];
for(let i=0; i
console.log(arr[i]);}
------------------------------------>
var arr = [1,2,3,4];
arr.forEach(function(item){
console.log(item-1);
});
- // for in
- const arr =[3,2,1]
- for (let index in arr) {
- console.log(index) // 0 1 2
- // index 遍历的是数组的索引值
-
- // 只需要通过索引值的下标就能得到值
- console.log(arr[index]) // 3 2 1
- }
-
-
- //对象
- const obj = {
- name:'大帅哥',
- age:22,
- gender:'男'
- }
- for (let key in obj){
- console.log(key) // name age gender
-
- console.log(obj[key]) // 大帅哥 22 男
- }
- // for of
- const arr = [3, 2 ,1]
- for (let value of arr) {
- console.log(value) // 3 2 1
- }
-
-
- // 对象
- const obj = {
- name:'大帅哥',
- age:18,
- gender:'男'
- }
- for(let value of obj){
- console.log(value)// obj is not iterable
- }
let of 只能遍历出可迭代对象
对象不是可迭代对象
可迭代对象:数组 、set 、map
对象变成可迭代对象可以参考相关视频:es6:如何将一个普通对象转化为可迭代的对象_嘫颜的博客-CSDN博客
使用 Object.values 就能够把一个对象里所有属性的值 变成 数组
- const obj = {
- name: '大帅哥',
- age: 22,
- hobby:'篮球'
- }
- const values = Object.values(obj)
- console.log(values) // ['大帅哥',22,'篮球']
- // 使用 Object.values 就能够把一个对象里所有属性的值 变成 数组
- // 3 * 3
-
- const num = 3 * 3
- console.log(num) // 9
-
-
- // 3 * 3 *3
-
- const num = 3 * 3 *3
- console.log(num) // 27
-
-
- const num = Math.pow(3,3)
- console.log(num) // 27
-
- //ES6
- const num = 3 ** 3
- console.log(num) // 27
这个方法既可以被字符串使用也可以被数组使用,作用是传入一个元素,并且判断调用者身上有没有这个元素,如果拥有就返回一个ture ,不拥有的话就返回 false
- //ES6
-
- //字符串
- const str = '大帅哥'
-
- const bol1 = str.includes('大')
- const bol2 = str.includes('小')
-
- console.log(bol1)// true
- console.log(bol2)// false
-
-
- //数组
- const arr = [1, 2, 3]
-
- const bol1 = arr.includes(3)
- const bol2 = arr.includes(6)
-
- console.log(bol1)// true
- console.log(bol2)// false
-
-
-
- //indexOf 旧语法
-
- //找到匹配的就返回索引值,没有找到就返回 -1
-
- const arr = [1, 2, 3]
-
- const index1 = arr.indexOf(3)
- const index2 = arr.indexOf(5)
-
- console.log(index1)// 2
- console.log(index2)// -1
-
-
indexOf (旧版本)和 includes (新版本)的区别
includes 能检测出数组里面有没有 NaN(Not a Number)
- const arr = [1, 2, 3, NaN]
-
- const index = arr.indexOf(NaN)
- console.log(index) // -1
-
- const bol = arr.includes(NaN)
- console.log(bol) // ture
- const fn = ( name, age, hobby) => {
- return {
- name:name,
- age:age,
- hobby:hobby
- }
- }
- console.log(fn{'大帅哥','18','篮球'}) //{name:'大帅哥',age:'18',hobby:'篮球'}
-
- //箭头函数简写
- const fn = (name, age, hobby) => ({
- name: name,
- age: age,
- hobby: hobby
- })
- console.log(fn{'大帅哥','18','篮球'}) //{name:'大帅哥',age:'18',hobby:'篮球'}
-
-
- //ES6
- const fn = (name, age, hobby) => ({
- name,
- age,
- hobby
- })
- console.log(fn{'大帅哥','18','篮球'}) //{name:'大帅哥',age:'18',hobby:'篮球'}
- const set = new Set()
- set.add(1)
- set.add(2)
- console.log(set) //Set{ 1, 2 }
-
-
- const set = new Set([1, 2])
- console.log(set) //Set{ 1, 2 }
-
- set.add(3)
- console.log(set) //Set{ 1, 2, 3 }
-
- const set = new Set([1, 2])
- console.log(set.has(1)) // true
- console.log(set.has(5)) // false
- const set = new Set([1, 2, 3])
- console.log(set.size) //3
- const set = new Set([1, 2, 3])
- set.delete(1)
- console.log(set)//Set{1, 2}
- const set = new Set([1, 2, 3])
- console.log([...set]) // [1, 2, 3]
-
- console.log(Array.from(set)) // [1, 2, 3]
- const arr1 = [1, 2, 1, 2, 3]
- console.log([...new Set(arr1)]) // [1, 2, 3]
-
- //不会去重{}
- const arr2 = [1, {}, {}, 3]
- console.log([...new Set(arr2)]) // [1, {}, {}, 3]
-
- //NaN 本身不等于本身,但是Set会把它去重
- const arr2 = [1, NaN, NaN, 3]
- console.log([...new Set(arr2)]) // [1, NaN, 3]
- const map = new Map()
- map.set('帅哥',18)
- map.set(true,985)
- map.set(185,'帅哥')
- console.log(map) //Map{'帅哥' => 12,ture => 985,185 => '帅哥'}
-
- const map = new Map ([['帅哥',18],[true,985],[185,'帅哥']])
- console.log(map) //Map{'帅哥' => 12,ture => 985,185 => '帅哥'}
- const map = new Map ([['帅哥',18],[true,985],[185,'帅哥']])
-
- console.log(map.has('帅哥')) // true
-
- console.log(map.has(123)) // false
- const map = new Map ([['帅哥',18],[true,985],[185,'帅哥']])
-
- console.log(map.get('帅哥')) // 18
-
- console.log(map.get(123)) // undefined
- const map = new Map ([['帅哥',18],[true,985],[185,'帅哥']])
-
- map.delete(true)
-
- console.log(map)// Map {'帅哥' => 18 , 185 =>'帅哥'}
- //拼接字符串
-
- const nickname = '大帅哥'
- const age = 22
- const gender = '男'
-
- function getHobby(){
- return '篮球'
- }
- const myself = nickname + '今年' + age + '岁了,他是个' + gender + '人,喜欢' + getHobby()
- console.log(myself)
- //大帅哥今年22岁了,他是个男人,喜欢篮球
-
-
- //ES6
- const myself = `${nickname}今年${age}岁了,他是个${gender === '男' ? '大帅哥' : '小姐姐'},喜欢${getHobby()}`
- console.log(myself)
- //大帅哥今年22岁了,他是个大帅哥,喜欢篮球
- function fn (num1, num2) {
- console.log(num1, num2) //1 2
- }
- fn(1, 2)
-
-
- function fn (num1, num2, num3, num4)) {
- console.log(num1, num2, num3, num4) //1 2 3 4
- }
- fn(1, 2, 3, 4)
-
- //arguments 可以输出函数接受的所有实参,是一个类数组
- function fn () {
- console.log(arguments) //[Arguments] {'0': 1, '1': 2, '2': 3, '3': 4}
- }
- fn(1, 2, 3, 4)
-
-
- function fn () {
- console.log([...arguments]) // [1, 2, 3, 4]
- }
- fn(1, 2, 3, 4)
- function fn (...args) {
- console.log([args]) // [1, 2, 3, 4]
- }
- fn(1, 2, 3, 4)
- function fn (num, ...args) {
- console.log(num) // 1
- console.log([args]) // [2, 3, 4]
- }
- fn(1, 2, 3, 4)
-
- function fn (num1, num2, ...args) {
- console.log(num1, num2) // 1, 2
- console.log([args]) // [3, 4]
- }
- fn(1, 2, 3, 4)
- const [a, ...arr] = [1, 2, 3]
- console.log(a) //1
- console.log(arr) //[2, 3]
- }
- const {nickname, ...obj} = {nickname: '大帅哥', age:22, gender: '男'}
- console.log(nickname) // 大帅哥
- console.log(obj) // {age: 22, gender: '男'}
深拷贝和浅拷贝的区别:
浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间
深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针。
- const arr1 = [1, 2, 3]
- const arr2 = [...arr1]
- console.log(arr2) // [1, 2, 3]
- console.log(arr2 === arr1)// false
-
- //对象
- const obj1 ={name:'大帅哥'}
- const obj2 = {...obj}
- console.log(obj2) //{name:'大帅哥'}
- console.log(obj2 === obj1)//false
- const arr1 = [1, 2, 3]
- const arr2 = [4, 5, 6]
- const res1 = arr1.concat(arr2)
- console.log(res1) // [1, 2, 3, 4, 5, 6]
- const res2 = [...arr1, ...arr2]
- console.log(res2) // [1, 2, 3, 4, 5, 6]
- const obj1 = {name: '大帅哥'}
- const obj2 = {age: 22}
- const res = Object.assign(obj1, obj2)
- console.log(res) // {name: '大帅哥', age: 22}
-
- const res = {...obj1, ...obj2}
- console.log(res) // {name: '大帅哥', age: 22}
- function showMe1 (name,age){
- console.log(name, age) // undefined undefined
- }
- showMe()
-
- //不传参默认值
- function showMe2 (name,age){
- name = name || '大帅哥'
- age = age || 22
- console.log(name, age) // 大帅哥 22
- }
- showMe()
-
- //传参
- function showMe2 (name,age){
- name = name || '大帅哥'
- age = age || 22
- console.log(name, age)
- }
- showMe('帅哥',22) // 帅哥 22
- //不传参默认值
- function showMe2 (name = '大帅哥' ,age = 22){
- console.log(name, age) // 大帅哥 22
- }
- showMe()
-
-
- //传参
- function showMe2 (name = '大帅哥' ,age = 22){
- console.log(name, age)
- }
- showMe('帅哥', 20) //帅哥 20
可选链可以用在数组、对象、函数身上
数组
- const list = null
- if(list && list.length){
-
- } //list 不存在 返回 undefined
-
- //等于
-
- if(list?.length){
-
- } //list 不存在 返回假
-
- const first =list && list[0] //如果list 存在就会 获取list第一项
-
- const first = list?.[0] 如果list 存在就会 获取list第一项,会判断可选链?.前面的list是否存在
对象
- const obj ={
-
- cat:{
- name:'喵喵'
- }
- }
- const dog = obj && obj.dog && obj.dog.name
-
- const dog = obj?.dog?.name //存在就继续往下找
函数
- const fn = null
-
- fn && fn()
-
- fn?.()
- //前面为假输出后面
- const a = 0 || '大帅哥' //大帅哥
- const b = '' || '大帅哥' //大帅哥
- const c = false || '大帅哥' //大帅哥
- const d = undefined || '大帅哥' //大帅哥
- const e = null || '大帅哥' //大帅哥
-
- //空位合并运算符,只会把undefined 和 null 当成假值
- const a = 0 || '大帅哥' //0
- const b = '' || '大帅哥' //''
- const c = false || '大帅哥' //false
- const d = undefined || '大帅哥' //大帅哥
- const e = null || '大帅哥' //大帅哥
- //返回索引值
- const findArr = [
- {name:'大帅哥', age:20},
- {name:'帅哥', age:19},
- {name:'哥', age:18}
- ]
- // findIndex
- const index = findArr.findIndex((item) => {
- return item.name === '大帅哥'
- })
- console.log(index) //1
-
- //缩写
- const index = findArr.findIndex(item => item.name === '大帅哥')
- console.log(index) //1
-
- //解构赋值
- const index = findArr.findIndex(({name}) => name === '大帅哥')
- console.log(index) //1
- //返回 这一项
- const findArr = [
- {name:'大帅哥', age:20},
- {name:'帅哥', age:19},
- {name:'哥', age:18}
- ]
- const dashuaige = findArr.find(({ name}) => name === '大帅哥')
- console.log(dashuaige) // {name:'大帅哥', age:20},
作用跟for循环差不多
return 和 break 跳不出循环
用 try catch 跳出循环
- const arr = [1, 2, 3, 1, 2, 9, 8]
- arr.forEach((item, index, arr) =>{
- console.log(item, index, arr) //[1, 2, 3, 1, 2, 9, 8]
- })
修改数组的每一项,返回新数组,并且不影响原数组
- const arr = [1, 2, 3, 1, 2, 9, 8]
- const newArr = arr.map(item => item *2)
- console.log(newArr) //[2, 4, 6, 2, 4, 18, 16]
- console.log(arr) //[1, 2, 3, 1, 2, 9, 8]
过滤的意思,将原数组过滤自己想要的元素到新数组里面,并且不会影响新数组
- const arr = [1, 2, 3, 1, 2, 9, 8]
- const newArr = arr.filter(item => item >=3)
- console.log(newArr) //[3, 9, 8]
- console.log(arr) //[1, 2, 3, 1, 2, 9, 8]
只要数组中一个元素 大于等于自己想要的值就返回 true
- const flag = [1, 2, 3, 1, 2, 9, 8]
- const newArr = arr.some(item => item >=3)
- console.log(flag) //true
- console.log(arr) //[1, 2, 3, 1, 2, 9, 8]
只要数组中所有元素 大于等于自己想要的值才返回 true
- const flag = [1, 2, 3, 1, 2, 9, 8]
- const newArr = arr.every(item => item >=3)
- console.log(flag) //false
- console.log(arr) //[1, 2, 3, 1, 2, 9, 8]