增 数组.push()

删 数组.splice(开始删除索引,删除几个)

在当前对象中调用当前对象的方法中和属性,必须用this调用

nodeType判断节点类型

节点.nodeType ==  1:元素节点/2:属性节点/3:文本节点

concat 返回的是一个新的数组

封装歌曲列表管理(函数)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script>
  7. window.onload = function () {
  8. //给页面中所有的元素添加一个边框 1px solid pink
  9. //DOM中,没有提供直接获取后代元素的API
  10. //但是可以通过childNodes来获取所有的子节点
  11.  
  12. //先找body的所有子元素
  13. //再找body的子元素的所有子元素
  14.  
  15. function getChildNode(node){
  16. //先找子元素
  17. var nodeList = node.childNodes;
  18. //在用子元素再找子元素 这里就可以递归了
  19. //for循环中的条件,就充当了结束的条件
  20. for (var i = 0; i < nodeList.length; i++) {
  21. //childNode获取到到的节点包含了各种类型的节点
  22. //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
  23. var childNode = nodeList[i];
  24. //判断是否是元素节点
  25. if(childNode.nodeType == 1){
  26. childNode.style.border = "1px solid pink";
  27. getChildNode(childNode);
  28. }
  29. }
  30. }
  31. getChildNode(document.body);
  32. }
  33. </script>
  34. </head>
  35. <body>
  36. <div>1div
  37. <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
  38. <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
  39. </div>
  40. <div>10div
  41. <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
  42. <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
  43. </div>
  44. <p>我是第1个p标签</p>
  45. <p>我是第10个p标签</p>
  46. </body>
  47. </html>

面向对象封装歌曲管理

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script>
  7.  
  8. function SongManager(){
  9. this.songList = null;
  10. }
  11.  
  12. //在当前对象的方法中,调用当前对象的其他方法,需要使用this
  13. //例如 在 removeSong方法中调用 selectSong this.selectSong
  14. SongManager.prototype = {
  15. init:function (songList) {
  16. this.songList = songList;
  17. },
  18.  
  19. addSong: function (song){
  20. this.songList.push(song);
  21. },
  22.  
  23. removeSong:function (songName){
  24. var song = this.selectSong(songName);
  25. if(song == null){
  26. throw "您要删除的歌曲不存在!请重新尝试";
  27. }
  28. var index = this.songList.indexOf(song);
  29. this.songList.splice(index, 1);
  30. },
  31.  
  32. updateSong: function (songName, singer) {
  33. var song = this.selectSong(songName);
  34. if(song == null){
  35. throw "您要修改的歌曲不存在!请重新尝试";
  36. }
  37. song.singer = singer;
  38. },
  39.  
  40. selectSong: function (songName) {
  41. for (var k = 0; k < this.songList.length; k++) {
  42. var song = this.songList[k];
  43. if(song.songName == songName){
  44. return song;
  45. }
  46. }
  47. return null;
  48. }
  49. };
  50.  
  51. var pwbDEManager = new SongManager();
  52. pwbDEManager.init([
  53. {
  54. songName:"青藏高原",
  55. singer:"潘文斌"
  56. },
  57. {
  58. songName:"我的换板鞋,摩擦摩擦最时尚",
  59. singer:"约翰逊,庞麦郎"
  60. }
  61. ]);
  62. pwbDEManager.addSong({
  63. songName:"东风破",
  64. singer:"Jay Chou"
  65. })
  66.  
  67. var gjbDEManager = new SongManager();
  68. gjbDEManager.init([
  69. {
  70. songName:"两只老虎",
  71. singer:"高金彪"
  72. },
  73. {
  74. songName:"粉刷匠",
  75. singer:"高金彪"
  76. }
  77. ]);
  78. // gjbDEManager.removeSong("李白");
  79. gjbDEManager.removeSong("两只老虎");
  80. console.log(pwbDEManager.songList);
  81. console.log(gjbDEManager.songList);
  82.  
  83. //要封装一个歌曲管理的工具
  84. //特征:歌曲列表
  85. //行为:增 删 改 查
  86. </script>
  87. </head>
  88. <body>
  89.  
  90. </body>
  91. </html>

递归(练习在最底下)

1.在函数内调用函数自己,就是递归
2.函数不调用不占用内存
3.没有递归结束条件的递归就是死队规

递归的两个要素

1.自己调用自己
2.要有结束的条件

化归思想:把问题由难化易,化繁为简,有复杂变简单的过程成为化归

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script>
  7. window.onload = function () {
  8. //给页面中所有的元素添加一个边框 1px solid pink
  9. //DOM中,没有提供直接获取后代元素的API
  10. //但是可以通过childNodes来获取所有的子节点
  11.  
  12. //先找body的所有子元素
  13. //再找body的子元素的所有子元素
  14.  
  15. function getChildNode(node){
  16. //先找子元素
  17. var nodeList = node.childNodes;
  18. //在用子元素再找子元素 这里就可以递归了
  19. //for循环中的条件,就充当了结束的条件
  20. for (var i = 0; i < nodeList.length; i++) {
  21. //childNode获取到到的节点包含了各种类型的节点
  22. //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
  23. var childNode = nodeList[i];
  24. //判断是否是元素节点
  25. if(childNode.nodeType == 1){
  26. childNode.style.border = "1px solid pink";
  27. getChildNode(childNode);
  28. }
  29. }
  30. }
  31. getChildNode(document.body);
  32. }
  33. </script>
  34. </head>
  35. <body>
  36. <div>1div
  37. <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
  38. <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
  39. </div>
  40. <div>10div
  41. <p>1p<span>1span</span><span>2span</span><span>3span</span></p>
  42. <p>5p<span>1span</span><span>2span</span><span>3span</span></p>
  43. </div>
  44. <p>我是第1个p标签</p>
  45. <p>我是第10个p标签</p>
  46. </body>
  47. </html>

方式二

  1. <script>
  2.  
  3. window.onload = function () {
  4. //给页面中所有的元素添加一个边框 1px solid pink
  5. //DOM中,没有提供直接获取后代元素的API
  6. //但是可以通过childNodes来获取所有的子节点
  7.  
  8. //先找body的所有子元素
  9. //再找body的子元素的所有子元素
  10. function getChildNode(node){
  11. //先找子元素
  12. var nodeList = node.childNodes;
  13. var result = [];
  14. //在用子元素再找子元素 这里就可以递归了
  15. //for循环中的条件,就充当了结束的条件
  16. for (var i = 0; i < nodeList.length; i++) {
  17. //childNode获取到到的节点包含了各种类型的节点
  18. //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点
  19. var childNode = nodeList[i];
  20. //判断是否是元素节点
  21. if(childNode.nodeType == 1){
  22. result.push(childNode);
  23. var temp = getChildNode(childNode);
  24. result = result.concat(temp);
  25. }
  26. }
  27. return result;
  28. }
  29.  
  30. //1.第一次调用时获取body的所有子元素,会把所有的子元素全部放到result里面
  31. //2.每放进去一个 就找这个子元素的所有子元素 有返回值
  32. //3.把这个返回值和我们存当前子元素的数组拼接起来 就变成了 子元素 和 孙子元素的集合
  33. var arr = getChildNode(document.body);
  34.  
  35. for (var i = 0; i < arr.length; i++) {
  36. var child = arr[i];
  37. child.style.border= "1px solid pink";
  38. }
  39. }
  40. </script>

递归

例子:

1, 2, 3, 4, 5, ..., 100 求和

  1. 首先假定递归函数已经写好, 假设是foo. 即foo(100)就是求1100的和

  2. 寻找递推关系. 就是nn-1, 或n-2之间的关系:foo( n ) == n + foo( n - 1 )

  1. var res = foo(100);
  2. var res = foo(99) + 100;

将递推结构转换为递归体

  1. function foo(n){
  2. return n + foo( n - 1 );
  3. }

上面就是利用了化归思想:

  • 将 求 100 转换为 求 99

  • 将 求 99 转换为 求 98

  • ...

  • 将求 2 转换为 求 1

  • 求 1 结果就是 1

  • 即: foo( 1 ) 是 1

将临界条件加到递归体中(求1的结果为1)

  1. function foo( n ) {
  2. if ( n == 1 ) return 1;
  3. return n + foo( n - 1 );
  4. }

练习:

求 1, 3, 5, 7, 9, ... 第n项的结果与前n项和. 序号从0开始

先看求第n
  1. 首先假定递归函数已经写好, 假设是fn. 那么第n项就是fn(n)

  2. 找递推关系:fn(n) == f(n-1) + 2

  3. 递归体

  1. function fn(n) {
  2. return fn(n-1) + 2;
  3. }
  1. 找临界条件

    • 求 n -> n-1

    • 求 n-1 -> n-2

    • ...

    • 求 1 -> 0

    • 求 第 0 项, 就是 1

  2. 加入临界条件

  1. function fn( n ) {
  2. if ( n == 0 ) return 1;
  3. return fn( n-1 ) + 2;
  4. }
再看求前n项和
  1. 假设已完成, sum( n ) 就是前 n 项和

  2. 找递推关系: 前 n 项和 等于 第 n 项 + 前 n-1 项的和

  3. 递归体

  1. function sum( n ) {
  2. return fn( n ) + sum( n - 1 );
  3. }
  1. 找临界条件

    • n == 1结果为 1
  2. 加入临界条件

  1. function sum( n ) {
  2. if (n == 0) return 1;
  3. return fn(n) + sum(n - 1);
  4. }

练习

2, 4, 6, 8, 10 第 n 项与 前 n 项和

解题方法和上一题一样。

练习

现有数列: 1, 1, 2, 4, 7, 11, 16, … 求 第 n 项, 求前 n 项和.

求第n
  1. 假设已经得到结果 fn, fn( 10 ) 就是第 10 项

  2. 找递推关系

    • 0, 1 => fn( 0 ) + 0 = fn( 1 )

    • 1, 2 => fn( 1 ) + 1 = fn( 2 )

    • 2, 3 => fn( 2 ) + 2 = fn( 3 )

    • ...

    • n-1, n => fn( n-1 ) + n - 1 = fn( n )

  3. 递归体也就清楚了

  4. 临界条件是 n == 0 => 1

  1. function fn( n ) {
  2. if ( n == 0 ) return 1;
  3. return fn( n-1 ) + n - 1;
  4. }
n项和
  1. function sum( n ) {
  2. if ( n == 0 ) return 1;
  3. return sum( n - 1 ) + fn( n );
  4. }

练习

Fibonacci 数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … 求其第 n 项.

递推关系:fn(n) == fn(n-1) + fn(n - 2)

  1. function fib( n ) {
  2. if ( n == 0 || n == 1 ) return 1;
  3. return fib( n - 1 ) + fib( n - 2 );
  4. }

练习

阶乘:一个数字的阶乘表示的是从 1 开始 累乘到这个数字. 例如 3! 表示 1 3. 5! 就是 1 5. 规定 0 没有阶乘, 阶乘从1开始。

求n的阶乘

  1. function foo ( n ) {
  2. if ( n == 1 ) return 1;
  3. return foo( n - 1 ) * n;
  4. }

练习

求幂

  • 求幂就是求 某一个数 几次方

  • 2*2 2 的 平方, 2 的 2 次方

  • 求 n 的 m 次方

  • 最终要得到一个函数 power( n, m )

  • n 的 m 次方就是 m 个 n 相乘 即 n 乘以 (m-1) 个 n 相乘

  1. function power ( n, m ) {
  2. if ( m == 1 ) return n;
  3. return power( n, m - 1 ) * n;
  4. }

JS高级. 04 增删改查面向对象版歌曲管理、递归、的更多相关文章

  1. js操作indexedDB增删改查示例

    js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var r ...

  2. NX二次开发-NX访问SqlServer数据库(增删改查)C#版

    版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...

  3. JS源生代码“增删改查”之增

    51呢最近在做一个管理数据的,第一次接触到用JS的源代码去实现一些功能,才知道网页里的许多功能都是依赖于“增删改查”完成的,下面的几张图片就是对于增的演示: 下面是有关HTML的代码:这个主要是弹窗部 ...

  4. Node.js之mysql增删改查

    1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...

  5. DOM操作 JS事件 节点增删改查

    --------------------------习惯是社会的巨大的飞轮和最可贵的维护者.——威·詹姆斯 day 49 [value属性操作] <!DOCTYPE html><ht ...

  6. iOS 数据库的增删改查(OC版)

    自己写了几个方法来实现数据的增删改查功能: 首先在TARGETS--->>Build phases里面添加数据库所关联的库文件libsqlite3.tbd 添加完以后,在控制器上添加 #i ...

  7. node.js封装数据库增删改查

    数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...

  8. js数组的增删改查

    array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; ​ // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...

  9. JS DOM节点增删改查 属性设置

    一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加   删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...

随机推荐

  1. iDempiere 使用指南 绿色版一键启动测试环境

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  2. App Inventor 网络资源及推荐书目

    Ai2服务器 官方服务器:http://ai2.appinventor.edu/ 官方备用服务器:(大陆可用):http://contest.appinventor.mit.edu/ 国内个人服务器: ...

  3. 在Android Studio上进行OpenCV 3.1开发环境配置

    开发环境: Windows 7 x 64 家庭版 Android Studio 1.5.1(Gradle版本2.8) JDK 1.8.0 Android 6.0(API 23) OpenCV 3.1. ...

  4. alter table fx.pet modify column `species` varchar(20) binary;

    alter table fx.pet modify column `species` varchar(20) binary;

  5. 买卖股票的最佳时机 - C++

    class Solution { public: /** * @param prices: Given an integer array * @return: Maximum profit */ in ...

  6. Java框架安全

    (一)Mybatis注入问题 Mybatis是目前比较常用的ORM的框架,一般与SpringMVC框架整合较多,但使用不当会有SQL注入的风险. Mybatis里mapper中SQL语句的写法支持两种 ...

  7. HCNA配置静态LACP模式链路聚合

    1.静态LACP模式 静态LACP模式是一种利用LACP协议进行聚合参数协商.确定活动接口和非活动接口的链路聚合方式.该模式下,需手工创建Eth-Trunk,手工加入Eth-Trunk成员接口,由LA ...

  8. adb工具包究竟能帮我们做什么?

    adb工具包主要作用于什么呢?应该有很多用户都不了解adb,那就一起来了解一下吧!adb的全称为Android Debug Bridge,就是起到调试桥的作用. 借助adb工具,我们可以管理设备或手机 ...

  9. python操作oracle小测试

    首先使用python操作数据库需要导入cx_Oracle包import cx_Oracle这个包需要单独下载,下载地址:https://pypi.python.org/pypi/cx_Oracle使用 ...

  10. nginx-rtmp加入权限验证的简单方法

    nginx-rtmp-module默认不限制推流权限.播放权限.如果想加入权限验证,有很多种方法. 方法一:修改源码如: 如何给 nginx rtmp 服务加入鉴权机制 http://blog.csd ...