递归练习题
工厂函数
//手动书写,费时费力 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>