一、对象的基础
对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
上面代码通过大括号定义了一个有三个属性的对象,赋值给了变量obj:
键(key) | 值(value) |
---|---|
foo | 'value1' |
bar | 12 |
'5' | 'aaa' |
可以直观的看出:
1、通过大括号定义对象;
2、键与值通过冒号分隔;
3、键值对之间通过逗号分隔;
4、键名跟一般变量有点特殊,可以用数字作为键;
5、值可以是任意类型的数据
下面主要介绍一下键名
键名:在ES6之前,对象的所有键名都是字符串,可加可不加引号,ES6又引入了Symbol值也可以作为键名。
上面的代码等价于:
var obj = {
'foo':'value1',
'bar':12,
'5':'aaa'
}
如果键名是数值,会被自动转换为字符串,例如下面:
var obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
obj['100'] // true
如果键名不符合标识符的条件,且也不是数字,则在定义的时候必须加上引号,否则报错,如下示例:
// 报错
var obj = {
1p: 'Hello World'
};
// 不报错
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};
通常我们把键名叫做“属性”,但是我们又根据键值的数据类型不同,把键值为函数的属性叫做“方法”,因为它可以像函数一样执行。
另外要注意的一点是:上述的obj变量实际存储的是一个内存地址值,而这个地址值所在的内存空间才是对象的实际存储位置。
二、对象的属性的操作
-
属性的读取
读取对象的属性,有两种方式,点运算和方括号运算。
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
obj.foo // value1
obj.bar // 12
obj['5'] // aaa
obj['foo'] // value1
注意:点运算读取属性,适用于键名为合法的变量名标识;方括号运算读取属性是万金油,但是要把键名放在引号里面,否则会被当做变量处理
var foo = 'bar';
var obj = {
foo: 1,
bar: 2
};
obj.foo // 1
obj[foo] // 2
-
属性的赋值
同样是通过d点运算和方括号运算来进行,这里就不赘述
-
查看所有属性
查看一个对象本身的所有属性,可以使用Object.keys方法,返回一个由键名组成的数组
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
Object.keys(obj)// ['foo','bar','5']
-
in运算符
in 运算符y用于检测对象是否包含某个属性,如果包含就返回true,否则返回false
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
'foo' in obj //true
'foof' in obj //false
'toString' in obj //true
‘foo’是obj的属性所以返回true;‘foof’不是obj的属性所以返回的是false;但是‘toString’好像也不是我们的属性啊,怎么就返回了true呢。
in 运算符,它不能识别哪些属性是对象自身的,哪些属性是继承的。而toString是继承来的,所以就返回了true;
要判断是否为自身的属性,需要使用Object.hasOwnProperty('toString')
-
for …in循环
for...in循环用来遍历一个对象的可遍历的全部属性。
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
for (var i in obj) {
console.log(obj[i]);
}
// aaa
// value1
// 12
for…in循环有以下三个主要的特点:
-
它只遍历对象可遍历(enumerable)的属性;
-
不仅遍历本身的属性,也遍历继承来的属性;
-
遍历是无序的,跟定义时的顺序无关;
如果继承的属性是可遍历的,那么就会被for...in循环遍历到。但是,一般情况下,都是只想遍历对象自身的属性,所以使用for...in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key);
}
}
三、失宠的with语句
with的语法格式:
1with (对象) {
2 语句;
3}
它的作用是操作同一个对象的多个属性时,提供书写的便利,直接上代码
var obj = {
foo:'value1',
bar:12,
5:'aaa'
}
with(obj){
foo = '我是通过with设置的';
bar = '我变了'
}
// 等价于
obj.foo = '我是通过with设置的';
obj.bar = '我变了'
乍一看,貌似很溜,然而溜翻了。当你操作一个不是对象属性的变量的时候,实际上在with的父作用域下进行的操作,因为with语句并没有去创建一个新的作用域,这就存在了一个很大的弊端:绑定对象不明确,无法判断所操作的变量是谁的,只有在运行的时候才能确定,从而拖慢了运行速度。
所以with被称作为"失宠的with语法",它的初衷是好的,但是实现确是坑爹的。
所以在工作中,建议不要使用with语法。
以上是一些JavaScript对象的一些基础知识,希望能对你有所帮助。欢迎关注同步微信公众号:前端小菜的进阶之路