浅拷贝、深拷贝与闭包

本文介绍了JavaScript中的递归练习,重点讲解了工厂函数、浅拷贝与深拷贝的概念,并深入探讨了闭包的原理,通过案例展示了闭包的应用。此外,还列举了字符串、数组和对象的常用方法,以及进制转换的相关知识。
摘要由CSDN通过智能技术生成

递归练习题

工厂函数

//手动书写,费时费力
var obj1 = { uname: "张三", age: 21 }
var obj2 = { uname: "李四", age: 23 }
var obj3 = { uname: "王五", age: 12 }
var obj4 = { uname: "赵六", age: 32 }
​
​
//工厂函数
function demo(uname, age) {
    var obj = new Object()
    obj.uname = uname;
    obj.age = age
​
    return obj;
}
​
console.log(demo("张三", 21))
console.log(demo("李四", 23))
console.log(demo("王五", 12))
console.log(demo("赵六", 32))
​
​
//构造函数:没有返回值
function demo(uname, age) {
    this.uname=uname;
    this.age=age
}
​
var result = new demo("张三", 21)
console.log(result)

浅拷贝与深拷贝

闭包

闭包就是 能够读取其他函数内部变量的函数

案例

  • 列表点击案例

  • 打车

字符串常用方法

  • length

  • charAt charCodeAt

  • indexOf lastIndexOf includes search

  • concat trim

  • split

  • substr( start , length ) substring( start , end) slice(start , end) replace

  • toLowerCase toUpperCase

  • parseInt(100abc) parseFloat

  • repeat

数组常用方法

  • concat join

  • shift unshift pop push 改变原数组

  • sort reverse

  • slice splice 第二个参数不一样

  • indexOf lastIndexOf includes

  • find findIndex

  • forEach map filter

  • some every

  • reduce

对象常用方法

  • 对象合并

    Object.assgin()

  • 对象解构

  • 对象转数组

进制转换

  • 十进制转二进制

    十进制 569   ===>二进制
  • 十进制转八进制

    十进制  1000  ===>八进制

00_test

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>test</title>
  <script>
    // function outer() {
    //   var num = 100
    //   function inner() {
    //     return num++
    //   }
    //   inner()
    // }
    // outer()
    // function
  </script>
</head>
<body>
  <ul>
    <li>北京</li>
    <li>上海</li>
    <li>广州</li>
    <li>深圳</li>
  </ul>
</body>
<script>
  // var list = document.querySelectorAll("li")
  // // console.log(list)
  // for (var i = 0; i < list.length; i++) {
  //   (function (i) {
  //     list[i].onclick = function () {
  //       console.log(i)
  //       console.log(list[i].innerHTML)
  //     }
  //   })(i)
  // }
  /*******
   * 打车
   * 起步价:13元
   * 每公里:5元/公里
   * 拥堵费:10
   * 
   * ****/
  // function price(n) {
  //   if (n <= 3) {
  //     return 13
  //   } else {
  //     return 13 + (n - 3) * 3
  //   }
  // }
  // var car = (function () {
  //   var start = 13;
  //   var total = 0;
  //   return {
  //     price: function (n) {
  //       if (n <= 3) {
  //         total = start;
  //       } else {
  //         total = start + (n - 3) * 5
  //       }
  //       return total;
  //     },
  //     //如果拥堵
  //     block: function (flag) {
  //       // sum += 13
  //       return flag ? total + 10 : total;
  //     }
  //   }
  // })()
  // console.log(car.price(4))
  // var arr=["北京","上海","广州"]
  // var arr = [
  //   { id: 1001, name: "八戒", weight: 200 },
  //   { id: 1002, name: "悟空", weight: 120 },
  //   { id: 1003, name: "唐僧", weight: 80 },
  //   { id: 1004, name: "沙和尚", weight: 160 },
  // ]
  // var result =arr.findIndex(item=>{
  //   return item.name=="沙和尚"
  // })
  console.log(result)
  // var result = arr.find(item => {
  //   return item.weight > 100
  // })
  // console.log(result)
  // var result = arr.map((item) => {
  //   // console.log(item)
  //   return item.weight / 2
  // })
  // console.log(result)
  // var result = arr.every(item => {
  //   return item.weight > 300
  // })
  // console.log(result)
  // var result = arr.filter(item => {
  //   return item.weight > 100
  // })
  // console.log(result)
  // var arr = [4, 3, 5, 6]
  // var result = arr.reduce((total, currentValue,currentIndex,arr) => {
  //   // console.log(total)
  //   // console.log(currentValue)
  //   return total+=currentValue
  // },0)
  // console.log(result)
</script>
</html>

01_裴波那切数列

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    // function fun(n) {
    //   if (n == 1 || n == 2) return 1;
    //   return fun(n - 1) + fun(n - 2)
    // }
    // console.log(fun(7))
    /*在控制台输出1~1000之中,所有能被5整除,或者被6整除的数字。*/
    // function fun() {
    //   for (var i = 1; i <= 1000; i++) {
    //     if (i % 5 == 0 || i % 6 == 0) {
    //       console.log(i)
    //     }
    //   }
    // }
    // fun()
    /*用户输入一个数字n,计算3/2+4/3+...+n+1/n*/
    // function fun(n) {
    //   var sum = 0;
    //   for (var i = 2; i <= n; i++) {
    //     sum += (i + 1) / i
    //   }
    //   return sum;
    // }
    // console.log(fun(3))
    /*用递归来实现分数加和运算*/
    function fun(n) {
      if (n < 2) throw Error("n不能小于2")
​
      if (n == 2) return 3 / 2
      return (n + 1) / n + fun(n - 1)
    }
    console.log(fun(1))
  </script>
</head>
<body>
</body>
</html>

02_列出所有约数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    /*用户输入一个数字,在控制台中列出它的所有约数。*/
    // function fun(n) {
    //   for (i = 1; i <= n; i++) {
    //     if (n % i == 0) {
    //       console.log(i)
    //     }
    //   }
    // }
    // fun(12)
    // //1 2 3 4 6 12
    /**安全数**/
    function fun() {
      for (var i = 1; i <= 60; i++) {
        if (i % 7 != 0 && i % 10 != 7) {
          console.log(i)
        }
      }
    }
    fun()
  </script>
</head>
<body>
</body>
</html>

03_水仙花数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    // 5**3    Math.pow(5,3)
    function fun() {
      for (var i = 100; i < 1000; i++) {
        //分别取百位、十位和个位的数字
        var sum = parseInt(i / 100) ** 3 + parseInt(i / 10 % 10) ** 3 + parseInt(i % 10) ** 3
        if (sum == i) {
          console.log(i)
        }
      }
    }
    fun()
  </script>
</head>
<body>
</body>
</html>

04_深拷贝与浅拷贝

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>深拷贝与浅拷贝</title>
  <script>
  </script>
</head>
<body>
</body>
</html>

05数组相关函数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    // var str1 = "北京"
    // var str2 = "欢迎你";
    // console.log(str1.concat(str2))      //字符串拼接
    /*****元素操作*****/
    // var city1 = ["北京", "上海", "广州", "深圳"]
    // city1.push("郑州")
    // console.log(city1)
    // city1.pop()
    // console.log(city1)
    // city1.unshift("郑州")
    // console.log(city1)
    // city1.shift()
    // console.log(city1)
    /**数组排序**/
    // var arr = [23, 45, 12, 56, 39]
    // arr.sort((a, b) => {
    //   // console.log(a, b, "****")
    //   // return a - b
    //   return b - a
    // })
    // console.log(arr)
    /**翻转数组**/
    // var arr = ["北京", "上海", "广州", "深圳"]
    // console.log(arr.reverse())
    // console.log(arr)
    /**数组元素的截取和替换**/
    // var arr = ["北京", "上海", "广州", "深圳"]
    // // var result = arr.slice(1,2)            //截取: 第2个参数是下标
    // var result = arr.splice(1, 1, "杭州")     //替换:第2个参数是length
    // // console.log(result)
    // console.log(arr)
    /****数组下标相关的函数******/
    // var person = ["唐僧", "八戒", "悟空", "八戒", "沙僧", "八戒"]
    // console.log(person.indexOf("八戒"))
    // console.log(person.lastIndexOf("八戒"))
    /**包含**/
    // console.log(person.includes("白龙马"))
    // var result = person.find((item) => {
    //   return item == "八戒"
    // })
    // console.log(result)
    /**数组循环**/
    var arr = [
      { id: 1001, name: "八戒", weight: 200 },
      { id: 1002, name: "悟空", weight: 120 },
      { id: 1003, name: "唐僧", weight: 80 },
      { id: 1004, name: "沙僧", weight: 160 },
    ]
    // arr.forEach((item, index) => {
    //   // item.weight = 100       //修改item中已经存在的属性weight
    //   item.age = 200              //为item中添加新属性
    // })
    // console.log(arr)
    /***for循环遍历数组***/
    // for (var i = 0; i < arr.length; i++) {
    //   // console.log(i)
    //   console.log(arr[i])
    // }
    /****使用in关键字遍历数组:每一项是下标*******/
    // for (var k in arr) {     
    //   // console.log(k)
    //   console.log(arr[k])
    // }
    /********使用of遍历数组:循环出的是数组的每一项**********/
    // for (i of arr) {
    //   console.log(i)
    // }
    /****使用in可以遍历对象********/
    var obj = { uname: "张三", age: 21 }
    // for (var k in obj) {
    //   // console.log(k)
    //   console.log(obj[k])
    // }
    // for (var i of obj) {
    //   console.log(i)
    // }
    // 区间     [12,45)     (12,45]  
    // var city2 = ["郑州", "杭州"]
    // ["北京", "上海", "广州", "深圳", "郑州"]
    // city1.push(...city2)
    // console.log(city1)
    // console.log(city1.concat(city2))
  </script>
</head>
<body>
</body>
</html>

06_字符串相关函数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>字符串相关函数</title>
  <script>
    //字符串和数组相互转换
    // var str = "北京 上海 广州 深圳"
    // var arr = str.split(" ")      //字符串转数组
    // var newStr = arr.join("-")    //数组转字符串
    // console.log(newStr)
    // console.log(arr)
    /*******截取字符串*******/
    // var str = "北京欢迎你"
    // var result = str.substr(2, 2)        //第二个参数是length
    // console.log(result)
    // var result = str.substring(2, 4)        //第二个参数是下标    [start,end)  左闭右开区间
    // console.log(result)
    //替换 replace
    // var str="北京非常欢迎你"
    // var result=str.replace("非常","十分")
    // console.log(result)
  </script>
</head>
<body>
</body>
</html>

07_数组es6函数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    // var arr = [
    //   { id: 1001, name: "八戒", weight: 200 },
    //   { id: 1002, name: "悟空", weight: 120 },
    //   { id: 1003, name: "唐僧", weight: 80 },
    //   { id: 1004, name: "沙和尚", weight: 160 },
    // ]
    //every函数:所有item都满足条件,返回true;只要有一个不满足条件,则返回false
    // var result = arr.every((item) => {
    //   // return item.weight > 50
    //   // return item.weight > 100
    //   return item.weight > 250
    // })
    // console.log(result)
    //some:只要有一个满足条件,就返回true;所有item都不满足条件,返回false
    // var result = arr.some((item) => {
    //   // return item.weight > 100
    //   // return item.weight > 180
    //   return item.weight > 250        //所有item都不满足条件,返回false
    // })
    // console.log(result)
    //map函数:返回处理之后的数组
    // var arr = [1, 4, 5, 7]
    // var result = arr.map(item => {
    //   return item ** 3
    // })
    // console.log(result)
    //reduce的使用:求和
    var arr = [1, 4, 5, 7]
    // var sum = 0;
    // for (var i = 0; i < arr.length; i++) {
    //   sum += arr[i]
    // }
    // console.log(sum)
    var result = arr.reduce((total, item) => {
      return total += item;
    },0)
    console.log(result)
    //寻找第一个满足条件的item
    // var result = arr.find((item, index) => {
    //   // console.log(item, index)
    //   return item.weight > 100
    // })
    // console.log(result)
    //寻找所有满足条件的item
    // var result = arr.filter(item => {
    //   return item.weight > 100
    // })
    // var result = arr.filter(item => item.weight > 100)
    // console.log(result)
  </script>
</head>
<body>
</body>
</html>

08_工厂函数

<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>工厂函数</title>
  <script>
    var obj1 = { uname: "张三", age: 21 }
    var obj2 = { uname: "李四", age: 23 }
    var obj3 = { uname: "王五", age: 12 }
    var obj4 = { uname: "赵六", age: 32 }
    //工厂函数
    function demo(uname, age) {
      var obj = new Object()
      obj.uname = uname;
      obj.age = age
      return obj;
    }
    console.log(demo("张三", 21))
    console.log(demo("李四", 23))
    console.log(demo("王五", 12))
    console.log(demo("赵六", 32))
    //构造函数:没有返回值
    function demo(uname, age) {
      this.uname=uname;
      this.age=age
    }
    var result = new demo("张三", 21)
    console.log(result)
    //es5继承
    function Father(uname, age) {
      this.uname = uname;
      this.age = age;
      this.say = function () {
        return `我是${this.uname},今年${this.age}岁`
      }
    }
    function Son(uname, age) {
      /**
       * 改变this指向的三种方法
       * 1. call(this,uname,age)      立即执行
       * 2. apply(this,[uname,age])   立即执行
       * 3. bind(this,uname,age)      不会立即执行
       * **/
      Father.call(this, uname, age)
      this.exam = function () {
        return `我是${this.uname},我需要考试`
      }
    }
    var s = new Son("小明", 12)
    console.log(s.say())
  </script>
</head>
<body>
</body>
</html>

09_浅拷贝与深拷贝

<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    /******引用数据类型**********/
    // var obj1 = { uname: "张三" }
    // var obj2 = obj1;     //{uname:"张三"}
    // obj2.uname="李四"    //{uname:"李四"}
    // console.log(obj1)
    /*****简单数据类型********/
    // var str1 = "北京"
    // var str2 = str1;      //"北京"
    // str2 = "上海"
    // console.log(str1)
    var obj1 = {
      uname: "张三",
      age: 21,
    }
    //
    var obj2 = {}
    for (var k in obj1) {
      obj2[k] = obj1[k]
    }
    // console.log(obj2)
    obj2.uname="李四"
    console.log(obj1)
  </script>
</head>
<body>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值