一.Math对象
特点:不能new!
// Math:专门封装了数学计算所常用的量,并且提供了数学计算所用的API
// 要做数学运算的时候使用
console.log(Math.PI);
// 取整的API
var num = 123.9568;
// 1.Math.ceil(num)向上取整 取num的下一个整数
console.log(Math.ceil(num));//124
// 2.Math.floor(num)向下取整,省略小数部分 将参数都转换为数字,取整
console.log(Math.floor(num));//123
// parseInt(str) 将一切都转换为字符串 ,再按位读取字符
console.log(parseInt(num));
// Math.floor("12.5px") ==>Math.floor(Number("12.5px")) ===>Math.floor(NaN) ==> NaN
var p = Math.floor("12.5px");
console.log(p)
var x = parseInt("12.5px");
console.log(x)
console.log(Math.floor(true));//1
// 3.Math.round(num) 四舍五入取整 缺点:只能取整! 优点:返回的是数字,可以直接加减
console.log(Math.round(num));//124
// toFixed(d) 按任意小数位四舍五入 缺点:返回值是字符串 ,必须先转换为数字,才能计算 优点:可以按照任意小数位四舍五入
console.log(num.toFixed(1));
// 随机数 返回的是0~1之间的任意一个数
console.log(Math.random());
// 随机一个整数的套路(0~n): Math.floor(Math.random()*(n+1))
// 乘方和开平方
// 乘方: Math.pow(底数,幂)
console.log(Math.pow(2,2));
// 开平方 Math.sqrt(n);
console.log(Math.sqrt(9));
// 最大值和最小值 参数不止数组
console.log(Math.max(10,20,3,5,60));
console.log(Math.min(10,20,3,5,60));
Math对象练习题
1. 如何自定义四舍五入的方法 要求是能根据任意小数位四舍五入
<script type="text/javascript">
var a = Number(prompt('请输入一个小数:'));
var b = Number(prompt("请输入按几位小数四舍五入"));
a = a.toFixed(b);
alert(a);
</script>
2. 算术计算的游戏,随机出十道题,接受用户答题,答对一题得10分,错一题扣10
如果输入的是exit,退出游戏最终给出得分
<script type="text/javascript">
//定义一个变量存放得到的分数
var sum = 0;
//定义一个空数组存放随机产生的数
var num = [];
//循环
for(var i = 1;i<=10;i++){
//数组中只接受两个数
while(num.length<2){
//在0~100之间随机产生数字
var r = Math.floor(Math.random()*100);
//把随机数放到数组中
num.push(r);
}
//接受用户答题
var result = prompt("请输入"+i+"题,"+num[0]+"+"+num[1]+"的答案:");
//如果回答正确
if(result == num[0]+num[1]){
sum +=10;
alert('回答正确,'+"得10分");
//输入"exit"退出答题
}else if(result == "exit"){
break;
//如果回答错误
}else if(result != num[0]+num[1]){
sum -= 10;
alert('回答错误,'+'扣10分');
}
}
alert("您最终得分为:"+sum);
</script>
二.时间对象
// Date对象的原理:对象保存为一个巨大的毫秒,起始时间为: 1970年1月1日0点至今的毫秒数
//封装了一个时间操作API
//存储和获取时间的时候使用Date对象//创建方式:
// 1、 自动获取客户端系统的时间 --服务器时间 -- 数据库时间
var now new Date( );console.Log(now);
// 2、创建自定义的时间var date = new Date("yy/MM/dd hh :mm:ss");
var date = new Date("2019/07/31");console.Log(date);
// 3、赋值一个日期对象
var date1 = new Date("9102/08/01 16:40:30");
var date2 = new Date (date1);console. Log (date1,date2);
// 4、用毫秒数创建日期对象
var date = new Date(ms)
// console. log(now. getTime())
var ms = now. getTime();
var date3= new Date(ms);console. Log(date3);
//两个日期对象相减:得到毫秒数console. Log (now-date) ;
//单位:每个单位都有一对get / set方法// FullYear 年份
// Moth 月份 0-11
// Date 日期 1-31
//Day 星期 0-6没有set方法
// hours 小时 0- 24
// Minutes 分钟 0-59
// Seconds 秒 0-59
// Milliseconds 毫秒
时间对象练习题
3.计算两个时间之间相差的小时数
<script type="text/javascript">
var startTime = new Date('2019-8-1 00:00:00'); // 开始时间
var endTime = new Date(); // 结束时间
console.log(Math.floor((endTime - startTime) / 1000 / 60 / 60)); // 小时
</script>
4.当前时间格式化为: xxx年xx月xx日 星期x am/pm hh:mm:ss
<script type="text/javascript">
var myDate = new Date();
var year = myDate.getFullYear(); //获取完整的年份
var month = myDate.getMonth()+1; //获取当前月份(0-11,0代表1月)
var date = myDate.getDate(); //获取当前日(1-31)
var day = myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
var hours = myDate.getHours(); //获取当前小时数(0-23)
var min = myDate.getMinutes(); //获取当前分钟数(0-59)
var ses = myDate.getSeconds(); //获取当前秒数(0-59)
if(hours<12){
var h = 'am';
}else{
var h = 'pm';
}
var arr = [year,month,date,day,hours,min,ses,h];
console.log(arr[0]+"年"+arr[1]+"月"+arr[2]+"日,星期"+arr[3]+" "+arr[7]+arr[4]+":"+arr[5]+":"+arr[6]);
</script>
三.Function函数
11个内置对象有哪些?
String Number Boolean Array RegExp Error Date Math Function Object global(window)
Function 一切函数都是对象
// 封装了可重复使用的代码块对象,函数名只不过是一个引用函数对象的变量
var a = 10;
// 1.创建01
// 什么时候要将代码封装起来?独立的且可以反复执行的内容
// 什么是需要使用参数?只要函数执行就必须使用的某些数据,否则无法正常执行 这些数据就定义为参数
// 什么时候需要使用返回值?如果函数的调用者需要函数执行的结果,函数就必须有返回值
// 声明:function 函数名(参数列表){函数体;return 返回值;}
// 2、创建02 直接量!不希望函数体被提前声明时
// var 函数名 = function(参数列表){函数体;return 返回值;}
// var fun;
// console.log(fun());//报错 变量的提前声明
console.log(fun);//undefined 证明了函数名就是一个变量
var fun = function(){
console.log(1);
}
fun();
// 声明提前:在程序开始执行前,都会将var声明的变量和function声明的函数都提到当前作用域中,赋值保留在原地
// 3、创建03 用new
var fun2 = new Function("a","b","return a+b;");
// 强调:所有形参必须放在" "中
console.log(fun2(2,3));
var fun3 =Function("a","b","return a-b;");
console.log(fun3(9,3));
// 请问一下创建函数正确的是:
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 cmp = new Function("a","b","return a-b");
四.重载
什么是重载?
相同函数名,不同参数列表的多个函数 在调用时,可以根据传入的参数的不同,自动选择对应的函数调用!
一个函数名,执行过个操作
when 一个任务,根据不同的参数,执行不同的操作流程
function pay( ){
// arguments[ ]
console.log(typeof(arguments));
// 如果参数个数为0
if(arguments.length == 0)
console.log('扫码支付')
// 如果参数个数为1
else if(arguments.length == 1)
console.log("现金支付" + arguments[0]);
// 否则参数个数为2
else if(arguments.length == 2)
console.log('刷卡支付,卡号:'+arguments[0]);
}
pay();//扫码支付
pay(100);//现金支付
pay("1111268686","123456");//刷卡支付
问题:js语法不支持重载效果,不允许多个重名函数存在(存在也会被最后的覆盖)
// 解决:arguments 对象 所有函数对象内,都自动创建了一个arguments对象
// arguments对象:专门保存传入函数的所有参数值得类数组对象
// 类数组对象(object like array)
// 和数组的相同之处: 下标 length属性 for遍历
// 不同: 类数组对象是Object,不是Array,无法使用Array的API
// 数组是Array类型,可以使用自己的API
//计算参数的总和
function sum(){
var sum=0;
// 判断arguments是否有参数
if(arguments.length>0){
// 将参数累加
for(var i =0;i<arguments.length;i++){
sum += arguments[i];
}
}
return sum;
}
五.作用域
作用域(scope):一个变量的可用范围
1、全局作用域window:全局变量
随处可见,反复使用 ==>全局污染
2、函数作用域:局部变量
局部变量(AO:Action Object):仅在函数内可用,不可以反复使用
函数生命周期:
1)开始执行前(生命提前阶段)
创建执行环境栈(数组):临时保存正在执行的函数的执行环境
向执行环境中添加第一个默认程序main(),该方法创建出一个全局作用域的对象window
2)定义函数时
创建函数对象,封装函数的定义
声明函数变量,引用了函数对象,函数对象的scope属性引用回,创建函数时的作用域
3)调用函数时
在ECS中加入一个新的元素(执行环境)记录新函数的调用
创建一个活动对象,保存本次调用用到的局部变量(函数的参数,在函数体内使用var关键字声明的数据)
ESC中的新执行环境元素 ,引用活动对象
活动对象中的parent属性引用函数的scope指向的父级作用域对象
作用:在执行过程中优先使用活动对象中的局部变量,局部中没有,才延着parent向父级作用域找
4)调用函数后
执行环境栈中本次函数的执行环境出栈
导致活动对象被释放,导致局变量一同释放
作用域链
右多级作用域连续引用形成的链式结果
掌握一切变量的使用顺序 :先在局部照,没有则延作用域链向父级作用域中找
六.匿名函数
不指定函数名的函数
节约内存 一个函数只用一次,用完了就自动释放
比如:
1.回调 callback 将函数作为参数传递给另一个函数去调用
arr.sort(function(a,b){return a-b})
str.replace(/reg/g,function(kw...){return...})
2.自调:创建函数以后立刻自动调用自己
一个函数只执行一次,不会再重新使用。
意义:建立临时作用域!避免全局污染!!!!
调用:2种
1.(function(参数列表){函数体 return返回值})()
2.+function(参数列表){函数体 return 返回值}()
七.闭包
// 全局变量:可以反复使用,随处可用 -- 全局污染
// 局部变量:不可以重用 ,只在函数中使用
// 闭包:即重用变量,又保护变量不被污染的一种机制
// 取号
// 1、用外层函数包裹受保护的变量和操作变量的内层函数
function outer(){
var i = 1;//活动对象,函数作用域
i = i + 2;//3
// 2、外层函数将内层函数返回
return function getNum(){
console.log(i++);
}
}
// 3、使用者调用外层函数,获得内存函数的对象
var getNum = outer();
//getNum:function getNum(){console.log(i++)}
// 问题:outer()结束后,outer的活的对象释放?
getNum();//1
getNum();//2
getNum();//3
//......
i = 1;//window对象下的变量
getNum();//4
getNum();//5
缺点:比一般函数占用更多内存
简易的闭包流程图
1、先找到受保护的变量,判断外层函数执行后变量的结果
2、再找操作变量的内层函数
1)被外层函数return到外部
2)也可通过直接给全局变量赋值