Javascript
中的一切均可以视为对象,除了两个特例:null
和 undefined
。git
false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3' function Foo(){} Foo.bar = 1; Foo.bar; // 1
一个常常容易被误解的就是数字常量不能视为对象,实际上数字常量仍然能够视为对象。这是由于 Javascript
解析器在解析点操做符时而将其视为浮点数特征而犯下的错误。github
2.toString(); // raises SyntaxError
实际上,咱们有不少方法可使得数字常量表现为一个对象。segmentfault
2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first
Javascript
中的对象能够当作哈希表使用,它们主要包含键与值的对应关系。
使用 {}
符号来建立一个简单的对象,这个新建的对象将从 Object.prototype
继承而来,而且不包含本身定义的属性。ide
var foo = {}; // a new empty object // a new object with a 'test' property with value 12 var bar = {test: 12};
咱们可使用两种方式来访问 Javascript
的对象,分别是点操做符 .
和中括号操做符 []
。lua
var foo = {name: 'kitten'} foo.name; // kitten foo['name']; // kitten var get = 'name'; foo[get]; // kitten foo.1234; // SyntaxError foo['1234']; // works
两种操做符的效果几乎同样,惟一的不一样是中括号操做符容许动态设置属性并且属性名能够有语法错误。(上例中的第三个情形已说明)spa
删除属性的惟一方法是使用 delete
,将属性值设置为 undefined
或 null
只是移除了与属性相关的值,并无真正删除属性自己。prototype
var obj = { bar: 1, foo: 2, baz: 3 }; obj.bar = undefined; obj.foo = null; delete obj.baz; for(var i in obj) { if (obj.hasOwnProperty(i)) { console.log(i, '' + obj[i]); } }
上面的输出 bar undefined
和 foo null
,只有 baz
真正被删除。
这里要说明一点,delete
只能删除属性,并不能删除变量。因此咱们在定义变量时必定要养成写 var
的好习惯,任什么时候候,变量必定要使用 var
关键字才能声明。由于若是不写 var
,变量会被误认给全局对象建立了一个新属性。设计
这个例子至关清楚给出了答案,a
为变量,而 b
只是一个全局对象的属性而已。code
var test = { 'case': 'I am a keyword, so I must be notated as a string', delete: 'I am a keyword, so me too' // raises SyntaxError };
对象的属性能够用普通字符或字符串来命名。一样也是因为 Javascript
解析器的一个错误设计,上例中的第二种表示方法在 ECMAScript 5
中将会抛出一个错误。
错误的缘由是由于 delete
是一个关键词,因此必须使用一个字符串常量来命名来适应老版的 Javascript
解析器。对象
http://bonsaiden.github.io/JavaScript-Garden/#object.general