3. 现代 javascript 数组专题 和 对象专题
数组专题
展开运算符
使用...符号, 可以将数组"展开".
数组展开的妙用 ...
eg:
// 代替apply
const foo = [1, 2, 3]
const bar = [4, 5, 6]
foo.push(...bar) // 相当于foo.push(4, 5, 6)
// 假数组转真数组
var nodeList = document.querySelectorAll('div')
var earlArray = [...nodeList]
// 代替concat等复杂操作, 构造数组
var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
find和findIndex
建议: 不要再使用for循环或者forEach或者filter去寻找数组中的某个元素!
要点:
findIndex和indexOf的区别
indexOf 只能传入数值
eg: 查找 数组内元素等于 2 的 索引
const arr = [1,2,3,4,5];
const ret = arr.indexOf(2);
findIndex 可以传入 表达式
eg: 查找第一个值大于 2 的元素的索引
const arr = [1,2,3,4,5];
const ret = arr.findIndex(el=>{el>2});
拓展:
map用来将一个数组映射为另一个数组
eg: 将数组内的 所有数值乘以 2
const arr = [1,2,3,4,5];
const arr2 = arr.map(el=>{return el * 2})
reduce用来通过某种运算归并数组元素
eg: 将数组内的 所有元素 相乘
const arr = [1,2,3,4,5];
const ret = arr.reduce((prev, el)=>{return el * prev}, 1)
filter用来过滤满足条件的数组元素
eg: 将数组内的 大于 2 的 元素 筛选出来
const arr = [1,2,3,4,5];
const arr2 = arr.filter(el=>{return el > 2})
some用来判断数组中有没有元素满足某种条件 (至少又一个 满足返回 true 不满足 返回 false)
eg: 判断 数组内 是否有一个元素 大于2
const arr = [1,2,3,4,5];
const ret = arr.some(el=>{return el > 2})
every用来判断数组中的元素是不是都满足某种条件 (全部都要满足 满足返回 true 不满足 返回 false)
eg: 判断 数组内 所有元素都 大于2
const arr = [1,2,3,4,5];
const ret = arr.every(el=>{return el > 2})
forEach用来做遍历(除非你用forEach写出的代码更短, 否则不要用)
find和findIndex用来寻找符合条件的元素
eg: 查找大于5的 元素 的 值 和索引
const arr = [2,4,6,8,10];
const value = arr.find(el=>{ return el > 5 }); // 查找第一个大于五的值
const index = arr.findIndex(el=>{ return el > 5 }); // 查找第一个大于五的索引
includes
includes用来判断数组中是不是包含某个值
要点
includes和indexOf的区别
includes 返回 true or false
indexOf 返回 找到 则返回索引 找不到则返回 -1
eg: 判断是否不包含 2
const arr = [1,2,3,4,5];
const ret1 = !arr.includes(2);
const ret2 = (arr.indexOf(2) === -1);
函数专题
展开运算符 ...
参数展开
// 代替 argument
function fn(...params){ console.log(...params) }
// 代替剩余参数
function fn (a, b, ...otherParams){ console.log( otherParams ) }
参数默认值
function fn(p1 = 'something'){
// ...
}
箭头函数
匿名函数
const fn = function(n){ return n * 2 }
箭头函数 用箭头函数代替了关键字 function 并自动添加关键字return
const fn2 = (n) => n * 2
const fn2 = (n) => { return n * 2 }
要点
箭头函数对于 this 指针的规定
eg:
function fn( n ){ return n * this.m }
const obj = { m:3 }
fn.call( obj, 3 ); //使用 call 指定函数中的 this 指向( 现在 this 为 obj )
eg:
const obj = { m:3, multiple(n){ return this.m * n } }
obj.m = 4
console.log( obj.multiple(2) ) // 可以将变化的东西存储在对象内
匿名函数尽量使用箭头函数性质定义
匿名函数内的 this 直接指向 外部 this 如果定义在 类 里 就指向这个类
没有定义在 类里面 将会 指向 window
bind(学名:柯里化 curry)
bind 是 给函数绑定 this 指针 和 参数的方法
eg:
function fn(){ console.log(this.text) }
fn(); //会报错 因为 this 指向的是 undefined
// es5 内
fn.call({ text : 1 }); // 传入 this 对象 为 { text : 1 } call 传递参数 使用 fn.call(obj,p1,p2,p3)
fn.apply({ text : 1 }); // 传入 this 对象 为 { text : 1 } apply 传递参数 使用 fn.apply(obj, [p1,p2,p3])
// es6
// 绑定 方法的 this 对象 绑定函数内部的对象 (作用域访问不到)
function main(){
const obj = { text:1 }
function fn( n ){ console.log( this.text * n ) }
return fn.bind(obj, 10) // fn 绑定 内部 fn 对象 并 传入 n 的值为 10
}
const f = main();
f(); // 参数也可以从这里传入 但是 bind 的第二个参数不能 传入
扩展
javascript 中的 this 指针
使用 apply / call / bind 进行绑定
apply / call / bind 的 作用分别是什么
都是绑定对象
call 传递参数 使用 fn.call(obj,p1,p2,p3) //call 之后直接调用方法 fn.call(obj,p1,p2,p3)
apply 传递参数 使用 fn.apply(obj, [p1,p2,p3]) //apply 之后直接调用方法 fn.apply(obj, [p1,p2,p3])
bind 传递参数 和 call 一样 fn.bind(obj,p1,p2,p3) // bind 之后 需要手动调用方法 fn.bind(obj,p1,p2,p3)()
3. 现代 javascript 数组专题 和 对象专题的更多相关文章
- JavaScript数组为什么是对象
有过PHP编程经验的程序员学习JavaScript的时候,会发现数组也是对象,这和PHP是不同的,在PHP中数组就是数组类型,并不是是对象.究竟为什么在JavaScript中数组会是对象呢? var ...
- 2. 现代 javascript 新语法 及 对象专题
let , const 和 var javascript 里面的作用域 一个大括号 是一个作用域 { } var 会 在局部作用定义 被定义时 会提升作用域 如 if 的 {} 就属于 局部作用域 ...
- JavaScript 数组去重和对象相等判断
前几天电话面试问到了数组去重和两个对象相等判断,当时回答的不是特别好,都过去好几天了,总结下. 1.数组去重 当时的问题是这样的有个简单的数组[1,1,2,3],去重后的结果是[1,2,3],怎么实现 ...
- Vue指令v-for之遍历输出JavaScript数组,json对象的几种方式
定义数据: <script> new Vue({ el:"#test", data:{ message:"infor", list:["a ...
- 07JavaScript数组与字符串对象
JavaScript数组与字符串对象 5.1.1数组(Array)对象 <script> //声明一个数组并赋值; var arr = new Array("aa",& ...
- 了解Javascript中函数作为对象的魅力
前言 Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性,可以有方法, 可以享有所有对象所拥有的特性.并且最重 ...
- javascript里面的数组,json对象,动态添加,修改,删除示例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- javascript数组对象排序
javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...
- JavaScript 数组对象的去重
JavaScript数组去重 1.原型去重法.通过prototype找到数组的源性对象Array,在数组的原型上添加unique()方法.需要使用的时候使用 点 " . " 进行连 ...
随机推荐
- Sublime和Python中文编码的一些问题
Windows下的控制台中,应该是这样的逻辑: 1.如果是Unicode字符串的话,首先根据控制台编码进行转换 2.之后进行输出 所以在Windows控制台下,假设str = u'中文', 1.直接p ...
- ExcelPackage导入导出,命名空间一定要是EPPlus
1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...
- BZOJ 2744
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #incl ...
- React 学习笔记(3) B站视频总结1
视频地址 项目基础 react-cli // 项目结构 src │ App.js # 应用根组件 │ index.js # 入口js ├─api ├─assets ├─components ├─con ...
- 第七篇 Django-认证系统
Django-认证系统 阅读目录(Content) 1 Cookie 与 Session 概念 查看cookie 登陆应用 Django中操作Cookie 1.获取Cookie 2.设置Cookie ...
- python_re正则表达
re模块就本质而言,正则表达式(或RE)是一种小型的.高度专业化的编程语言,(在python中)它内嵌在Python中,并通过re模块实现,正则表达式模块被编译成一系列的字节码,然后由用C编写的匹配引 ...
- 51nod 1022 石子归并 环形+四边形优化
1022 石子归并 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 N堆石子摆成一个环.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 ...
- 原生js完成打地鼠小游戏
:这是首页,有简单模式和地狱模式两种模式进行选择 这是选择完模式之后的游戏界面:30秒一局游戏倒计时,每打中一只老鼠加一分,没砸中减一分,没砸不加不减 首先准备几张图片 html代码: <!-- ...
- redis主要配置项
目录 redisd配置 redis主要配置项 这里就列举两例示例,之后的实验会有详细的示例!! redisd配置 redis主要配置项 bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听I ...
- x++ 与 ++x的区别
相信在很多编程语言中都会遇见这个问题,这对于刚入编程的人来说可能是相当懵逼了. 老师的官方说法是:操作符在前面先进行自身运算,再进行其他运算:操作符在后面,先进行其他运算再进行自身运算. 反正我这段话 ...