1)深拷贝和浅拷贝的区别
深拷贝
深拷贝是一种创建一个新对象,并将原始对象及其所有的嵌套对象的属性完全复制对象到新对象
深拷贝不仅会复制对象的属性,还会递归复制嵌套对象
浅拷贝
浅拷贝只复制对象或数组的第一层,不会递归复制嵌套的对象或数组,复制后的对象和原对象共享相同的引用。
深拷贝会创建一个全新的对象或数组,并递归地复制所有层级的对象或数组,复制后的对象和原对象完全独立,互不影响。
简单解释:
B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
什么是递归函数
递归
递归函数通常包含两部分:基本情况和递归调用。基本情况是指当问题已经足够小以直接求解时,递归函数不再进行调用,而是返回结果。递归调用是指在解决大问题的过程中,将其分解为更小规模的相同问题,并通过递归调用来解决这些子问题。
需要注意的是,递归虽然灵活,但在实际应用中需要注意控制递归的深度,避免无限递归导致栈溢出等问题。此外,一些问题可能存在更高效的非递归解决方法,因此在使用递归时应权衡利弊。
什么是this指向
1.在方法中,this 指的是所有者对象
- 2.单独使用的时候,this 指的是全局对象
- 3.在函数中,this 指的是全局对象,严格模式下,this 是 undefined
- 4.在事件中,this 指的是接收事件的元素
call,apply,bind的区别
一、执行方式不同
call和apply是改变后页面加载之后就立即执行,是同步代码。
bind是异步代码,改变后不会立即执行;而是返回一个新的函数。
二、传参方式不同
call和bind传参是一个一个逐一传入,不能使用剩余参数的方式传参。
apply可以使用数组的方式传入的,只要是数组方式就可以使用剩余参数的方式传入。
三、修改this的性质不同
call、apply只是临时的修改一次,也就是call和apply方法的那一次;当再次调用原函数的时候,它的指向还是原来的指向。
bind是永久修改函数this指向,但是它修改的不是原来的函数;而是返回一个修改过后新的函数,此函数的this永远被改变了,绑定了就修改不了。
1、纯函数指的是什么?
1. 确定性 :对于相同的输入,纯函数总是产生相同的输出。这意味着,如果你用相同的参数多次调用纯函数,它将始终返回相同的结果。
2. 无副作用 :纯函数不会修改其外部环境,包括全局变量、输入参数对象等。这意味着,纯函数不会产生任何可观察到的副作用,例如更改全局状态或直接修改传入的参数。
使用纯函数的好处包括:
- 可预测性:由于纯函数的确定性特性,它们的行为很容易预测,有助于提高代码的可读性和可维护性。
- 可测试性:纯函数便于编写单元测试,因为它们的行为完全取决于输入参数,不依赖于外部状态。
- 引用透明性:意味着函数调用可以被其返回值替代,而不会影响程序的行为。这种特性使得代码更易于理解和推理。
- 函数组合性:由于纯函数不依赖于外部状态,它们可以方便地进行函数组合。通过将多个纯函数组合在一起,可以构建出更复杂的功能,同时保持代码的清晰性和可维护性。
- 并发安全性:由于纯函数没有共享的状态,因此它们在并发环境下是安全的。多个线程或进程可以同时调用纯函数,而不会导致竞态条件或其他并发问题。
什么是柯里化,柯里化主要用到什么特性
1)柯里化(currying)也称为部分求值,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术
2)所谓"柯里化",就是把一个多参数的函数,转化为单参数函数,并且返回接受余下的参数而且返回结果
3)一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来,待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值
JavaScript中有哪些常见的编程模式?
-
模块模式:将代码组织成小的、独立的模块,实现了信息的封装和隐藏。
-
工厂模式:通过工厂方法动态创建对象,使代码更加灵活和可维护。
-
单例模式:确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
-
观察者模式:定义对象间的一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
-
命令模式:将请求封装成对象,使得可以将请求参数化、延迟执行或者放入队列中进行排队。
-
装饰者模式:动态地给对象添加新的行为,同时又不改变其原有的结构和功能。
-
代理模式:通过代理对象来控制访问另一个对象,使得代码更加安全和可维护。
-
中介者模式:用一个中介对象来封装一系列的对象交互,使对象间的耦合度降低,同时也增强了对象间的通信。
JavaScript中有个概念叫副作用(Side Effect),副作用指的是什么?
副作用是和纯函数的相对应的概念。副作用让一个函数变得不纯,它是产生非纯函数的一个主要因素。纯函数的根据相同输入始终有相同输出,如果依赖于外部状态,就无法保证输出相同就会产生副作用让函数变得不纯
副作用的来源:
- 全局变量
- 配置文件
- 数据库
- 获取用户输入
总结:所用的外部交互都有可能产生副作用。副作用使得方法的通用性下降不适合扩展和我重用,同时副作用会给程序带来安全隐患,比如用户输入带来的跨站脚本攻击(xss
)。但是副作用是不可能完全禁止的,应尽可能控制在可控范围内。
什么是数据劫持有什么作用,如何实现数据劫持
1、含义:对原有数据的复刻,就是复制一份原有的数据出来,但是复刻出来的数据不允许修改,但是这个数据是从原有的数据中复刻出来的
2、语法:Object.defineProperty(给那一个对象,属性名,{配置项})
在配置项中包含着属性名的值
配置项中的内容:
=> value:该属性名对应的值
=> writable:该属性是否可以被重写(就是重新设置值)
-> 默认是 false 不允许被重写 , 也就是只读
-> 选填是 true 表示允许被重写 , 也就是可以被修改
=> enumerable: 表示该属性是否可以不枚举(遍历)
-> 默认是 false 不可以枚举
-> 选填是 true 表示可以遍历
=> get: 是一个函数 , 叫做getter获取器
-> 可以用来获取该属性的值
-> get属性的返回值就是这个属性的值
-> 注意: 不能和 value 和 writable 一起使用 , 会报错
=> set: 是一个函数 , 叫做setter设置器