Javascript总结

34 阅读5分钟

数组常用的方法

  1. push(): 添加到数组末尾,返回数组的最新长度
  2. unshift(): 在数组开头添加元素,返回新的数组长度
  3. splice(): 传入3个参数,分别是开始位置,要删除的元素数量,要插入的任意多个元素
  4. concat(): 元素添加到数组末尾,返回新的数组,不影响原数组
  5. pop(): 删除数组最后一项,返回被删除的项
  6. shift(): 删除数组的第一项,返回被删除的项
  7. slice(): 创建一个包含原数组中一个或多个元素的新数组,不影响原数组
  8. indexOf(): 返回要查找的元素在数组中的位置,没找到返回-1
  9. find(): 返回第一个匹配的元素
  10. reverse(): 将数组元素方向反转
  11. sort(): 接收一个比较函数,不传参数的话按ASCII排序
  12. join(): 接收一个参数,即字符串分隔符,返回包含所有项的字符串
  13. some(): 对数组每一项都运行传入的测试函数,如果至少有1个元素返回 true ,则这个方法返回 true
  14. every(): 对数组每一项都运行传入的测试函数,如果所有元素都返回 true ,则这个方法返回 true
  15. forEach(): 对数组每一项都运行传入的函数,没有返回值
  16. filter(): 对数组每一项都运行传入的函数,函数返回 true 的项会组成新数组之后返回
  17. map(): 对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的新数组

深拷贝和浅拷贝

  1. 基本数据类型保存在栈内存中 引用数据类型保存在堆内存中
  2. 浅拷贝:如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址
    • Object.assign
    • Array.prototype.slice()
    • Array.prototype.concat()
    • 使用扩展运算符实现复制
  3. 深拷贝:两个对象属性完全相同, 但是对应两个不同地址,修改一个对象的属性,不会改变另一个对象的属性
    • _.cloneDeep()
    • jquery.extend()
    • JSON.parse(JSON.stringify(obj)): 弊端是会忽略undefined, symbol和函数
    • 递归循坏
  4. 两者的区别:
    • 浅拷贝是拷贝一层 属性为对象时,浅拷贝是复制,两个对象指向同一地址
    • 深拷贝是递归拷贝深层次,属性为对象时, 深拷贝是新开栈,两个对象指向不同地

防抖和节流:本质是优化高频执行代码的一种手段

  1. 防抖(debounce):n秒后在执行该事件,若在n秒内被重复触发,则重新计时
  2. 节流(throttle): n秒内只运行一次,若在n秒内重复触发,只有一次生效
  3. 不同点:函数防抖关注一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次
  4. 防抖应用场景
    • 搜索框搜索输入。只需用户最后一次输入完,再发送请求
    • 手机号、邮箱验证输入检测
    • 窗口大小resize 只需窗口调整完成后,计算窗口大小。防止重复渲染。
  5. 节流应用场景
    • 滚动加载,加载更多或滚动到底部监听
    • 搜索框,搜索联想功能

对事件循环的理解

  1. 实现单线程非阻塞的方法就是事件循环
  2. 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  3. 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等
  4. 同步任务进入主线程,即主执行栈,异步任务进入任务队列,主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。
  5. 宏任务:执行一个宏任务,如果遇到微任务就将它放到微任务的事件队列中。当前宏任务执行完成后,会查看微任务的事件队列,然后将里面的所有微任务依次执行完
  6. 微任务:一个需要异步执行的函数,执行时机在主函数执行结束后,当前宏任务结束之前
  7. await 会阻塞下面的代码(即加入微任务队列)

本地存储方式有哪些

  1. cookie:数据大小不能超过4k, cookie过期事间前一直有效。标记用户和跟踪用户的行为等场景
  2. sessionStorage:数据在当前浏览器窗口关闭后自动删除,敏感账号一次性登录等场景
  3. localStorage:存储持久数据,浏览器关闭不会删除,除非手动删除,长期保存在本地的数据等场景
  4. indexedDB:富文本编辑器,存储大量数据等场景

webc常见的攻击方式

  1. XSS跨站脚本攻击:允许攻击者将恶意代码植入到提供给其它用户使用的页面中
    • 在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等
    • 不使用 v-html/dangerouslySetInnerHTML
  2. CSRF跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求
  3. SQL注入攻击:通过将恶意的 Sql查询或添加语句插入到应用的输入参数中,再在后台 Sql服务器上解析执行进行的攻击

闭包:闭包让你可以在一个内层函数中访问到其外层函数的作用域