中文排序

[‘王大鹏’,’阿松大’,’八十多’].sort((a,b)=>a.localeCompare(b,’zh’))

遍历方法

image.png

链式操作

image.png

什么时候需要拷贝数据

js中pop/push/shift/unshift/splice 这些都是在原来的数据上进行修改的, concat /slice/map/reduce 是对原来的数据进行了浅拷贝

为什么每次map最好都深拷贝那

因为深拷贝数据安全,不会产生数据混乱,但是性能消耗又比较大

递归性能

如果说是2的30次方的话 ,机器直接就崩掉了
image.png

dom的绝对位置

image.png

  1. ['王大鹏', '阿松大', '八十多'].sort((a, b) => a.localeCompare(b, 'zh'))
  2. // 阶乘
  3. function factorial (n) {
  4. return n === 0 ? 1 : factorial(n - 1) * n
  5. }
  6. // 斐波那契数列
  7. // 1,1,2,3,5,8,13
  8. function fibonacci (n) {
  9. let a = n === 1 || n == 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2)
  10. return a
  11. }
  12. console.log(fibonacci(5))
  13. // 递归要考虑性能 上面的递归消耗性能太大了
  14. // 可以用reduce 和 for循环的两种写法,本质上是一样de
  15. function fibonacciFor (n) {
  16. let [a, b] = [0, 1]
  17. for (let i = 0; i < n; i++) {
  18. [a, b] = [b, a + b]
  19. }
  20. return b
  21. }
  22. console.log(fibonacciFor(5))
  23. function fibonacciReduce (n) {
  24. return Array(n).fill().reduce(([a, b], _) => {
  25. return [b, a + b]
  26. }, [0, 1])[1]
  27. }
  28. console.log(fibonacciReduce(5))
  29. // 获取dom节点的绝对位置
  30. // 也就是说dom节点在api中,没有获取当前节点在整个文档流的绝对位置
  31. // 所以需要递归遍历他的父节点,把父节点的offectTop加起来
  32. // 也可以用while 语法来写结果是一样的
  33. function get_layout (ele) {
  34. const layout = {
  35. width: ele.offsetWidth,
  36. height: ele.offsetHeight,
  37. left: ele.offsetLeft,
  38. top: ele.offsetTop
  39. }
  40. if (ele.offsetParent) {
  41. const parentLayout = get_layout(ele.offsetParent)
  42. layout.left += parentLayout.left
  43. layout.top += parentLayout.top
  44. }
  45. return layout
  46. }
  47. // 手写深拷贝 初步写法
  48. function clone (obj) {
  49. if (obj === null || typeof obj !== 'object') return obj
  50. const newObj = new obj.constructor()
  51. for (let key in Object.getOwnPropertyDescriptors(obj)) {
  52. newObj[key] = clone(obj[key])
  53. }
  54. return newObj
  55. }
  56. console.log(clone({ "123": "qwe", 3: { 4: 5 } }))
  57. console.log(clone([1, 2, 3]))
  58. // 深度比较
  59. function deepCompare (a, b) {
  60. if (a === null || typeof a !== 'object' || b === null || typeof b !== 'object') {
  61. return a === b
  62. }
  63. const propsA = Object.getOwnPropertyDescriptors(a)
  64. const propsB = Object.getOwnPropertyDescriptors(b)
  65. if (Object.keys(propsA).length !== Object.keys(propsB).length) {
  66. return false
  67. }
  68. // 数组every 全部都满足一个条件
  69. return Object.keys(propsA).every(key => deepCompare(a[key], b[key]))
  70. }