Javascript总结
数组常用的方法
- push(): 添加到数组末尾,返回数组的最新长度
- unshift(): 在数组开头添加元素,返回新的数组长度
- splice(): 传入3个参数,分别是开始位置,要删除的元素数量,要插入的任意多个元素
- concat(): 元素添加到数组末尾,返回新的数组,不影响原数组
- pop(): 删除数组最后一项,返回被删除的项
- shift(): 删除数组的第一项,返回被删除的项
- slice(): 创建一个包含原数组中一个或多个元素的新数组,不影响原数组
- indexOf(): 返回要查找的元素在数组中的位置,没找到返回-1
- find(): 返回第一个匹配的元素
- reverse(): 将数组元素方向反转
- sort(): 接收一个比较函数,不传参数的话按ASCII排序
- join(): 接收一个参数,即字符串分隔符,返回包含所有项的字符串
- some(): 对数组每一项都运行传入的测试函数,如果至少有1个元素返回 true ,则这个方法返回 true
- every(): 对数组每一项都运行传入的测试函数,如果所有元素都返回 true ,则这个方法返回 true
- forEach(): 对数组每一项都运行传入的函数,没有返回值
- filter(): 对数组每一项都运行传入的函数,函数返回 true 的项会组成新数组之后返回
- map(): 对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的新数组
深拷贝和浅拷贝
- 基本数据类型保存在栈内存中 引用数据类型保存在堆内存中
- 浅拷贝:如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址
- Object.assign
- Array.prototype.slice()
- Array.prototype.concat()
- 使用扩展运算符实现复制
- 深拷贝:两个对象属性完全相同, 但是对应两个不同地址,修改一个对象的属性,不会改变另一个对象的属性
- _.cloneDeep()
- jquery.extend()
- JSON.parse(JSON.stringify(obj)): 弊端是会忽略undefined, symbol和函数
- 递归循坏
- 两者的区别:
- 浅拷贝是拷贝一层 属性为对象时,浅拷贝是复制,两个对象指向同一地址
- 深拷贝是递归拷贝深层次,属性为对象时, 深拷贝是新开栈,两个对象指向不同地
防抖和节流:本质是优化高频执行代码的一种手段
- 防抖(debounce):n秒后在执行该事件,若在n秒内被重复触发,则重新计时
- 节流(throttle): n秒内只运行一次,若在n秒内重复触发,只有一次生效
- 不同点:函数防抖关注一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次
- 防抖应用场景
- 搜索框搜索输入。只需用户最后一次输入完,再发送请求
- 手机号、邮箱验证输入检测
- 窗口大小resize 只需窗口调整完成后,计算窗口大小。防止重复渲染。
- 节流应用场景
- 滚动加载,加载更多或滚动到底部监听
- 搜索框,搜索联想功能
对事件循环的理解
- 实现单线程非阻塞的方法就是事件循环
- 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
- 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等
- 同步任务进入主线程,即主执行栈,异步任务进入任务队列,主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。
- 宏任务:执行一个宏任务,如果遇到微任务就将它放到微任务的事件队列中。当前宏任务执行完成后,会查看微任务的事件队列,然后将里面的所有微任务依次执行完
- 微任务:一个需要异步执行的函数,执行时机在主函数执行结束后,当前宏任务结束之前
- await 会阻塞下面的代码(即加入微任务队列)
本地存储方式有哪些
- cookie:数据大小不能超过4k, cookie过期事间前一直有效。标记用户和跟踪用户的行为等场景
- sessionStorage:数据在当前浏览器窗口关闭后自动删除,敏感账号一次性登录等场景
- localStorage:存储持久数据,浏览器关闭不会删除,除非手动删除,长期保存在本地的数据等场景
- indexedDB:富文本编辑器,存储大量数据等场景
webc常见的攻击方式
- XSS跨站脚本攻击:允许攻击者将恶意代码植入到提供给其它用户使用的页面中
- 在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等
- 不使用 v-html/dangerouslySetInnerHTML
- CSRF跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求
- SQL注入攻击:通过将恶意的 Sql查询或添加语句插入到应用的输入参数中,再在后台 Sql服务器上解析执行进行的攻击
闭包:闭包让你可以在一个内层函数中访问到其外层函数的作用域