JavaScript 对象

本篇博文主要记录一些对象的使用方法和操作,至于对象的声明和继承请看:《JavaScript 创建对象》、《JavaScript 原型继承


对象字面量创建对象


一个对象字面量就是包围在一对花括号中的零或多个“键/值”对。键名(属性名)可以是包括空字符串在内的任何字符串,如果属性名是一个合法的JavaScript标识符,则不强制要求用引号括住属性名;用逗号来分隔多个“键/值”对。属性值可以为任意值,包括变量。

var value = 'this is a value';

var obj = {
  name: 'paper_crane',
  '': 'empty string',
  age: 22,
  1: 'number 1',
  'first-name': 'unacceptable property',
  value: value
};

在上面的例子中,定义了一个对象实例obj,可以看到,可以使用合法标识符作为其属性名,当用数字1作为其属性名时,会将数字1转换为字符串“1”,使用空字符串作为其属性名以及使用变量作为其属性值不会报错,但是first-name不是一个合法的标识符,故需要将其使用引号标识,否则会报错。

检索


检索对象里面的属性有两种办法:点表示法和[]后缀中括住一个字符串属性名的方法。点表示法的缺点为,当属性名为保留字或者非法字符串时,则会报错。

alert(obj.name);        // paper_crane
alert(obj.age);         // 22
alert(obj.value);       // this is a value

alert(obj.1);           // 报错
alert(obj.first-name);  // NaN

使用点表示法能够很容易很直观的检索对象的属性,但是当访问一些非法标识符时,要么报错要么出现不可理解的结果。使用[]后缀方法就可以避免,但是带来的损失就是无法很直观的检索对象属性。

alert(obj['name']);
alert(obj['']);
alert(obj['age']);
alert(obj[1]);
alert(obj['1']);
alert(obj['first-name']);
alert(obj['value']);

上面的例子使用了[]后缀访问了obj对象的属性,有一点需要注意的是,后缀[]里面必须是字符串或者是变量,比较特殊的一点是数字也可以,实际上数字会自动转换为字符串,而且,JavaScript的数组也是这样实现的,即[]里面可以是数字也可以数字的字符串形式,最后都会统一转换成字符串形式,所以JavaScript中数组的效率比其他语言的数组效率要低。

判断对象有没有特定的属性,可以直接检索其值看看是否为undefined,也可使用in操作符和hasOwnProperty()方法。in操作符无法区分特定属性是否在原型中,hasOwnProperty()方法则可判断属性是否属于原型。

更新


在前面已经知道如何检索一个对象的属性,更新的话,可以直接对对象的属性赋值,如果存在此属性,那么就可以改变属性的值,如果没有,就会创建一个属性,并且赋值。

obj['first-name'] = 'paper_crane';
obj['second-name'] = 'crane';

alert(obj['first-name']);
alert(obj['second-name']);

在上面的例子中,更新了first-name属性值和增加了second-name属性。

删除


使用delete可以删除对象的属性

delete obj['first-name'];

alert(obj['first-name']);   // undefined

枚举


枚举对象的属性,可以使用for in语句。但是for in语句是无法确保按顺序访问对象的属性的,同时还会列出一些在原型中的属性和方法,为了过滤掉属于原型中的方法,可以使用hasOwnProperty方法。

for (var attr in obj) {
  if (obj.hasOwnProperty(attr)) {
    console.log(obj[attr]);
  }
}

减少全局变量污染


可以定义一个全局变量对象OBJ,将所有的全局变量都放入其中,可以明显的减少全局变量的时候。但是,更好的方法是使用闭包来减少全局变量的污染。

数组去重


当数组存在重复元素,但是又不能打乱元素顺序的情况下,使用对象来达到数组去重的效果是很常用的方法。

var arr = ['b', 'a', 'c', 'a', 'd', 'c', 'b'];
var obj = {};
var i;
var result = [];

for (i = 0; i < arr.length; i++) {
  if (!obj[arr[i]]) {
    obj[arr[i]] = 1;
    result.push(arr[i]);
  }
}

console.log(result);   // b, a, c, d


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值