大纲
- javascript对象
- javascript函数
javascript函数
官方:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
个人:函数是一组拥有某些特定功能的、能够被重复调用的、闭合的代码块。
在函数外部并不关心函数里面有什么,只关心函数能做什么。
在函数内部并不关心函数外部有什么,只关心要怎么做。
function 函数名(函数参数1,函数参数2,...){
函数内容语句/函数体
}
函数可以没有参数
函数名的命名规则符合变量的命名规则
函数的声明
- [function命令]
function 函数名(参数1,参数2,...){
函数体;
}
可以通过调用函数名来调用函数。
2. [函数表达式]
var 变量 = function(参数1,参数2,...){
函数体;
}
通过访问变量来调用函数。
3.[Function构造函数]
var 变量 = new Function();
}
这种声明函数的方式非常不直观,几乎无人使用。
函数的调用
只要函数已经被声明,直接写出函数名和函数参数即可调用函数。
多次重复声明同名的函数会造成的结果是:后声明的函数会覆盖先声明的函数。
对于javascript来说,把函数调用写在函数声明之前也是被允许的,因为javascript存在一个隐式的函数提升。
函数的类型
- 无参无返回值
- 无参有返回值
- 有参无返回值
- 有参有返回值
返回值:[函数执行结束后]返回到[原本程序中函数所在的位置],用来替代整个函数的[结果],被称为函数的返回值。通常使用return关键词来实现。
形式参数:函数在定义的时候写在小括号中的参数被称为形式参数。形式参数只用来在函数内部使用,在函数外部形式参数失效。通常形式参数不用var声明,直接写变量名即可。
实际参数:函数在调用的时候写在小括号中的参数被称为实际参数
函数的作用域
作用域指的是变量存在的范围。Javascript只有两种作用域:
- 全局作用域:变量在整个程序中一直存在,所有地方都可以读取。
- 函数作用域:变量只在函数内部存在。在函数外部变量失效。
和作用域与之对应的,javascript中有两种变量:
- 全局变量:在函数外部声明的变量,它可以在函数内部读取。
- 局部变量:在函数内部定义的变量,外部无法读取。
函数的补充说明
- ECMAScript规定:不能在非函数的代码块中声明函数。
if(a>0){
function func(){
console.log("nihao"); //wrong way!!
}
}
- 可以使用name属性来获取函数名
function func(){}
console.log(func.name);//func
- 可以使用length属性来获取函数的参数个数
function func(num1,num2){}
console.log(func.length);//2
- 函数中还有一种特殊的函数,叫做自执行函数
(function(){
console.log('hello');
}())
或
(function(){
console.log('hello');
})();
javascript对象
对象是大括号定义的无序的数据集合,由键值对构成,键与值之间用冒号分割,大括号末尾要使用分号表示对象定义结束。
对象是javascript的核心概念,也是最重要的数据类型。javascript的所有数据都可以被视为对象。此外,javascript允许自定义对象。
var obj = {key1:value1,key2:value2};
对象详解
- 键名(对象的属性)
- 键值
- 对象的创建
- 对象属性的读写
- 对象属性的操作
- 对象的引用
键名(对象的属性)
键名也被称为属性(property),对象的所有属性都是字符串,所以加不加引号都可以。
var obj = {'key':value1};
但是,如果属性不符合标识符的条件,则必须加上引号。
var obj = {'1key':value1};
javascript的保留字可以不加引号直接当做对象的属性。
键值
键值是属性所对应的具体的值。javascript的对象的键值可以是任何数据类型。
如果一个属性的值(ability)为函数,通常把这个属性称为“方法”。它可以像函数那样调用这个属性。
var obj={
name:'zhangsan',
age:18,
ablity:function eat(){
console.log('吃饭');
}
};
console.log(obj.ablity());
对象的创建
- 直接用大括号创建对象
var obj1={};
- 使用new命令生成一个Object对象的实例
var obj1=new Object();
- 使用Object.create方法创建对象
var obj1=Object.create(null);
上面三行语句是等价的,都表示创建了一个没有键值对的空对象。
一般来说,第一种采用大括号的写法比较简洁,也是最常用的一种创建对象的写法。第二种采用构造函数的写法清晰地表示了意图,第三种写法一般用在需要对象继承的场合。
对象属性的读写
- 读取属性
读取对象的属性,有两种方法:一种是使用点运算符,还有一种是使用方括号运算符。
var obj = {
key:'value'
};
console.log(obj.key);
console.log(obj['key']);
使用方括号读取对象属性的时候需要加引号!
- 写入属性
点运算符用来为对象的属性写入值。
点运算符和中括号运算符都能够给对象的属性赋值,无论属性是否存在(修改属性值)。
中括号运算符总是能代替点运算符。但点运算符却不一定能全部代替中括号运算符。
- 中括号运算符可以用字符串变量的内容作为属性名。点运算符不能。
- 中括号运算符可以用纯数字作为属性名。点运算符不能。
- 中括号运算符可以用js的关键字和保留字作为属性名。点运算符不能。
对象属性的操作
javascript为对象提供了一系列内置的方法,方便我们更好的操作对象。
方法 | 作用 |
---|---|
Object.keys() | 获取对象所有属性 |
delete | 删除一个属性 |
in | 检查对象是否包含一个属性 |
for in | 遍历对象所有属性 |
with | 操作多个对象属性 |
[Object.keys()]获取对象所有的属性,返回一个属性构成的数组
var obj = {
name:'张三',
age : 18
};
console.log(Object.keys(obj)); //[ 'name', 'age' ]
[Object.keys()]是一个整体,调用的时候必须整体使用。
[delete] 从对象中删除一个属性
语法:delete obj.property
var obj = {
name:'张三',
age : 18
};
delete obj.name;
console.log(obj); //{ age: 18 }
一旦使用delete命令删除某个属性,再读取该属性就会返回undefined。
如果删除一个不存在的属性,delete不报错,而且返回true。千万引起注意!
[in]检查对象是否包含一个属性
语法: ‘key’ in obj
var obj = {
name:'张三',
age : 18
};
console.log('name' in obj); //true
检查的是键名,不是键值。如果包含就返回true,否则返回false。
[for in] 遍历对象的所有属性
var obj = {
name:'张三',
age : 18
};
for(var prop in obj){
console.log(obj[prop]);
}
循环变量prop表示的事对象的属性名,并不表示属性的值!!!
[with]同时操作一个对象的多个属性
with(obj){
key1=value1;
key2=value2;
}
var obj = {
name: '张三',
age: 18
};
with (obj) {
name = '李四';
age = 17;
}
console.log(obj);
with只能够修改对象中已经存在的属性,对于对象中原本不存在的属性with无能为力。
with对于ES6以及ES5中的严格模式都已经禁用了,因为with可能会导致代码更难调试和读取。
对象的引用
如果不同的变量名指向同一个对象,那么它们都称为这个对象的引用稿。
也就是说这些变量共同指向同一个内存地址,修改其中一个变量所指向的值,都会影响到其他变量所指向的值。
var obj = {
fire: 'burn'
};
var obj2 = obj;
var obj3 = obj;
obj.fire = '灭了';
console.log(obj2.fire); //灭了
console.log(obj3.fire); //灭了