他的回复:
华为云ID:hw53615092JS第四、五、六章笔记1、删掉数组中指定元素要求将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后,形成一个不包含0的新数组和上面的筛选数组一样,将if中的条件换为arr != 0即可2、翻转数组将数组[1,2,3,4,5]的内容反过来放1、声明一个新数组newArr2、把旧数组索引号第4个取过来(arr.length - 1),给新数组索引号第0个元素(newArr.length)3、我们采取递减的方式 i--4、递增的方法也可以冒泡排序冒泡排序是一种算法,是把一系列的数据按照一定的顺序进行排列显示(从小到大或从大到小)冒泡排序是一种简单的算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是由因为越小的元素会经由交换慢慢“浮”到数列的顶端。[5,4,3,2,1]-->[1,2,3,4,5]1、一共需要的趟数,我们用外层for循环5个数据我们一共需要走4趟,长度就是arr.length - 12、每一趟交换次数,我们用里层for循环第一趟交换4次第二趟交换3次第三趟交换2次第四趟交换1次长度就是数组长度减去次数但是我们次数是从0开始的,所以,最终arr.length - i -13、交换2个变量就好了return使用注意事项1、return终止函数,return后面的代码不会被执行2、return只能返回一个值,返回的结果是最后一个值我们求任意两个数的加减乘除结果,可以利用数组return [num1 + num2, num1 - num2, num1 * num2, num1 / num2]3、我们的函数如果有return,则返回的是return后面的值,如果函数没有return,则返回的是undefinedfunction fun1() { return 666; } console.log(fun1); //666function fun2() { } console.log(fun2); //undefinedbreak、continue、return的区别break:结束当前的循环体(如for,while)continue:跳出本次循环,继续执行下次循环(如for,while)return:不仅可以退出循环,还能够返回return语句中的值,同时还可以结束当前的函数体内的代码arguments的使用当我们不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上是当前函数的一个内置对象。所有的函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。arguments展示形式是一个伪数组,因此可以遍历。伪数组具有以下特点:1、具有length属性;2、按索引方式存储数据;3、不具有数组的push、pop等方法函数的两种声明方式1、利用函数关键字自定义函数(命名函数)function fn() {}2、函数表达式(匿名函数)var 变量名 = function() {};var fun = function(aru) {console.log('我是函数表达式');console.log(aru);};fun(aru);fun是变量名,不是函数名函数表达式声明方式和声明变量差不多,只不过变量里面存的是值,而函数表达式里面存的是函数函数表达式也可以传递参数作用域1、JavaScript作用域:就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性和减少命名冲突2、JS的作用域(es6之前):全局作用域、局部作用域全局作用域:整个script标签,或者是一个单独的js文件局部作用域(函数作用域):这个代码的名字只在函数内部起效果和作用变量的作用域根据作用域的不同,我们变量分为全局变量和局部变量1、全局变量:在全局作用域下的变量,在全局下都可以使用注意:如果在函数内部,没有声明,直接赋值的变量也属于全局变量2、局部变量:在局部作用域下的变量,或者在函数内部的变量,只能在局部使用注意:函数的形参也可以看做是局部变量3、从执行效率看全局变量和局部变量全局变量只有浏览器关闭的时候才会销毁,比较浪费资源局部变量当我们程序执行完毕就会销毁,比较节省资源JS现阶段没有块级作用域,在es6的时候新增了块级作用域{}作用域链只要是代码,就至少有一个作用域;写在函数内部的局部作用域;如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。预解析JavaScript代码是由浏览器中的JavaScript解析器来执行的。1、JavaScript解析器在运行js代码的时候分两步:预解析和代码执行预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面代码执行:按照代码书写的顺序从上往下执行2、预解析分为 变量预解析(变量提升)和函数预解析(函数提升)a、变量提升就是把所有变量声明提升到当前的作用域最前面,不提升赋值操作b、函数提升就是把所有的函数声明提升到当前作用域的最前面,不调用函数JavaScript对象什么是对象?万物皆对象,对象是一个具体的事物,看得见,摸得着的实物。例如:一本书、一辆汽车、一个人可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的实物都是对象,例如字符串、数值、数组、函数等。对象是由属性和方法组成的属性:事物的特征,在对象中用属性来表示(常用名词)方法:事物的行为,在对象中用方法来表示(常用动词)为什么需要对象?保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。如果保存一个人的完整信息呢?对象可以让结构更清晰,让数据的一目了然。创建对象的三种方式1、利用字面量创建对象对象字面量:就是花括号{}里面包含了表达这个具体事物(对象)的属性和方法var obj = {}; //创建了一个空对象对象的属性或者方法我们采取键值对的形式 键 属性名: 值 属性值多个属性或者方法中间用逗号隔开,最后一个可以不用逗号方法冒号后面跟的是一个匿名函数2、利用new Object创建对象var obj = new Object(); //创建了一个空的对象,记得O大写 obj.uname = '张三疯'; obj.age = 18; obj.sex = '男'; obj.sayHi = function() { console.log(‘Hi~’); }我们利用等号赋值的方法,添加对象的属性和方法每个属性和方法之间用分号结束3、利用构造函数创建对象前面的两种创建方式一次只能创建一个对象,有大量的对象,创建起来就会很麻烦构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面构造函数的语法格式function 构造函数名() {this.属性 = 值; //this 当前的this.方法 = function() {}}new 构造函数名();构造函数首字母要大写我们构造函数不需要return就可以返回结果我们调用构造函数,必须使用new我们只要new Star()调用函数就创建了一个对象我们的属性和方法前面必须添加this1、内置对象JavaScript中的对象分为3种:自定义对象、内置对象、浏览器对象前面两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于我们JS独有的内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供一些常用的或是最基本而必要的功能(属性和方法)。内置对象最大的优点就是帮助我们快速开发,JS提供了多个内置对象:Math、Date、Array、String等2、查文档学习一个内置对象的使用,只要学会其常用成员的使用即可,我们可以通过查文档学习,可以通过MDN、W3C来查询,推荐使用MDNMozilla开发者网络(MDN)提供了有关开放网络技术(Open Web)的信息,包括HTML、CSS和万维网及HTML5应用的API。MDN: https://developer.mozilla.org/zh-CN/如何学习对象中的方法a、查阅该方法的功能b、查看里面参数的意义和类型c、查看返回值得意义和类型d、通过demo进行测试3、Math对象Math数学对象,不是一个构造函数,不需要new来调用,而是直接使用里面的属性和方法console.log(Math.PI);//一个属性,圆周率console.log(Math.max(1, 99, 3)); //99console.log(Math.max(1, 99, 'abc')); //NaNconsole.log(Math.max()); //-Infinityconsole.log(Math.abs(-1)); //1console.log(Math.abs('-1')); //隐式转换,会把字符串型-1转换成数字型console.log(Math.abs('pink')); //NaNMath取整Math.floor() 向下取整console.log(Math.floor(1.9));//1Math.ceil() 向上取整console.log(Math.ceil(1.9));//2Math.round() 四舍五入console.log(Math.round(1.9));//2console.log(Math.round(1.1);//1console.log(Math.round(-1.5));//-1 其他数字都是四舍五入,但是.5特殊,它往大了取随机数方法Math.random()方法返回一个随机的小数,范围在[0,1)之间 0 = x 1;这个方法没有参数console.log(Math.random());随机返回一个整数的方法(得到两个数之间的随机整数,包含这两个整数)Math.floor(Math.random()*(max - min + 1)) + min;随机点名猜数字游戏1、随机生成一个1~10的整数,我们需要用到Math.random()方法2、需要一直猜到正确为止,所以一直循环3、用while循环合适。更简单4、核心算法:使用if else if多分支语句来判断大于、等于、小于4、日期对象Date() 日期对象,是一个构造函数,必须使用new来调用创建我们的日期对象var arr = new Array(); //创建一个数组对象var obj = new Object();//创建一个对象实例a、使用Date,如果没有参数,返回当前系统的当前时间var now = new Date();console.log(now);//返回当前时间b、参数常用写法数字型 2010, 7, 25字符串型'2020-7-25 8:8:8'var date1 = new Date(2020, 7, 25);console.log(date1); //Tue Aug 25 2020 00:00:00 GMT+0800 (中国标准时间),比要求输出的大一个月var date2 = new Date('2020-7-25 8:8:8');console.log(date2);//2020-7-25 8:8:8c、日期格式化格式化年月日格式化时分秒//封装一个函数,返回当前的时分秒d、获取日期总的毫秒数Date对象是基于1970年1月1日(世界标准时间)起的毫秒数,时间戳e、倒计时案例核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时,但是不能拿着时分秒相减,例如03分减去24分,结果会是负数用时间戳来做,用用户输入时间的总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数把剩余时间总的毫秒数转换为天、时、分、秒转换公式如下d = parseInt(总秒数/60/60/24); //计算天数h = parseInt(总秒数/60/60%24); //计算小时m = parseInt(总秒数/60%60); //计算分数s = parseInt(总秒数%60);//计算秒数5、数组对象创建数组的两种方式a、利用数组字面量var arr = [1,2,3];console.log(arr[1]);b、利用new Array()var arr1 = new Array();//创建了一个空数组var arr2 = new Array(2);//创建了一个长度为2的空数组var arr2 = new Array(2,3);//创建了一个数组元素为2和3的数组下面的翻转数组中使用了检测参数是否为数组的方法添加删除数组元素的方法a、push()在我们数组的末尾,添加一个或多个数组元素var arr = [1,2,3];arr.push(4,5);console.log(arr.push(4,5));//5console.log(arr);//[1,2,3,4,5]push是可以给数组追加新的元素push()参数直接写数组元素就可以push完毕后,返回的结果是新数组的长度b、unshift()在我们数组的开头,添加一个或多个数组元素c、pop()可以删除数组的最后一个参数pop完毕后,返回的结果是删除的那个元素d、shift()可以删除数组的第一个参数数组排序数组索引方法数组去重案例(重点)目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个核心算法:我们遍历旧数组,然后拿旧数组元素去查询新数组,如果该元素在新数组中,则添加,否则不添加我们怎么知道该元素有没有存在,利用新数组.indexOf(数组元素),如果返回-1,说明不存在封装一个去重的函数unique数组转换为字符串concat();连接两个或多个数组,不影响原数组,返回一个新数组slice():数组截取slice(begin,end),返回被截取项目的新数组splice();数组删除splice(第几个开始,要删除个数),返回被删除项目的新数组,这个会影响原数组slice和splice的目的基本相同,建议重点掌握splice()6、字符串对象为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String、Number和Boolean基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。//下面代码有什么问题?var str = 'andy'; console.log(str.length);按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为js会把基本数据类型包装为复杂数据类型,其执行过程如下//把简单数据类型包装为复杂数据类型 var temp = new String('andy'); //把临时变量的值给str str = temp; //销毁这个临时变量 temp = null;字符串的不可变因为我们字符串的不可变,所以不要大量的拼接字符串,不可变指的是,虽然看上去可以改变内容,但其实地址变了,内存中新开辟了一个内存空间。str = 'andy'str = 'tom'根据字符返回位置字符串所有的方法,都不会改变字符串本身(字符串是不可变得),操作完成会返回一个新的字符串案例:查找字符串'abcoefoxyozzopp'中所有o出现的位置及次数核心算法:先查找第一个o出现的位置然后,只要indexOf返回的结果不是-1就继续往后查找因为indexOf只能查找到第一个,所以后面的查找,利用第二个参数,当前索引加1,从而继续查找根据位置返回字符(重点)charAt(index):返回指定位置的字符(index字符串的索引号),str.charAt(0);charCodeAt(index):获取指定位置处字符的ASCII码(index索引号),str.charCodeAt(0);str[index]获取指定位置处字符,HTML5,IE8+支持和charAt()等效统计出现最多的字符和次数判断字符串'abcoefoxyozzopp'中出现次数最多的字符,并计算其次数核心算法:利用charAt(),遍历这个字符串把每个字符串都存储给对象,如果字符串没有该属性,就为1,如果存在就+1遍历对象,得到最大值和该字符字符串操作方法concat(str1,str2,str3...):concat()方法用于连接两个或多个字符串,等效于+,+更常用substr(start,length):从start位置开始(索引号),length取得个数,相当于数组中的spliceslice(start,end):从start位置开始,截取到end,end取不到(start和end都是索引号)sunstring(start,end):从start开始,截取到end位置,end取不到,基本和slice相同,但是不接受负值replace('被替换的字符','替换为的字符'),它只会替换第一个字符假如替换多个字符,用循环实现字符转换为数组 split('分隔符'),前面我们学过join把数组转换为字符串toUpperCase():转换大写toLowerCase():转换小写7、简单数据类型与复杂数据类型简单数据类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫值类型string、number、boolean、undefined、nullnull返回的是一个空的对象 object,如果有个变量我们以后打算存储为对象,暂时没想好,用null引用类型:复杂数据类型,在存储时,变量中存储的仅仅是地址(引用),因此叫做引用数据类型通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等简单数据类型放在栈里,在内存里面直接开辟一个空间存放值复杂数据类型首先在栈里面存放地址(16进制表示)真正的数据放在堆里。简单类型传参函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到外部变量复杂类型传参函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象一周的笔记太长,从中节选了点比较重要的上传于此,课程的内容通俗易懂,讲的很不错,做起题来,一做就错,惨不忍睹,看来只有通过多练习,才能真正掌握。