本文详解 JavaScript 中对象的使用,解析数字常量为何报错及三种对象化方法。对比点操作符与中括号操作符的访问差异,深入讲解 delete 删除属性的原理,并强调使用 var 声明变量以避免污染全局对象的重要性。
false.toString(); // 'false'
[1, 2, 3].toString(); // '1,2,3'
function Foo(){}
Foo.bar = 1;
Foo.bar; // 1
数字常量的对象化误解与处理
数字常量常被误认为无法作为对象处理,但这实际上是 JavaScript 解析器在识别点操作符时,将其误判为浮点数小数点所导致的语法错误。
2.toString(); // raises SyntaxError
实际上,我们可以通过多种技巧让数字常量表现为对象。
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,且自身不包含任何自定义属性。
var foo = {}; // a new empty object
// a new object with a 'test' property with value 12
var bar = {test: 12};
对象属性的访问方式对比
访问对象的属性
JavaScript 提供了两种访问对象属性的方式:点操作符(.)和中括号操作符([])。
var foo = {name: 'kitten'}
foo.name; // kitten
foo['name']; // kitten
var get = 'name';
foo[get]; // kitten
foo.1234; // SyntaxError
foo['1234']; // works
这两种操作符的功能几乎一致,主要区别在于中括号操作符支持动态属性名设置,且允许属性名包含语法上不允许的字符(如数字开头),如前例所示。
使用 delete 删除属性与变量声明规范
删除对象的属性
删除属性的唯一正确方法是使用 delete 关键字。仅将属性值赋值为 undefined 或 null 并不能删除属性,只是移除了其关联的值。
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 会将变量错误地注册为全局对象的新属性。

该示例清晰表明,a 是局部变量,而 b 仅是全局对象的一个属性。
特殊字符与保留字属性命名
命名对象的属性
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 属于保留关键字,因此必须使用字符串常量进行命名以兼容旧版解析器。