JS:js编程题2(*****五颗星)
1.递归
经典js结构: 递归,闭包,立即执行函数
递归: 函数中调用函数自己的结构
递归的两个要素: 1. 出口 2. 入口
入口: 进入递归(递归的逻辑)
出口: 什么时候跳出递归
最好先写出口,再写入口
<script>
var i=0
function fn(){
i++
if(i<5){//入口:进入递归(递归的逻辑)
console.log(i)
fn()
}//出口:什么时候跳出递归
}
fn()
</script>
1.阶乘的递归实现
阶乘: 3! 3*2*1
需求: 求n的阶乘(函数封装)
<script>
function fn(n){
// 先写出口
if(n<=1){
return 1
}
return n*fn(n-1)//出口
}
console.log(fn(4))
</script>
2.深拷贝实现
拷贝-----浅拷贝(浅复制),深拷贝(深复制)
浅拷贝:
浅拷贝----for in 循环 将p1的每一个键值对赋值给p2,如果复制到引用地址,则不论哪一个对象修改都会相互影响
浅拷贝-----会发生一改全改的情况(数据安全的问题)
<script>
var p1 = {
name:"张三",
age:20,
gender:"男",
favs:["javascript","css","html"],
wife:{
name:"王五",
age:21,
gender:"女",
favs:["口红","面膜","衣服"]
}
}
var p2={}
// 浅拷贝----for in 循环 将p1的每一个键值对赋值给p2
// 浅拷贝会发生一改全改的情况(数据安全的问题)
for(let i in p1){
p2[i]=p1[i]
}
p2.name="李四"
p2.wife.age=18
console.log(p1)
console.log(p2)
</script>
深拷贝:
经典案例:
深拷贝的实现原理: 保证拷贝的每一个键值对都是基本类型
参数设计: 将p1拷贝到p2中 p1(当前对象cur) p2(目标对象tar)
<script>
var p1 = {
name:"张三",
age:20,
gender:"男",
favs:["javascript","css","html"],
wife:{
name:"王五",
age:21,
gender:"女",
favs:["口红","面膜","衣服"]
}
}
var p2={}
function deepCopy(cur,tar){
for(var k in cur){//for in会遍历实例成员和原型成员
if(cur.hasOwnProperty(k)){//判断是不是实例成员
if(typeof cur[k]==="object"){//引用类型和基本类型的判断,判断是不是object类型,不是数组就是对象
// tar[k]=Object.prototype.toString.call(cur[k])==="[object Array]"?[]:{}//数组对象的判断
tar[k]=Array.isArray(cur[k])?[]:{}//判断是否是数组类型
deepCop
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理