javascript-进阶(2) 对象 简介 对象是一种复合的数据类型,在对象中可以保存多个不同的数据类型。说简单点就是:对象是将各个不同的、独立的数据类型组合、关联起来
1 2 3 4 5 6 7 8 对象的分类 1. 内建对象 - Math 、String 、Number 、Boolean 、Function 、Object 已由ES标准定义好了的对象类型 2. 宿主对象 - 由js的运行环境提供的对象,目前主要指浏览器提供的对象 - 比如 BOM DOM 3. 自定义对象 - 由开发人员自己定义的对象
对象的基本操作 1 2 3 4 5 6 7 8 9 10 11 12 13 var a = new Object (); a.name = "嘟嘟大魔王" ; a.attck = "200" ; a.attck = "100" ; console .log(a.name) console .log(a.attck)delete a.name;
对象的属性名和属性值
对象的本质是一个字典
对象的属性名不强制要求遵守标识符规范,保留字什么的都可以取,但我们应该遵循其规范
对象可以嵌套(套娃)
JS的属性值可以是任意数据类型,也可以是一个对象
1 2 3 4 5 6 1. var a = new Object (); var b = new Object (); a.object = b; console .log(a.object);
如果要使用特殊一点的属性名,比如数字123什么的,不能用”对象.属性名 = 属性值”的方式操作,要用”对象[‘属性名’] = 属性值”的方式操作,取的时候也是这种格式
1 2 3 4 2. var a = Object (); a[12345 ] = 314134 ; console .log(a[12345 ])
使用对象”[‘属性名’] = 属性值”取操作属性,更加的灵活,在[]中可以传递一个变量,这样那个变量是多少,就会读取对象的那个属性的值
1 2 3 4 5 3. var a = Object (); a[12345 ] = 12346457 ; b = 12345 ; console .log(a[b])
基本数据类型和引用数据类型 基本数据类型
js中的的变量都是存储在栈里面的,基本数据类型都是的变量和值都是只存储在栈里面,互不相关,修改一个变量值并不会影响到其他变量的值
引用数据类型
对象则是存储在堆内存中的,每当我们New Object创建一个对象的时候,就会在堆内存里开辟一片空间,而变量保存的是对象的内存地址(对象的引用)
如果两个变量保持的是同一个对象的引用,当一个变量修改属性时,另一个也会收到影响
拓展 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var a = 123 ; var b = 123 ;console .log(a == b)var c = new Object ();var d = new Object ();c.name = '孙悟空' ; d.name = c.name; e = c; console .log("c = " + c.name);console .log("d = " + d.name);console .log(c == d)console .log(e == c)
总结:基本数据类型之间的比较是比较它们的值,值相同则相等;引用数据类型间的比较是比较两边的内存地址,就算两个变量的值相同也不相等
对象字面量 创建对象的另一种姿势 这种创建对象的方式跟new Object的效果是一样的,对象的本质就是键值对
1 2 3 4 5 6 7 a = { name :'猪八戒\n' , sex : '男\n' , '锄禾日当午' :'汗滴禾下土' }; console .log(typeof a);console .log(a.name,a.sex,a['锄禾日当午' ]);
函数 函数是什么
万物皆对象。函数是一组对象,可以这么说,Object是function的爸爸
函数里面也可以嵌套对象
构造函数的三种方式 构造函数有三种方式,但实际开发比较常用的只有一种方式,其他两种稍微了解即可
声明函数法(常用) 1 2 3 - function 函数名([形参1 ,形参2 ] ) {语句一,语句二,语句N..}
构造函数法(不常用) 1 2 var a = function ("语句一,语句二,语句N.." )
函数表达式创建函数(不常用) 1 2 var a = function ([形参1 ,形参2 ] ) {语句一,语句二,语句N..}
函数的参数(形参和实参)
定义一个函数,可在函数的()里指定一个或者多个形参,但不赋值,多个形式参数用逗号隔开
在函数的()指定形参称为声明形参,声明形参就相当于在函数内部声明了对应的变量
调用函数时在()内指定的参数叫做实际参数
在调用函数函数时,实参将会赋值给对应的形参,实参可以输入任意数据类型的值,函数解析时,解析器不会检查参数进行类型检查;形参的默认值为’undefined’
1 2 3 4 5 6 7 8 function sum (a,b ) { c = a + b; console .log("你输入的第一个数为:" + a + '\n' ), console .log("你输入的第二个数为:" + b + '\n' ), console .log("计算结果为:" + c) } sum(prompt('请输入第一个数' ),prompt('请输入第二个数' ))
函数的返回值 在函数中可以用return来设置函数的返回值,return后的值会作为函数结果返回,可以定义一个变量来接受返回的值,return的默认值为undefined
1 2 3 4 5 6 7 - return 值 function sum (a , b , c ) { var d = a + b + c ; return d} var result = sum(4 ,7 ,9 ); console .log("计算结果为:" + result);
实参可以是任何值
函数的实参可以是任何类型的值,也可以是一个对象,或者是一个函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function person (o ) { console .log("这个人今年" + o.age + "岁," ,"体重为" + o.weight + "kg," ,"身高为" + o.high + ",存款有" + o.monery ) }; function chuyi (person ) { result = (o.age + o.weight + o.high) / o.monery; gailv = result.toFixed(2 )*100 console .log("这个人的逆袭率为" + gailv + "%" ) }; var o = { age : 16 , weight : 47.5 , high : 165 , monery : 300 }; chuyi(person(o))
返回值的类型
函数的返回值可以是任何类型的值,也可以是一个对象,或者是一个函数
1 2 3 4 5 6 7 8 9 10 function num1 (a,b ) { alert("函数1开始执行" ); return a + b } function num2 ( ) { return num1(12 ,13 ) } console .log(num2())
立即执行函数
优点:该函数执行完毕之后就会被内存扔掉,之后不会占用内存
1 2 3 4 5 6 7 8 9 sq1 :(function ( ) { alert("我是一个莫得名字的函数" ); })(); sq2:(function hanshu (a,b ) { alert("我是一个有名字的函数" ); console .log(a + b) })(12 ,56 );
拓展-套娃函数 1 2 3 4 5 6 7 8 function fun1 ( ) { function fun2 ( ) { alert("我是fun1里的fun2" ); } return fun2; } fun1()();
全局作用域 变量、函数声明提前
使用var关键字声明的变量,会在所有的代码执行前被声明(但是不会赋值),所以不会报错,会显示”Undefined”; 但是不使用var关键字声明变量时,则变量不会被声明提前,会报错
1 2 3 4 5 6 7 console .log(a); var a = 100 ; console .log(b); b = 100 ;
使用函数声明形式创建的函数”function 函数名(){}”,他会在所有的代码执行前就被创建,因此我们可以在函数声明前调用函数 但是函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
1 2 3 4 5 6 7 8 9 10 11 fun1(); function fun1 ( ) { console .log("niHao" ) } fun2(); var fun2 = function ( ) { console .log("Hello" ) }