对象(Objects) 对象属性值可以是除undefined值之外的任意值
1.对象字面量
a.{} b.new object();
注意事项: 在对象字面量中,如果属性名是一个合法的javascript标识符且不是保留字,则并不强制要求用引号扩住属性名。
JavaScript标识符中包含连接符(-)是不合法的,但允许包含下划线(_);
例: var stooge = { "first-name" : 'z', "last-name" : 'wd' } var flight = { airline: "Oceanic", num : 815 }
2.检索
要检索对象里面包含的值,可以采用在[]后缀中括住一个字符串表达式的方式。如果字符串表达式是一个字符串字面量,而且他是一个合法的javascript标识符且不是保留字,那么也可以用 . 表示法代替。优先考虑使用 . 因为它更紧凑且可读性好。
如果检索到一个并不存在的成员属性的值,将返回undefned;
例: stooge["middle-name"] //undefined flight.status //undefined
||(或) 运算符可以用来填充默认值
例:
var middle = stooge["middle-name"] || "(none)" var status = flight.status || "unknown"
尝试从undefined的成员属性中取值将会导致TypeError异常,这是可以通过 && 运算符来避免错误。
例: flight.equipment //undefined flight.equipment.model //undefined flight.equipment && flight.equipment.model //undefined
3.更新
如果属性名已经存在对象里,那么这个属性的值就会被替换。
如果哦对象之前没有拥有那个属性名,那么该属性就被扩充到对象中。
4.引用
对象通过引用来传递。它们永远不会被复制。
var a ={}, b={}, c={}; //a、b和c每个都引用一个不同的对象 a=b=c={}; //a、b和c都引用同一个空对象
5.原型
每个对象都连接到一个原型对象,并且它可以从中继承属性。所以通过对象字面量创建的对象都连接到object.prototype,它是javascript中的标配对象。
当你创建一个新对象时,你可以选择某个对象作为它的原型。
原型连接只有在检测值的时候才被用到。如果我们尝试去获取对象的某个属性值,但该对象没有属性名,那么javascript会试着从原型对象中获取属性值。(如果在那个原型对象没有找到属性,那么再从它的原型中寻找,以此类推,直到最终到达终点Object.prototype。如果想要的属性完全不存在原型链中,那么结果就是undefined值,这个过程叫做委托。)
原型关系是一种动态关系。如果我们添加一个新的属性到原型中,该属性会立即对所有给予该原型创建的对象可以见。
6.反射
typeof操作符对确定属性的类型有很大帮助。
例: typeof flight.number //'number' typeof flight.status //'string'
注意:原型链中的任何属性都会产生值
例: typeof flight.tosting //'function' typeof flight.constructor //'function'
处理掉不需要的属性
hasOwnProperty() 如果对象拥有独有的属性,他将返回true。它不会检测原型链。
例: flight.hasOwnProperty('number') //true flight.hasOwnProperty('constructor') //false
7.枚举
for in 语句可用来遍历一个对象中的所有属性名。该枚举过程中将会列出所有的属性——包括函数和你可能不关心的原型中的属性——所以有必要过滤掉那些你不想要的值。最为常用的过滤器是hasOwnProoperty方法,以及使用typeof来排除函数。
例: var name; for(name in flight) { if(typeof flight[name] !== 'function') { //可以获取到不是方法的属性值。 } }
for in 枚举出来的属性名出现的顺序是不确定的,如果确保要以特定的顺序出现,避免使用 for in 语句,而是创建一个数组。
8.删除
delete运算符可以用来删除对象的属性。如果对象包含属性,那么该属性就会被移除。它不会触及原型链的任何对象。
9.减少全局变量污染
最小化使用全局变量的方法之一是为你的应用只创建一个唯一的全局变量;
例: var MYAPP = {}; MYAPP.stooge = { "first-name": "Joy", "last-name": "Howard" } MYAPP.flight = { airline: "Oceanic", number: 815 }
只要把全局性的资源都纳入一个名称空间之下,你的程序与其他应用程序、组件或类库之间发生冲突的可能性就会降低。(闭包可以进行信息隐藏的方式,闭包是另一种有效减少全局污染的方法)