目录
1)创建对象:var 对象名 = new Object();
Object
当不属于5种基本数据类型时,都是对象Object
基本数据类型都是单一的值,值和值之间没有任何联系
在JS中如果使用基本数据类型的数据,我们所创造的变量都是独立的,不能成为一个整体
对象属于一种复合数据类型,在对象中可以保存多个不同数据类型的属性
1.分类
1)内建对象:
由ES标准中定义的对象,在任何的ES的实现中都可以使用
比如:Math String Number Boolean Function Object...
2)宿主对象:
由JS的运行环境提供的对象,目前来说主要指浏览器提供的对象
比如:BOM DOM(两组对象)
3)自定义对象:
由开发人员自己创建的对象
2.基本操作
1)创建对象:var 对象名 = new Object();
使用new关键字调用的函数,是构造函数constructor,构造函数是专门用来创建对象的函数
使用typeof检查一个对象时,会返object(null也会)
在对象中保存的值称为属性
2)向对象添加属性:对象.属性名 = 属性值;
var obj = new Object();
obj.name = "孙悟空";
obj.gender = "男";
3)读取属性:对象.属性名
如果读取对象中没有的属性,不会报错而是会返回undefined
console.log(obj.name);
4)修改属性值:对象.属性名 = 新值
obj.name = "tom";
5)删除属性值:delete 对象.属性名
delete obj.name;
3.注意
1)属性名
对象的属性名不强制要求遵守标识符的规范,但使用时尽量按照标识符的规范
如果使用特殊属性名,不能采用.的方式操作,需要使用(对象["属性名"] = 属性值)的方式,读取也采用这种方式
使用[]的形式操作属性更加灵活,在[]中可以直接传递一个变量,这样变量值是多少就会去读取那个属性
obj["123"] = 789;
console.log(obj["123"]);
var n = "123";
console.log(obj[n]);
2)属性值
JS的属性值可以是任意的数据类型,甚至也可以是一个对象
var obj2 = new Object();
obj2.name = "jone";
obj.test = obj2;
console.log(obj.test.name);
in 运算符:"属性名" in 对象名
可以检查一个对象中是否含有指定的属性,如果有则返回ture,没有则返回false
console.log("test" in obj);
3) 栈内存、堆内存
- 基本数据类型:String Number Null Boolean Undefined
修改变量不影响另一个变量
var a = 123;
var b = a ;
a++;
console.log("a =" +a); //124
console.log("b =" +b); //123
- 引用数据类型:Object
修改一个变量影响另一个
var obj = new Object();
obj.name = "tom";
var obj2 = obj;
obj.name = "jone";
console.log(obj.name); //jone
console.log(obj2.name); //jone
-
栈内存、堆内存
JS中的变量都保存在栈内存中(变量名+值)
基本数据类型的值直接在栈内存中保存(变量定义时会给它赋给一个地址)
值与值之间独立存在,修改一个变量不会影响其他变量
对象是保存在堆内存之中的,每创建一个新的对象,就会在栈内存和堆内存中分别开辟出一个新的空间
而变量保存的是内存地址(对象的引用,栈地址中保存:变量名+地址)
如果两个变量保存的是同一个对象的引用,当通过一个变量修改属性时,另一个变量也会受到影响
修改变量的值时,其他的对象不受影响
- 比较
当比较两个基本数据类型的值时,就是比较值
而比较两个引用数据类型时,他是比较的对象的内存地址
如果两个对象一模一样,但内存地址值也不一样,也会返回false
4.对象字面量
创建一个对象:var obj = new Object();
使用对象字面量来创建一个对象: var obj ={};
可以直接在创建对象时,直接指定对象中的属性;属性名可加引号可不加
如果使用特殊名字,则必须加引号
属性名和属性值时一组一组的名值对结构
名和值之间使用:连接,多个名值对之间使用,隔开
如果一个属性之后没有其他的属性了,就不要写,
属性可以嵌套
{属性名:属性值,...}
var obj ={name:"jone",
age:28,
test:{name:"tom"}
};
5.函数
也是一个对象(除了基本数据类型都是对象)
可以封装一些功能(代码),在需要时可以执行这些功能(代码)
使用typeof检查一个函数对象时,会返回Function
1)创造函数对象
- 构造函数
在实际开发中很少使用构造函数来创造函数对象
创建一个函数对象(可以将要封装的代码以字符串的形式传递给构造函数)
var fun = new Function("console.log('hello');");
封装到函数中的代码不会立即执行,会在调用后执行
调用语法:函数对象()
当调用函数时,函数中封装的代码会按照顺序执行
fun();
- 使用函数声明来创建一个对象
语法:
function 函数名([形参1,形参2...形参n]){
语句...
}
function fun2(){
console.log("hello");
console.log("world");
}
fun2();
- 使用函数表达式来创建一个函数(将一个匿名函数赋给一个变量,记得加;)
var 函数名 = function([形参1,形参2...形参n]){
语句...
};
2)函数的参数
- 形参
定义一个求两个数的和的函数
可以在函数的()中来指定一个或多个形参(形式参数)
多个形参之间使用(,)隔开,声明形参就相当于在函数内部声明了对应的变量,但并不赋值
在调用函数时给形参传值
调用函数时解析器不会检查实参的类型,
所以要注意是否有可能会接受到非法的参数,如果有可能则需要对形参进行类型的检查
function sum(a,b){
console.log(a+b);
}
function(2,3);
调用函数时,解析器不会检查实参的数量,多余的实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
- 实参
实参可以是任何值
创建一个函数,可以在控制台中输出一个人的信息:name age gender address
function sayHello(name,age,gender,address){
console.log("我是"+"孙悟空"+",年龄"+18+...);
}
sayHello("孙悟空",18,"男","花果山");
当参数过多时可以将参数封装到一个对象中,然后通过一个对象传播
function sayHello(o){
console.log("我是"+o.name+",年龄"+o.age+...);
}
var obj ={
name:"tom",
age:18,
gender:"famale",
address:"California"
}
sayHello(obj);
实参可以是一个对象,也可以是一个函数
function fun(a){
console.log("a ="+a);
}
fun(sayHello);//sayHello函数体
function fun(a){
a(obj);
}
fun(sayHello);//调用a等同于调用sayHello
fun(function(){alert("hello")});
//将一个函数作为实参传给匿名函数
// fun(mianji(10));→a = 314;
mianji()
调用函数
相当于使用的是函数的返回值
mianji
函数对象
相当于直接使用的函数对象(带函数体)
3)返回值
可以使用return来设置函数的返回值
return 值
return后的值将会作为函数的执行结果返回,可以定义一个变量接收该结果
function sum(a,b,c){
var d = a + b + c;
return d;
}
return后的值都不会执行
如果return后不跟值就相当于返回undefined
如果函数中不写return,也会返回undefined
return
使用break可以退出当前循环
使用continue可以退出当次循环
使用return可以退出当前整个函数
可以return任意类型的值,也可以是一个对象
function fun2(){
var obj = {name:"沙和尚"};
return obj;
}
var a = fun2();
console.log("a = "+a.name);
//函数内部可以再声明(和调用)一个函数
function fun3(){
function fun4(){
alert("我是fun4");
}
//将fun4函数对象(带函数体)作为返回值返回
return fun4;
}
fun3();
练习:定义一个函数,判断一个数字是否是偶数,如果是则返回ture,否则返回false
function isou(num){
return num % 2 == 0;
}
var result = isou(15);
4)立即执行函数
函数定义完立即被调用
可调用且传参
(function(){
alert("匿名函数");
})();
(function(a,b){
console.log("a = "+a);
console.log("b = "+b);
})(123,456);
5)方法
函数可以作为对象的属性,此时它被称为这个对象的方法
调用这个函数时就说调用对象的方法(method)
但它只是名称上的区别,没有其他区分
var obj = new Object();
obj.name = "ton";
obj.age = 18;
obj.sayName = function(){
console.log(obj.name);
}
obj.sayName();//ton
var obj2 = {
name :"Jim",
age:18,
sayName:function(){
console.log(obj2.name);
}
};
obj2.sayName();
6)枚举对象中的属性
使用for...in 语句
for (var 变量 in 对象){
...
}
for...in语句 对象中有几个属性,循环体就会执行几次
每次执行时会将对象中的一个属性的名字赋值给变量
for(var n in obj){
console.log("输出属性名 : "+n);
console.log("输出属性值 : "+obj[n]);
}