1、变量
(1)变量的提升
引例:①.console.log(num1); 报错:没有定义
②.console.log(num1); undefind
var num1=6;
原因:javascript引擎的工作方式:先解析代码,获取所有被声明的变量。所有的变量的声明语句,都会被提升到代码的头部
ps:变量提升只对var命令声明的起作用
(2)变量的作用域
没有用var声明的写在函数内部的全局变量,只有在该函数被执行时,才是全局变量
例:① if(ture){var aa='bb'; } console.log(aa);//结果是bb.
② for(var i=0;i<100;i++){//...} console.log(i);结果:100
改写成varj=0; while(j<100){//... j++} console.log(j); 结果:100
因:if/for声明的是全局变量
(3)一等公民
js中的函数与其他数据类型(数字,字符串,布尔值等)处于同等地位,可以使用其他函数的地方就能使用函数
例如:赋值、传参、作为返回结果等
将函数赋值给变量:
var func1 = function(){};
将函数赋值给对象的属性:
var people = { ability:null };
people.ability = function(){console.log("吃");};
people.ability();//吃
将函数作为参数传入其他函数:
function introduce(Func){Func();}
function sayHello(){console.log(“hello”);}
introduce(sayHello);//hello
将函数作为函数的结果返回:
function jiSuan(){ return sum(4,10);}
function sum(num1,num2){ return num1+num2; } console.log(jiSuan());//14
(4)函数名的提升
只有function命令声明的函数才会出现该现象
qiuHe(1,2);
function qiuHe(a,b) { console.log(a+b); }//3
////////////////////
qiuHe(1,2);
var qiuHe = function(a,b){ console.log(a,b); };//qiuHe is not a function
(5)函数内的变量提升
在函数作用域中,var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部
总结:
作用域之间相互独立,一个作用域中创建的局部变量不能在另一个作用域中生效(一个变量一个作用域)
(6)*(了解)函数参数的默认值
function func(num){
(num!==undefind&&num!==nul)?num=num:num=1;
return num;
}
三目运算符和逻辑判断,实现了当函数参数没有传值的时候给参数赋初值
2.内存
(1)【值传递】和【地址传递】
原始数据类型(数值、字符串、布尔值)的内容传递方式是传递
而复合数据类型(数组、对象、其他函数)的内容传递是地址传递
(2)函数的同名参数
若函数有同名的参数,则取最后出现的那个参数值
若有两个参数,却只提供了一个参数则第二个参数变为了undefind
(3)argument对象
argument对象包含了函数【运行时】的所有参数,能读能写
argument[0]就是函数的第一个函数,argument[1]是第二个,依次类推
只有在【函数内部】才可以使用
ps:虽然argument很像数组,但它是一个对象
(4)eval函数
eval()函数,将字符串当作语句来执行
语法:eval(string)
【注】只接受【原始字符串】作为参数,若string不是原始字符串,则该方法将不作任何改变的返回
例:
eval('var num = 100;');
console.log(num);// 100
(5)instanceof类型检测
用来判断一个变量是否是某个对象的实例,结果为ture||false(typeof检测是是什么类型)
(6)JS垃圾回收机制
3、Math对象(JS内置对象)
Math对象不是构造函数,所以不能生成实例,故所有属性和方法必须在Math对象本身上调用
ps:提供了一系列的数学常数(属性)和数学方法
(1)Math对象属性:Math对象的属性表示只读的数学常数(随用随查)
例:Math.E 常数e
Math.PI π的值
(2)Math对象的方法
【Math.round()方法】:(依据参数的绝对值)四舍五入
【Math.floor()方法】:返回小于参数值的最大整数(向下取整)
【Math.ceil()方法】:返回大于参数的最小整数
【Math.max()方法】:返回最大的参数
【Math.min()方法】:返回最小的参数
【Math.ramdom()方法】:返回0~1之间的一个伪随机数
ps:可能等于0,但一定小于1
其他补充:
【三角函数方法】
Math.sin方法返回参数的正弦
Math.cos方法返回参数的余弦
0Math.tan方法返回参数的正切。
Math.asin方法返回参数的反正弦
Math.acos方法返回参数反余弦
Math.atan方法返回参数反正切
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0
需要注意的用法:
①获取min~max之间的值(不包括max)
function getRandomNumber(min, max) {
return Math.random() * (max - min) + min;
}
②获取min~max之间的值(包括max)
function getRandomIntNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
4、Date对象
Date对象是JS提供的日期和时间的操作接口
JS内部,所有的日期和时间都存储为一个整数。(这个整数是当前时间距离1970年1月1日00:00:00的毫秒数,正负范围为基准时间前后各1亿天)
(1)Date()函数
可以被Date对象直接调用,返回一个当前日期和 时间的字符串
ps:无论有没有参数,直接调用Date总是返回当前时间
(2)Date(日期字符串|日期参数)构造函数
Date对象是一个构造函数,对他使用new命令,返回一个Date对象的实例
【若不加参数,生成的就是代表当前是时间的对象】
语法:var date1=new Date();
【若添加一个日期字符串作为参数,返回字符串对应的时间】
【若添加日期参数,返回字符串所对应的时间】
语法:var date2=new Date(year,month,day,hours,minutes,seconds,ms);
【注】月份下标从0开始,年份和月必须写
一些其他合法的日期字符串写法
new Date(datestring)
new Date("2013-2-15")
new Date('2013/2/15')
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013")
Sun Jan 06 2013 00:00:00 GMT+0800 (中国标准时间)
(3)日期运算
两个日期相减,返回间隔毫秒数;
两个日期相加,返回连接后的两个字符串;
结合:setInterval(function(),mstime);定时器来编写限时秒杀活动倒计时
(4)日期对象的get*系列方法
getTime():返回实例对象距离1970年1月1日00:00:00对应的毫秒数,等同于valueOf方法
getDate():返回实例对象对应每个月的几号(从1开始)
getDay():返回星期几,星期日为0,星期一为1,以此类推
getYear():返回距离1900的年数
getFullYear():返回四位的年份
getMonth():返回月份(0表示1月,11表示12月)
getHours():返回小时(0-23)
getMilliseconds():返回毫秒(0-999)
getMinutes():返回分钟(0-59)
getSeconds():返回秒(0-59)