对象:JS中的所有事物都是对象:字符串、数值、数组、函数…
尽量少的使用全局变量
var family = {
name : "xy",
age : 14,
xxx : function(){
console.log("对象中的函数");
}
}
生成一个新对象的方法:
var a1 = new Object(); //不常用
var a2 = {}; //常用
给对象赋值:
a1.name = "xxx";\
a1['name'] = "aaa";
也可以通过上面的方式新增对象的属性。
删除对象的属性:
delete a1.name;
判断对象中是否有某属性:
// 有返回true 没有返回false
console.log("name" in a1);
遍历对象:
for (var p in xy){ }
更多用法查询for…in…的用法。
var xy = {
name: "a1",
age : 13,
oph : "110"
}
for(var p in xy){
console.log(p);
console.log(xy[p]);
}
什么是函数:
一次定义(封装),四处调用(使用)。
function add(num1,num2){} //命名函数
window.onload = function(){} //匿名函数
在调用函数的时候,发生了什么?
调用的时候,在调用下建立一个临时函数,执行完之后销毁回收。
使用函数的好处:
统一修改,增加函数的可读性。
函数的本质
可以给函数添加属性,有时候会用到。
function add(){}
add.name = "xy";
作为数据使用:
把函数赋值给一个变量时,应该把函数名舍弃,使用变量名访问。
var add = function(){};
作为参数使用:
setTimeout(
function(){
console.log(1);
},1000)
加不加括号的区别:
⭐⭐⭐⭐⭐
function add(){}
console.log(add); //不加括号就把函数的本体传进去
console.log(add()); //加括号就是把函数执行了
setTimeout(fn,1000);
function fn(){
console.log("1");
}
作为返回值输出的例子:
三种定义的方式
调用函数之前一定要先定义,这里的先不是定义先,而是在js解析器里的先。
function xy(){}; //function声明
var xy = function(){} //var赋值表达式
var add = new Function('num1','num1','return num1+num2'); //构造函数
三种定义方式的区别:
预解析上的区别:
第一种可以上边调用下边定义。
console.log(fn);
function fn(){return 1;}
第二种不可以,因为预解析,详情看前一章。
递归调用:
方法的调用
直接调用
间接调用
函数的参数
形参、实参
实参比形参少的时候:
function add(num1,num2){} //形参两个
add(1); ///实参一个
按照顺序来填入,num2为空,可以进行判断给出默认。
function pow(num1,num2){
if(!num2) num2=2; //一、如果没有传入值,那么num为2
num2 = num2 || 2; //二、对错判断
return Math.pow(num1,num2);
}
实参比形参多的时候:
⭐⭐⭐传入不确定个数参数时候,怎么定义函数:
// arguments 的使用方法
function add(){
if(arguments.length == 0) return;
var sum = 0;
for(var i =0;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
add(1,2,3,4,5,6);
arguments
会把传递进来的所有参数编写进数组里。
每个函数中都有且独立,是一个类数组对象。
尽量不要再函数里对arguments
进行直接修改删除。
arguments.callee
指代函数本身
在递归的时候,可以使用这个,比较常用,最常用,但是在严格模式中会出问题。
什么可以做参数
- 什么都不传
- 数字
- 字符串
- 布尔值
- null
- 数组
- 对象
return
两个作用:
函数的结束,放在函数的最后。
将值返回。
拓展:continue(结束本次循环)和break(结束循环)
什么可以作为返回值
- 什么都不返回
- 数字
- 字符串
- 布尔值
- null
- 数组
- 对象