函数
Number()/parseInt()/parseFloat()/alert()/prompt()...
函数分为系统函数和自定义函数
函数:是一个功能体,需要提供若干个数据,返回结果,用于封装重复执行的代码 —— 煎饼机
1.1创建普通函数
function 函数名称(){ 函数体 —— 封装的代码}
function laba(){
//函数体
console.log('又香又脆的煎饼');
console.log('所有煎饼一律15折');
console.log('快来买吧');
}
//调用
//laba();
1.2创建带有参数的函数
function 函数名称(参数列表){ //用于接收外部传递的数据 函数体}
函数名称(参数列表) //实际传递的数据
创建函数时的参数称为*形参*,调用函数时的参数称为*实参*,实参会赋值给形参,形参的数量可以和实参的数量不匹配,如果形参未赋值为undefined
function add(a,b){//形参
//console.log(a+b);
console.log(a,b);
}
1.3创建带有返回值的函数
function 函数名称(参数列表){ 函数体 return 值; //返回值,函数调用后得到的结果}
return用于函数调用后得到的结果,如果函数中没有return或者return后没有加值,得到的结果是undefined;一旦return执行,就会跳出函数,结束函数的执行。
function getMax(a,b){
//判断a和b的大小
/*
if(a>b){
return a;
}else{
return b;
}
*/
return a>b ? a : b;
}
使用switch-case
1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪
*对比return和break*return是用于跳出函数,结束函数的调用break是用于跳出循环、switch-case,结束对应语句的执行
//练习:创建函数getStatus,传递订单的状态码,返回对应的汉字状态
//使用switch-case
//1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪
function getStatus(n){
switch(n){
case 1:
return '等待付款';
//break;
case 2:
return '等待发货';
//break;
case 3:
return '运输中';
//break;
case 4:
return '已签收';
//break;
case 5:
return '已取消';
//break;
default:
return '无法追踪';
}
}
练习:创建函数isRun,传递任意一个年份,返回是否为闰年(布尔型的值)
2.变量的作用域
局部变量:在函数内的作用域称为函数作用域,里边的变量就是局部变量
全局变量:在函数外的作用域称为全局作用域,默认一个js文件下就是在一个全局作用域下,里边的变量就是全局变量
局部变量只能在当前的函数作用域下访问到,全局变量可以在任意的作用域下访问到
在函数中不加var声明的变量是全局变量 —— 不推荐
变量提升,程序执行前,将var声明的变量提升到所在作用域的最前边,赋值不提升
3.函数的作用域
全局函数:在*全局作用域*下创建的函数,可以在任意作用域下调用
局部函数:在*函数作用域*下创建的函数,只能在所在的函数下调用
函数提升:程序执行前,会将函数*整体提升*到所在作用域的最前边
4.递归
是在函数内调用自身这个函数
递归的使用:要有边界条件(跳出条件或者循环次数),否则是死循环
结合着return
递归解决的是循环的问题。
var count=0;
function say(){
console.log('从前有座山');
count++;
if(count===3){
//跳出函数,结束函数
return 3;
}
return say(); //函数内部调用自身
}
5.匿名函数
function (){ }
(1)创建函数
函数声明function fn(){ } |
---|
函数表达式var fun=function(){ } |
*函数名称**(**)*和*函数名称*的区别
函数名称() 调用函数,执行一次函数体中的代码,得到返回值
函数名称 代表一个变量,保存了一个函数
练习:使用函数表达式创建函数getSum,计算任意两个数字之间所有整数的和
*对比函数声明和函数表达式的区别*
函数声明存在函数的整体提升,可以先写调用再写创建
函数表达式不存在函数提升,必须先写创建再写调用
//var c=function(){}var c=3;function c(){ console.log(2);}c(); //报错,c不是一个函数
(2)匿名函数自调用
(function(形参列表){ //函数作用域,里边的变量都是局部的,防止全局污染})(实参列表);
(function(a,b){
console.log(a+b);
})(3,5);
(3)回调函数
回调函数是将一个函数(函数名称或者匿名函数)以实参的形式传递
1. 将函数名称以实参的形式传递到函数内部
function tao(madai){ //madai为函数名字,传递函数名后,函数内部可调用
console.log('涛哥开始跑第1棒');
console.log('涛哥到达第1棒终点');
//调用传递进来的回调函数
madai();
}
?
2.将匿名函数以实参的形式传递进入函数
tao( function(){
console.log('陌生人开始跑...');
} );
function tao(madai){ madai(); //调用传递进来的回调函数}function dong(){ }tao( *dong* )tao( function(){ } )
6.系统函数(全局函数)
parseInt/parseFloat/Number
isNaN() 检测一个值转数值后是否为NaN,如果是返回true,不是返回false
isFinite() 检测一个值是否为有限值,如果是返回true,不是返回false(判断一个值是否是无穷大)
只有无穷是无限值,其它都是有限值
3/0 // Infinity 无限值
eval() 执行字符串表达式
encodeURI() 对应网址中的中文编码
decodeURI() 对用中文解码
var str = "http://www.jd.com/search?kw=电脑"
var str2 = encodeURI(str) 中文编码
var str3 = decodeURI(str2) 对用中文解码
7.对象
对象属于引用类型的数据
对象是一组属性和方法的集合,具体到某一个
一部手机属性有品牌、型号、颜色、尺寸、内存大小、cpu... 方法有聊天、玩游戏、看视频、办公、学习...
涛哥属性有身高、体重、发色、肤色、户籍... 方法有摊煎饼、养兔子、敲代码、接力赛...
万物皆对象
7.1JS中的对象
自定义对象,程序员创建的对象
内置对象,JS提供的对象
宿主对象,根据不同的执行环境划分
7.2自定义对象创建方式
对象字面量 {}
内置构造函数 new Object()
自定义构造函数
7.3对象字面量
{ 属性名1:属性值1, 属性名2: 属性值2.... }
//对象字面量 var phone={ brand:'华为', //属性名可不加引号,但是若是有特殊符号(不符合变量命名规则的)必须加引号 color:'黑色', 'size':6.3, '2cpu': '麒麟9900' }; 访问属性方式: 对象.属性名 phone.brand 对象[ '属性名' ] phone["brand"] 如果属性名不存在则返回undefined 修改属性值: phone.color = "白色" phone["brand"] = "vivo" 添加一个不存在的属性 phone.num="P30"; phone["num"]="P30";
属性名的引号可以省略,如果含有特殊字符必须加加引号
7.4属性的访问
对象.属性名
对象[ '属性名' ]
如果属性名不存在则返回undefined
7.5内置构造函数创建对象
new Object() 返回一个空对象,需要单独的添加每个属性或者方法
使用new调用的函数称为构造函数,返回一个对象。
练习:创建一个员工的对象,包含的属性有编号,姓名,性别,工资
//内置构造函数 //练习:创建一个员工的对象,包含的属性有编号,姓名,性别,工资 var emp=new Object(); //{} emp.eid=1; emp.ename='涛哥'; emp['sex']='男'; emp['salary']=45000; //console.log(emp);
7.6遍历属性
依次访问对象中的每个属性
for(var k in 对象){ k 每一次获取的属性名 对象[k] 属性名对应的属性值}
//遍历属性 //for-in循环 for(var k in emp){ //k每次获取的属性名 console.log(k,emp[k]); }
7.7 判断对象属性是否存在
//练习:创建一个商品对象,包含属性有标题、价格,如果价格存在,在当前基础之上打九折,如果产地属性不存在,添加该属性;最后打印对象
var laptop={
title:'小米Air',
price:4300
};
//如果存在 判断方法1:使用hasOwnPropertity方法判断
if( laptop.hasOwnProperty('price') ){
laptop.price*=0.9;
}
//如果不存在 判断方法2:使用对象.属性的值和undefined对比,true为没有该属性,false为有这个属性
if( laptop.madeIn===undefined ){
laptop.madeIn='中国';
}
console.log(laptop);
?
//判断方法3 使用 “属性名” in 对象名 存在返回true,不存在返回false
console.log("title" in laptop)
var person={
name:'涛哥', //成员属性
play:function(){ //成员方法
//this指的是当前调用方法的对象
console.log(this.name+'正在玩单杠');
},
tan:function(){
console.log(this.name+'正在摊煎饼');
}
};
//console.log(person);
//调用
//person.play();
//person.tan();
7.7 对象的引用
//销毁引用类型数据,释放内存空间
tao=null;//空地址
?
dong=null;//空地址