2016-09-01-day10 am
MathAPI
1.最大值和最小值:
Math.max(值1,值2,...); //获得给定值中的最大值
Math.min(值1,值2,...); //获得给定值中的最小值
问题: max和min不支持数组参数
解决: Math.max.apply(null,arr)
获得arr中的最大元素
2.随机数:
Math.random() //返回0<=r<1之间的一个随机小数。
Math.floor(Math.random()\*(max+1)); //在0~max之间取随机整数
Math.floor(Math.random()\*(max-min+1)+min) //在min~max之间取随机整数
Date: 封装一个时间点,并提供操作时间的API的对象
日期对象的原理: 日期对象中封装的是一个从1970年1月1日0点至今的毫秒数。
- 何时使用: 只要存储日期或时间,或者要对时间进行计算时。
- 如何使用:
创建: 4种:
1). 创建一个日期对象,自动获得客户端当前操作系统时间:
var now=new Date(); //Mon May 20 2019 14:10:31 GMT+0800 (中国标准时间)
2). 创建一个日期对象,并封装自定义时间:
var date = new Date("yyyy/MM/dd hh:mm:ss");
var date = new Date(yyyy,MM-1,dd,hh,mm,ss);
new Date('2019/05/14 18:00:00');//Tue May 14 2019 18:00:00 GMT+0800 (中国标准时间)
3). **复制一个日期对象:**
为什么:今后,日期对象的计算,都直接修改原日期对象。计算后,原日期无法保留。
何时: 只要要求同时保留计算前后的两个时间时,都要先复制原时间,再用副本计算新时间。
如何: var date1=new Date("xxx")
var date2=new Date(date1);
4). 将毫秒数转化为当地时间:
为什么: 系统中存储时间,都是使用毫秒数
何时: 只要将毫秒数转为当地时间显示
如何: var date=new Date(111585555);
5). 将标准时间转换成毫秒数:
1.Date.now() 方法返回自1970年1月1日 00:00:00 UTC到当前时间的毫秒数(获取当前时间)
2.getTime 方法的返回值一个数值,表示从1970年1月1日0时0分0秒距离该日期对象所代表时间的毫秒数
3.Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数
Date API:
1.分量: FullYear(年份), Month(月份), Date(一个月中的第几天), Day(一周中的第几天), Hours(小时), Minutes(分钟数), Seconds(秒数), Milliseconds(毫秒数)
- 每个分量都有一对儿getXXX/setXXX方法
getXXX方法负责获取分量的数值
setXXX方法负责将新值更新到分量
强调: set可自动调整时间进制
特殊:Day 星期,没有set - 年月日星期,都是单数,不带s
时分秒毫秒,都是复数,带s -
返回值:(取值范围)
除了月中的日(Date),是从1开始到31结束
其余都是从0开始,到进制-1结束
比如:
Month: 0~11 在赋值或取值时都要修正
Date: 1~31
Hours: 0~23
Minutes/Seconds: 0~59
Day: 0~6 日,一,二,...,六 不用修正
2.计算:
1). 两日期对象可相减,结果毫秒差
2). 对任意分量做加减:3步:
1. 取分量: date.getXXX();
2. 做加减:
3. set回去: date.setXXX(n)
简写: date.setXXX(date.getXXX()+n)
3.日期转字符串:
date.toString() 转为当地时间的完整格式
date.toLocaleString() 转为当地时间的简化版格式
date.toLocaleDateString() 转为当地时间的简化版格式,仅保留日期部分
date.toLocaleTimeString() 转为当地时间的简化版格式,仅保留时间部分
date.toGMTString() 转为国际标准时间(0时区)
pm
1. 错误处理:
- 错误: 程序在执行过程中遇到的异常中断。 当发生错误时,程序会报错,退出。
- 错误处理: 即使发生错误,也保证程序不中断退出的机制。
- 如何:
try{
可能发生错误的正常逻辑
}catch(err){
只有发生错误时才执行的错误处理代码:
//包括: 1. 记录日志:
//2. 提示用户
//3. 保存数据
}finally{
//无论是否出错,都一定会执行的代码
//包括: 释放内存
}
以下是一个简单例子,num.toFixed(d),js中有规定d的范围是0~100,否则会报参数超范围错误。
var n=parseFloat(
prompt("输入四舍五入的数字")
);
var d=prompt("输入小数位数");
try{
alert(n.toFixed(d));
}catch(err){
//alert(err);
}finally{
n=null; d=null;
alert("释放资源");
}
其中err:
一旦try中的程序发生错误,js会自动创建一个Error类型的对象。
Error:专门封装错误信息的对象。
6种:
SyntaxError: 语法错误
ReferenceError: 引用错误,要使用的变量,或对象,没找到。
TypeError: 类型错误,指错误的使用了类型的方法。
RangeError: 参数超范围
URIError,EvalError (少见)
如果可以提前预知错误的原因,就可用if...else...代替try catch
比如刚刚的例子可以这样修改
var num=parseFloat(prompt("输入数字"));
var d=prompt("输入小数位数");
if(d>=0&&d<=20){//try{
var r=num.toFixed(d);
console.log(r);
}else{//}catch(err){
alert("小数位数必须介于0~20之间");
//console.log(String(err));
}
console.log("程序继续执行...");
判断浏览器兼容性:(也可用if...else代替)
try{
new XMLHttpRequest();
提示: 支持Ajax
}catch(){
提示: 不支持Ajax
}
笔试题: try catch中的return(略)
如果finally中有return,则使用finally中的return返回
如果finally中没有return,try中的return,会先获得要返回的值,但挂起,暂不返回。要等待finally中代码执行完,才返回。
主动抛出错误:
何时: 当API的开发者,向API的调用者提示错误时。
如何抛出: throw new Error("信息")
//定义者:甲
function round(num,d){
//!isNaN能判断一个值是不是数字
if(!isNaN(num)&&!isNaN(d)){
return Math.round(num*Math.pow(10,d))
/Math.pow(10,d);
}else{
throw new Error("孙子,参数必须是数字!");//红色警告 程序退出
}
}
//调用者:
while(true){
var num=prompt("输入数字");
var d=prompt("输入小数位数");
try{ console.log(round(num,d));
}catch(err){ alert(err) }//保证不会有红色警告
}
2.Function: js中的一切函数都是一个对象
创建函数: 3种:
1. 声明方式:
function 函数名(参数列表){
函数体;
return 返回值;
} //被声明提前(hoist)
其中:function是创建一个新函数的意思。函数其实是一个对象
函数对象中封装的不是数据,而是代码段。函数名仅是引用函数对象的普通变量
以下是一个练习声明提前的例子
console.log(fun()); //输出什么?
function fun(){return 1};
console.log(fun());//输出什么?
function fun(){return 2};
var fun=100;
console.log(fun());//输出什么?
当js自动将其声明提前之后会发生什么变化,所有var声明的变量和function声明的函数会被声明提前,赋值留在原地
function fun(){return 1};//创建函数对象,将地址保存在变量fun中
function fun(){return 2};//创建一个函数对象,将地址保存在变量fun中
var fun;//啥都没干
console.log(fun());
console.log(fun());
fun=100;//fun的类型由函数变成了数字
console.log(fun());
2. 函数直接量:
var 函数名=function(参数列表){...}
不会被声明提前。
何时: 如果不希望函数定义被提前时,就必须用直接量。
同上一个简单例子
console.log(fun()); //直接报错,因为声明提前后未定义,undefined后不可以加()
var fun=function(){return 1};
console.log(fun());
var fun=function(){return 2};
var fun=100;
console.log(fun());
更改顺序后又是什么结果?
var fun=function(){return 1};
console.log(fun()); //1
var fun=function(){return 2};
console.log(fun());//2
var fun=100;
console.log(fun());//报错
3. 用new:
var 函数名= new Function("参数名1",...,"函数体")
何时: 如果函数的参数名和函数体可能在运行时动态生成。
以下是一个用这个方法写的自定义排序法。(此种方法实际不用,面试题会考)
//function cmp(a,b){return a-b};
//var cmp=function(a,b){return a-b};
var cmp=
new Function('a','b',"return a-b");
var arr=[2,12,3,23,123];
console.log(arr.sort(cmp));
***重载(overload): 相同函数名,不同参数列表的多个函数,在调用时,可根据传入的参数不同,自动选择对应的函数执行。
- 为什么: 为了减少函数的个数,减轻使用者的负担。
- 如何: js中默认不支持重载的语法
- 变通: arguments对象
var checkout=function( ){
//arguments[ , , , ...]
//如果0个参数
if(arguments.length==0){
console.log("微信支付");
}else if(arguments.length==1){
//否则,如果1个参数
console.log("现金支付");
}else{//否则
console.log("刷卡支付");
}
}
checkout();
checkout(100);
checkout("xxxx xxxx xxxx","123456");
定义一个add函数,使用arguments对象计算该方法接收到的所有参数的算术和。
function add(){
//遍历arguments中每个参数,同时声明变量sum为0
for(var i=0,sum=0;
i<arguments.length;
sum+=arguments[i++]);
//将当前参数值累加到sum上
//(遍历结束)
return sum;//返回sum
}
console.log(
add(1,2,3,4),//10
add(1,2,3,4,5,6)//21
);
函数中自动创建的,接收所有传入函数的参数值得类数组对象。
类数组对象: 长的像数组的对象vs 数组:
相同:
1). 用下标访问元素
2). length属性
不同: 不是数组类型,无法使用数组类型的API。