JavaScript的数据类型分为两类:
原始类型(primitive type)和对象(Object type)。
原始类型包括:数字、字符串和布尔值。
JavaScript中还有两个特殊的原始值null(空)和undefined(未定义),他们不是数字、字符串和布尔值。他们分别代码各自特殊类型的唯一成员。但是要注意
(typeof null)=="object"//true
除了数值、字符串、布尔值和null、undefined之外,其他的都是对象,比如函数、数组、正则表达式等。
对象是属性的容器,其中每个对象都有名字和值。属性的名可以是包括空字符串在内的所有字符串,属性值可以是除了undefined之外的所有值。
对于函数来讲,typeof 返回值有可能是’function’,但是函数也是是对象,他可以存储在变量、数组、对象中,函数可被当成参数,函数也可以返回函数,
并且因为函数是对象,所以函数可以拥有方法。
JavaScript包括一个原型链特性,可以通过指定它来继承一个对象的属性。
3.1对象字面量: 一个对象字面量就是包裹在花括号中的零个或多个”名/值”对,对象字面量可以出现在任何表达式可以出现的位置。
如果属性名是一个合法的标识符,则属性名可以不用引号,但是类似于first-name,就得这样定义”first-name”
var empty_object = {};
var Star= {
"first-name": "Tom",
"last-name": "Green"
};
对象是可以任意嵌套的。
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"
}
};
3.2检索:检索对象的属性,可以使用[]包裹一个字符串表达式的值。如果这个字符串表达式是一个常数,并且这个字符串是JavaScript的合法标识符且不是保留字,那么可以使用 . 表示法来替代。
Star["first-name"] //"Tom"
flight.departure.IATA//"SYD"
若果你试图检索一个不存在的属性,则它会返回undefined;可以使用||来给他定义默认值。
Star["middle-name"]//undefined
var middle_name = stooge["middle-name"]||"io"//"io"
强制检索一个undefined的属性会导致TypeError异常。可以通过&&来避免
flight.equipment //undefined
filgth.equipment.model //throw "TypeError"
flight.equipment&&filgth.equipment.model
3.3更新和删除属性:
对象中的属性可以通过赋值语句来更新,如果该属性已存在,则会更新属性值,如果不存在,那么就会添加一个新的属性。
Star["airline"] = "good";//给stooge对象添加airline属性,并赋值
Star["airline"] = "bad";//更改airline的值。
delete 可以删除对象中的属性,但是不会涉及到原型链中的属性。
3.4引用:与原始类型不同,对象都是通过引用来传递的,他们永远都不会有拷贝。
原始类型,比如说数字:
var x = 12;
var b = x; //b=12,x=12
b = b + 2; //b=14,x=12
对于对象:
var obj={name:"shaozuo"};
var obj2 = obj;
obj2.name = "taijun";//obj.name="taijun"
3.5原型: 每个对象都有一个原型对象,并且可以从中继承属性。所有通过对象字面量创建的对象,都连接到Object.prototype这个javascript标准对象。
你可以在创建对象的时候给对象选择原型,这在使用构造函数的时候才有效;
原型连接在更新的时候不起作用,只有在检索对象属性的时候才会起作用。当你要检索的属性在对象中不存在时,他会检索对象原型,直到Object.prototype,如果还是不存在,会返回undefined。
原型是一种动态关系,如果在原型中添加一个属性,他会立即对基于该原型的对象可见。
3.6反射:检查对象的属性是很容易的事情, 使用typeof检查对象任何的属性,都会有返值,返回值是这六个字符串中的一个。
'number'、'string'、'boolean'、'undefined'、'function'、'object
’
可以使用hasOwnProperty方法来检查属性,但是该方法不会检查原型链中的数据。
3.7枚举:使用for in可以枚举对象的所有属性,包括你不需要的属性,所以可以使用hasOwnProperty方法或typeof来过滤对象的属性。但是使用for in 是没有顺序的,
如果想让其顺序显示,最好使用数组将属性名存储起来,然后在对象中遍历。
3.8减少全局变量的污染:最小化使用全局变量的方法就是在你的应用中只创建一个全局变量。类似于JQuery中,只有两个全局变量JQuery和$,其他的所有函数等的定义都在匿名函数之中。