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装饰器类似