js第三周学习笔记

119 阅读9分钟

一数组排序(两种方式)

1、鄙视时:手写冒泡排序:

从第一个元素开始,依次比较相邻的两个元素,如果前一个>后一个,两者就交换位置

公式:	
	for(var j=1;j<arr.length;j++){
	      for(var i=0;i<arr.length-j;i++){
			if(arr[i]>arr[i+1]){
				var middle=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=middle;
				}
			}
		}
		console.log(arr);

2、正式开发中:数组提供了排序的API:arr.sort();

问题1:默认将数据们转为字符串,按位PK每个字符的ASCII码。

解决:

      arr.sort(function(a,b){//匿名回调函数,不需要我们调用它,它自动调用,创建这个API的前辈帮我们提前准备好的
   //console.log(a);//后一个数字
   //console.log(b);//前一个数字
   return a-b;//如果return,返回 是一个正数,说明后一个比前一个大
  //如果return,返回 是一个负数,说明前一个比后一个大
   //如果return,返回 是一个0,说明一样大
   //而我们sort方法,根据你返回的数字,来判断要不要交换位置
		})

问题2:只能升序排列,如何降序?

		arr.sort(function(a,b){
			return b-a;
		})

强调:排序非常重要,切忌,只要以后网页中有任何排序功能,他的底层一定是一个数组,因为只有数组可以排序

二、栈和队列:添加元素和删除元素的新方式:

栈:其实就是数组,只不过一端封闭,只能从另一端进出的数组

何时:优先使用最新的数据

如何:

开头进:arr.unshift(新值,...);//添加元素的新方式:向前添加:

缺点:会修改其他元素的下标,不要传入数组参数,会变成一些二维,一些一维

开头出:var first=arr.shift();//删除元素的新方式:向前删除一个,一次只会删除一个:

缺点:会修改其他元素的下标

结尾进:arr.push(新值,...);//添加元素的新方式:向后添加:很棒:完美的代 替了:arr[arr.length]=新值 和 arr=arr.concat(新值),不要传入数组参数

结尾出:var last=arr.pop();//删除元素的新方式:向后删除一个,一次只会删除一个

队列:其实就是数组,只不过只能从一端进,另一端出的数组

何时:希望按照先来后到的顺序,现实中多得很

开头进:arr.unshift(新值,...);

结尾进:var last=arr.pop();

结尾进:arr.push(新值,...);

开头出:var first=arr.shift();

三、二维数组:数组的元素,又引用着一个数组

何时:在一个数组内,希望再次细分每个分类

遍历二维数组:必然两层循环,外层循环控制行,内层循环控制列

  for(var r=0;r<arr.length;r++){
  	for(var c=0;c<arr[r].length;c++){
  		console.log(arr[r][c]);
  	}
  }

四、String的基础概念:

包装类型:专门将原始类型的值封装为一个引用类型的对象

为什么:原始类型的值原本是没有任何属性和方法,意味着原始类型本身就是不支持.操作的,但是前辈们发现字符串经常会被我们程序员所操作,为了方便我们程序员为这三个人提供了包装类型(提供了很多很多的属性和方法)

何时使用:只要视图用原始类型的变量调用属性或方法时,自动包装

何时释放:方法调用完毕后,自动释放包装类型,并且返回数据(又悄悄的变成了原始类型)

五、正则表达式( 定义字符串中字符出现规则的表达式:)

语法:/正则表达式/

1、最简单的正则:

关键字原文 "no"-> /no/后缀 后缀:g:全部 i:忽略大小写

2、备选字符集:/^[备选字符集]$/

强调:1、一个中括号,只管一位字符

2、正则表达式默认只要满足就不管后续,我们希望从头到尾完全匹配,

解决:前加^后加$ - 只要是做验证就必须

特殊:如果备选字符集中的ascii是连续的,那么可以用-省略掉中间的部分

  比如:一位数字:[0-9]
  	一位字母:[A-Za-z]
        一位字母、数字、下划线:[0-9A-Za-z_]
        一位汉字:[\u4e00-\u9fa5]

3、预定义字符集:前辈们提前定义了一些字符集 - 简化备选字符集 一位数字:\d === [0-9]

	一位数字、字母、下划线:\w === [0-9A-Za-z_]
            
	一位空白字符:\s 包括:空格、换行、制表符

	一位除了换行外的任意字符:.	很少使用,范围太广了

建议:优先使用预定义字符集,如果预定义满足不了,自己在写备选字符集补充

4、量词:规定一个字符集出现的次数:

  1、有明确数量
  	字符集{n,m}:前边相邻的字符集,至少n个,最多m个
  	字符集{n,}:前边相邻的字符集,至少n个,多了不限
  	字符集{n}:前边相邻的字符集,必须n个
  2、没有明确数量
  	?:前边相邻的字符集,可有可无,最多1个
  	*:前边相邻的字符集,可有可无,多了不限
  	+:前边相邻的字符集,至少一个,多了不限

5、选择和分组:

  选择:在多个规则中选一个
  	规则1|规则2
  分组:将多个子规则临时组成了一组规则
  	(规则1|规则2)

6、指定匹配位置:

  ^:开头
  $:结尾
  特殊:两者同时使用:前加^后加$:表示从头到尾要求完全匹配

支持正则的字符串的API:替换、切割

切割:var arr=str.split(reg);

替换:

  1、基本替换法:缺陷:替换的新东西是固定的
  	str=str.replace(/正则表达式/后缀,"新内容")
  	//replace支持正则,并且搭配上后缀就可以找到全部关键字进行替换
  2、高级替换法:
  	str=str.replace(/正则表达式/后缀,function(a,b,c){
  		//第一个形参是正则匹配到的关键字
  		//第一个形参是正则匹配到的关键字的下标
  		//原文本身
  		return a.length==2?"**":"***";
  	})
  3、格式化:

3、正则对象:

1、创建:

直接量:var reg=/正则表达式/后缀; 构造函数:var reg=new RegExp("正则表达式","后缀");

2、API:验证

reg.test(用户输入的内容); true->验证通过 false->验证失败

六、Math对象:

1、Math.PI === 3.1415926 不需要我们创建Math带有此属性

2、取整:3种

1、上取整:超过一点点,就取下一个整数

Math.ceil(num);

2、下取整:无论超过多少,都会省略掉小数部分

Math.floor(num);

3、四舍五入取整:

Math.round(num);

4、num.toFixed(d):优点:可以四舍五入保留指定的小数位数

缺点:结果是一个字符串,建议搭配上parseFloat()

3、乘方和开方

乘方:Math.pow(底数,幂) - 代替连乘操作

开方:Math.sqrt(num) - 只能开平方

4、最大值和最小值: var 最大的/最小的=Math.max/min(a,b,c,d,e,f,g,....);

问题:本身不支持数组参数

解决:固定用法:

var 最大的/最小的=Math.max/min.apply(Math,arr);

apply其实有两个功能:1、借用 2、悄悄的将数组打散为单个元素

5、绝对值:把负数转为整数Math.abs(负数)

6、随机数:网页上出现了随机的功能,底层一定用到了随机数

Math.random():在0-1之间取出一个随机的小数

可能取到0,但是不可能取到1,意味着取不到最大值

公式:parseIny(Math.random()*(max-min+1)+min);

七、Date对象

创建:

1、*创建一个当前日期时间:

var now=new Date();

2、*创建一个自定义时间:

var birth=new Date("yyyy/MM/dd hh:mm:ss");

3、创建一个自定义时间:

var birth=new Date(yyyy,MM-1,dd,hh,mm,ss);//修改月份,从0开始的,0-11

4、复制一个日期:

为什么:日期的所有的API都是直接修改原日期对象,无法获取修改之前的日期 所以,在执行API之前都要先进行复制,然后再操作复制后的日期

如何:var end=new Date(start);

操作两个日期对象之间可以相减,得到一个毫秒差,换算出自己想要的部分

API:

分量:时间的单位

年月日星期:FullYear Month Date Day

时分秒毫秒:Hours Minutes Seconds Milliseconds

每一个分量都有一对儿getXXXX/setXXXX

其中getXXX负责获取某一个分量的值

其中setXXX负责设置某一个分量的值

特殊:

1、取值范围: FullYear:当前的年份的数字

*Month:0-11

Date:1-31

*Day:0-6,外国人的眼里星期天才是一周的第一天

Hours:0-23

Minutes:0-59

2、Day星期,没有set方法

3、如果希望对某个分量进行加减操作

date.setXXX(date.getXXX+/-n);

4、格式化日期为字符串:本地格式 date.toLocaleString();//本地日期格式具有兼容性问题,在老IE上显示效果不一样

八、Error对象

1、***浏览器自带4种错误类型

语法错误:SyntaxError - 多半都是你的符号写错了

引用错误:ReferenceError - 没有创建就直接使用了

类型错误:TypeError - 不是你的方法,你却去使用了

范围错误:RangeError - 只有一个API会碰到:num.toFixed(d);//d的取值范围只能在0-100之间

2、只要发生错误,就会报错,会导致后续代码终止

错误处理:就算发生错误,我们也不希望报错,而是给一个错误提示,让后续代码依然可以继续执行

语法: try{

只放入你可能出错的代码

}cathc(err){ 发生错误后才会执行

console.log(err);//err就是我们的错误提示,英文

console.log("中文的错误提示") }

try...catch:的性能非常差:几乎放在里面的代码效率都会被降到最低

***可以用一个技术代替:分支 **

九、Function对象:(补充)

构造函数方式:var 函数名=new Function("形参1","形参2",..."函数体;return 返回值");

重载overload:相同的函数名,根据传入的实参的不同,可以自动选择对应的函数进行执行(js的语法不支持重载, js不允许多个同名函数同时存在,如果同时存在,最后的会覆盖之前所有的)

解决:在【函数中】有一个对象 - arguments对象

什么是arguments:只能在函数中使用,自动创建,是一个类数组对象(支持下标、length、遍历)

作用:可以接收住所有的传入的实参

匿名函数:没有名字的函数

1、匿名函数自调

2、匿名函数回调:将函数作为了一个实参,传递给其他函数调用(只要是匿名函数,没有自调,就是回调)

arr.sort(function(){})

str.replace(reg,function(){})

elem.onclick=function(){}