1-0基本知识
1-1 函数
1-1-1 函数的定义
函数声明
function fn(){ }
函数声明的函数可以再任意地方使用函数表达式
var fn = function(){ }
函数表达式定义的函数只能在定义之后使用
1-2-1 函数返回值
- 有返回值
function fn(){
return 100 ;
}
var num = fn() ; //num值等于fn函数的返回值100
- 没有返回值
function fn(){ }
var num = fn() //num值等于undefined,函数没有返回值则默认是undefined
- 当返回值是一个函数
function fn(){
return function(){
console.log( 100 );
}
}
var f = fn() //f得到的是一个函数function(){ console.log(100) }
//既然f是一个函数,那么就可以调用
f() //执行return 后面的函数,打印了100
1-2-2 函数的参数
//a和b是sum函数的形参,用来接收实参
function sum( a , b ){
var c = a + b ;
return c ;
}
//1和2是实参,传入1,2之后函数的形参接收,a接收1,b接收2
sum( 1 , 2 ) ; //调用函数之后,此刻sum(1,2)整体就等于返回值
//实参个数比形参个数少
function fn( a , b ){
var c = a + b ;
return c ;
}
console.log(fn(1)); //undefined
//实参个数比形参个数多
function fn( a , b ){
//arguments是伪数组,具有数组的特点,不具备数组的操作方法
var c = a + b + arguments[2] ;
return c ;
}
console.log(fn(1,2,3)); //6
1-2 预解析和变量声明提升
- 所谓 预解析 指的就是在执行之前对代码的分析, 检查看是否有错误, 然后对变量进行提升.
因此在预解析的时候, js 引擎做了两件事项, 1> 检查语法是否有问题; 2> 提升声明.
1-2-1 预解析的过程
1> 当浏览器打开后, 会读取 html 等文件, 同时读取 js 的代码, 以字符串的形式进行读取.
2> 在浏览器内部有一个被称为 js 引擎的东西( v8 引擎 ), 它会读取该字符串, 并将其解析成可以执行的代码.
javascript 引擎就是将 js 形式的字符串转换为可以使用的代码, 可以执行的代码的应用程序.
3> 在解析的过程中, 首先会将代码通篇读取一遍, 这个就是预解析
在 预解析过程中检查错误, 出现错误就会报错( 注意不是异常 )
同时会将 所有的声明记录下来.
4> 在预解析没有问题的时候, 才会从头开始一步一步的解释执行代码.
1-2-2 声明
声明的含义原本是说, 告知已让大家都知道有什么存在.
在 js 中 什么是声明呢?
- 变量
- 函数
变量的声明是让计算机在使用某变量的时候, 知道用什么东西
函数的声明是让计算机在调用函数的时候, 知道执行什么代码
变量的声明只会提升变量名不会提升变量值
函数声明的时候会提升函数名和函数体(函数表达式属于变量声明只提升变量名不提升函数体)
- 预解析阶段出错
//首先预解析,发现浏览器不认识fuction
//console.log不会打印因为在预解析阶段就出错了
//将错误信息输出到控制台
console.log(1);
fuction fn(){ }
- 执行阶段出错
//首先预解析,发现浏览器不认识fuction
//console.log不会打印因为在预解析阶段就出错了
//将错误信息输出到控制台
console.log( fm );
function fn(){ }
- 全局变量与局部变量
var num = 10 ;
function fn(){
console.log( num ); //10
num = 20 ;
};
fn()
var num = 10 ;
function fn(){
console.log( num ); //undefined
var num = 20 ;
};
fn()
1-3 递归
1-3-1 递归的定义
一个函数直接或间接调用自身
- 直接调用自身
function fn(){
console.log( '我是fn函数' );
fn()
}
fn() ;
- 间接调用自身
function fn(){
console.log( '我是fn函数' );
fm() ;
} ;
function fm(){
fn() ;
}
fn() ;
1-3-2 案例1:求奇数
//求奇数(1,3,5,7,9,11,13,15),如第5个奇数是9,求第100个奇数是多少
function foo ( n ) {
if ( n == 0 ) return 1;
return foo( n-1 ) + 2;
}
console.log( fn(100) ); //201
1-3-3 案例2:求2的n次方(1,2,4,8,16,32,64)
function fn( n ){
if( n == 0 ) { return 1 } ;
return fn(n) * 2 ;
}
console.log( fn(3) ); //8
1-3-4 案例3:求斐波那契数列(1,1,2,3,5,8,13,21)
function fib( n ) {
if ( n === 0 || n === 1 ) return 1;
return fib( n-1 ) + fib( n-2 );
}
console.log( fib(4) ); //5
1-4 对象
1-4-1 创建对象的方法
- new
var dog = new Object() ;
dog.name = '小狗' ;
dog.age = 2 ;
dog.say = function(){
console.log( '汪汪' );
}
//调用方法
dog.say() ; //控制台打印“汪汪”
- 对象字面量
var dog = {
name:'小狗' ,
age:2 ,
say:function(){
console.log('汪汪') ;
}
};
dog.say() ; //控制台打印“汪汪”
- 创建多个对象
function obj (name,age,say){
var ob = new Object();
ob.name = name ;
ob.age = age ;
ob.say = say;
return ob ;
}
var tom = obj( 'tom' , 18 , function(){} );
- 构造函数创建对象
function obj (name,age){
this.name = name ;
this.age = age ;
this.say = function(){
console.log('hello , i am ' + this.name ) ;
};
}
var tom = obj( 'tom' , 18 , function(){} );
var obj = { name:'tom' , age:18 , addr:'usa' } ;
//k只是一个变量名,可以更改
for( var k in obj ){
console.log(k); //打印所有属性 name age addr
console.log(obj[k]); //打印所有属性值 tom 18 usa
//console.log(obj.k); //点语法不能使用变量,即k不能是变量,如果要用变量必须用[k]
}
1-5 内置对象
1-5-1 复杂类型与简单类型
var obj = { name:'tom' , age:19 }
function fn(ob){
ob.name = 'jack' //更改的是tom的名字
ob = { name:'jim' , age:20 }; //ob指向其他对象
ob.age = 22
console.log( ob ) //{ name:'jim' , age:22 }
}
fn(obj) //传入了tom的地址
console.log( obj ) //{ name:'jack' , age:19 }
1-5-2 Math对象
var max = Math.max(1,2,3); //3,最大值
var min = Math.min(1,2,3); //1,最小值
var fl = Math.floor(2.8); //2,向下取整
var ce = Math.ceil(2.3); //3,向上取整
var rd = Math.round(3.5); //4,四舍五入
var ran = Math.random(); //获取随机数,0到1,包左不包右
1-5-3 Date对象
var da = new Date() ;
var year = da.getFullYear(); //获取年份,如2017
var year2 = da.getYear() ; //获取年份,如117(2017年),只有三位数
var ri = da.getDate(); //获取今天几号
var day = da.getDay(); //获取星期,星期天为0
var hr = da.getHours() ; //获取小时,24小时制
var mn = da.getMinutes(); //获取分钟
var sed = da.getSeconds(); //获取秒
var ms = da.getMilliseconds(); //获取毫秒
var msNow = Date.now() ; //获取现在距离1970年的时间,单位毫秒
var psTime = Date.parse('2016-01-01'); //获取2016距离1970年的时间,单位毫秒
console.log(da.toLocaleDateString());//年月日
console.log(da.toLocaleTimeString());//时分秒
console.log(da.toDateString());//是英文的
console.log(da.toTimeString());//是英文的
//封装获取日期的函数
function getDates(dt) {
var str="";//存储时间的字符串
//获取年
var year=dt.getFullYear();
//获取月
var month=dt.getMonth()+1;
//获取日
var day=dt.getDate();
//获取小时
var hour=dt.getHours();
//获取分钟
var min=dt.getMinutes();
//获取秒
var sec=dt.getSeconds();
month=month<10?"0"+month:month;
day=day<10?"0"+day:day;
hour=hour<10?"0"+hour:hour;
min=min<10?"0"+min:min;
sec=sec<10?"0"+sec:sec;
str=year+"年"+month+"月"+day+"日 "+hour+":"+min+":"+sec;
return str;
}
var dt=new Date();
var str=getDates(dt);
console.log(str); //2016年01月19日 12:20:55