javascript 知识补遗

作用域的应用场景

1,访问变量控制,避免命名冲突和变量污染 2,模块化开发,通过使用函数和闭包,可以模块化组织代码 3,函数嵌套,内部函数可以访问外部函数的变量,隐藏和封装信息

作用域链

是js中一种查找变量的机制,由当前作用域和所有的父级作用域的变量对象所组成 。一层一层往上找,直到找到变量或者到达全局作用域。

作用域链的应用场景:变量查找,闭包,模块化开发

闭包

函数和其词法环境的组合。内部函数可以访问外部函数的变量。

私有化变量,模块化开发,延迟执行。

回调函数,事件处理,缓存

缺点:内存消耗,内存泄露

函数上下文 this

函数独立调用时,严格模式下,this指向undefined,非严格模式下指向window

函数作为对象方法调用时,指向对象本身

函数作为构造函数调用时,,会指向新创建的对象

使用call或apply时,显示的指定函数执行时的上下文,也就时this的值。

箭头函数没有自己的this值,而是捕获封闭了上下文的this的值

JavaScript数组

广泛应用的数据结构,存储一组有序的数据

长度可变,索引从0开始,数据类型可以不同

push、pop、unshift、shift、splice

slice、concat、join、reverse、sort

forEach、map、filter、reduce

toString、toLocaleString

indexOf、lastIndexOf、find、findIndex

some、every

length、constructor、prototype

JavaScript对象

以键值对的方式组织和存储数据

keys、values、entries

assign、freeze

数据类型

基本数据类型:number、string、boolean、null、undefined、symbol

引用数据类型:object、function、array

typeof 可以判断值的数据类型

类型转换优先级: 布尔->数字->字符串

null转数字时变成0,变字符串时变成’null'

undefined转数字时变成NaN,字符串为’undefined'

原型和原型链

继承:属性和方法

模块化

commonjs 使用require函数加载模块,使用module,exports导出模块。主要用于服务端开发

amd 异步模块加载,适合浏览器环境

umd 试图提供一种解决方案,让commonjs和amd环境都可以运行,通过判断环境中是否存在define和exports来判断是哪个模块环境

es6模块化 使用import加载模块,使用export导出模块

weakmap和weakset

waekmap 类似于map,却别在于:只有对象可以做键,键是弱引用,对象被回收后,键也会消失,不可遍历。

weakset,类似于set,只有对象可以作为值,是弱引用,不可遍历。

weakmap可以用来存储对象的私有数据,weakset可以用来检测对象是否存在和唯一。

面向对象

封装,内部实现,私有属性和方法 继承,子类可以继承基类的属性和方法 多态,一个方法根据调用对象不同而具有不同的行为

class

class 中可以定义构造函数,属性,方法

constructor 定义构造函数,this表示当前实例化的对象

static private protected get set

instanceof

extends

函数式编程

一种编程范式,将计算机程序视为数学函数的组合,强调函数的纯粹性和不可变性。

特点:函数的输出只由输出决定,不受外部影响;相同的输入始终返回相同的输出;函数不修改外部状态

高阶函数

接受一个或者多个函数作为参数,返回一个新的函数的函数。

例如:


   function map(fn,array){
      const result = []
      for(let i=0;i<array.length;i++){
          result.push(fn(array[i]))
      }
      return result
   }

组合函数

将多个函数组合为一个新函数的过程


    function add(x){
      return x+2
    }

    function min(x){
      return x+3
    }

    function compose(f,g){
        return function(x){
            return (g(x))
        }
    }

    const a = compose(add,min)

    const b = compose(4)

柯里化

将接受多个参数的函数转化为多个接受单个参数的函数的技术。

创建一个接受部分参数的的新函数,并且返回一个接受剩余参数的新函数来实现。


    function x(a){
      return function y(b){
        return a+b
      }
    }
    console.log(x(3)(4))

递归

函数调用工自身,斐波那契数列

函数式编程的优势:可读性、可测试性、并行执行、可扩展性

迭代器

是一种遍历集合的接口

next() 返回一个value和done,表示数据和是否结束

Proxy

一个特殊的包装器对象,用于修改或扩展某些基本操作的行为,比如属性读取,函数调用等。

深浅拷贝

浅拷贝只复制对象的引用,而深拷贝则是创建一个全新的对象。

深拷贝的实现

深拷贝通过对类型的判断,从而确定输出的对象,如果是基本数据类型,则直接返回,如果是特殊类型,则进行复制。

function deepClone{


  const clone = Array.isArray(obj)?[]:{}

  for(let key in obj){

    if(obj.hasOwnProperty(key)){
      clone[key] = deepClone(obj[key])
    }
  }
}

性能优化:循环拷贝,JSON序列化和反序列化,使用库函数如Lodash、Underscore

浅拷贝的实现

Object.assign()

展开语法

修饰器

修饰器是一种用于修改类,方法或属性的语法。

可以在不修改源代码的情况下增强功能

@符号作为前缀 与Python装饰器类似