1 对象
简单数据类型
- number
- string
- boolean
- null
- undefined
对象类型
- array
- function
- regularExpression
- object
对象简介
- 可变的键控集合,属性的容器,无类型
- 属性:任意字符串(包括空字符串)
- 属性值:非undefined
1.1 对象字面量
var empty_object = {};
var stooge = {
"first-name":"Jerome";
"last-name":"Howard"
};
var flight = {
airline:"Oceanic",
number:815,
departure:{
IATA:"SYD",
time:"2004-09-22 14:55",
city:"Sydney"
},
arrival:{
IATA:"LAX",
time:"2004-09-23 10:42",
city:"Los Angeles"
}
};
1.2 检索
stooge["first-name"] //"Jerome"
flight.departure.IATA //"SYD"
1.2.1 检索一个并不存在的成员属性,返回undefined
stooge["middle-name"] //underfined
1.2.2 || 填充默认值
var middle = stooge["middle-name"] || 'none' //middle='none'
1.2.3 && undefined的成员属性取值
stooge["middle-name"] //undefined
stooge["middle-name"].model //throw typeError
stooge['middle-name'] && stooge['middle-name'].model //undefined
1.3 更新
stooge["middle-name"] = 'Ning' //扩充
stooge["first-name"] = "Zhang" //覆盖
1.4 引用
var x = stooge;
x.nickName = 'Curly';
var nick = stooge.nickName; //x,stooge指向同一个对象 'Curly'
var a = {}, b = {}, c = {}; //a,b,c分别指向3个不同的空对象
a = b = c = {}; //a,b,c指向同一个空对象
1.5 原型
- 每个对象都连接到一个原型对象,并可以从中继承属性。
- 通过对象字面量创建的对象连接到Object.prototype,它是JavaScript的标配对象。
- 当你创建一个新对象时,可以选择某个对象作为它的原型。
Object.myCreate = function (obj) {
var F = function () { };
F.prototype = obj;
return new F();
}
var another_stooge = Object.myCreate(stooge);
- 原型连接只有在检索时使用,若获取某对象属性值,但该对象没有该属性,JavaScript会尝试从该对象的原型对象上获取此属性值,以此类推,直到Object.prototype。如果想要的属性完全不存在于原型链中,返回undefined。这个过程称为委托。
- 原型关系是一种动态关系。如果添加一个属性到原型中,该属性立即对所有基于该原型的创建对象都可见。
stooge.profession = 'actor';
another_stooge.profession //'actor'
1.6 反射
typeof flight.number //number
typeof flight.status //string
typeof flight.arrival //object
typeof flight.mainfest //undefined
原型链任何属性都能产生值。
typeof flight.toString //function
typeof flight.constructor //function
hasOwnProperty不会检查原型链
flight.hasOwnProperty('number') //true
flight.hasOwnProperty('constructor') //false
1.7 枚举
for in 列出所有属性包括函数和原型链上的属性。
var name;
for(name in another_stooge){
if(typeof another_stooge[name]!=='function'){ //排除函数
console.log(name,another_stooge[name]);
}
}
for in中遍历的属性名顺序不确定。使用for代替。
var i;
var properties=[
'first-name',
'middle-name',
'last-name',
'profession'];
for(i=0;i<properties;i++){
console.log(properties[i],another_stooge[properties[i]]);
}
1.8 删除
删除不会触及原型链上的对象。
another_stooge.nickname //'Moe'
delete another_stooge.nickname //删除nickname,使原型链上的属性暴露
another_stooge.nickname //'Curly',stooge的。
1.9 减少全局变量污染
全局变量削减了程序的灵活性,应避免使用。 最小化使用全局变量:只创建唯一的全局变量。
var MYAPP = {};
把全局性的资源都纳入一个名称空间之下,不同组件间冲突的可能性会明显降低。