一种是obj.name 一种是obj[‘name’]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
两种效果是差不多的,
第一种使用起来更简洁,
第二种适用范围更广一点.
比如说这样.
function fun (key) {
var obj = {
name:'mike',
age : 18
};
return obj[key];
}
第二种的特点是,
可以让一个字符串变成一个变量(容器).
可以用变量操作变量名.
最典型的应用例子是这个
var obj = {
name : 'mike',
age : 18,
sex : 'male'
}
var newObj = {};
for(var prop in obj) {
newObj[prop] = obj[prop];
}
此处的prop 是一个变量,返回的值是字符串的'name','age','sex'
[prop]的方式用来取值取obj,也用来设置newObj属性.
[]里都可以放什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var obj = {};
obj['name'] = 'mike';
obj[''] = 11;
obj[[]] = 22;// 会覆盖obj['']
console.log(obj['']);//返回22
obj[[1]] = 33;
console.log(obj[1]);// 返回33
obj[[1,2]] = 44;
console.log(obj['1,2']);//返回 44
obj[false] = 55;
console.log(obj['false']);// 返回 55
obj[{}] = 66;
obj = 77;//对象会互相覆盖.
console.log('[object Object]');//返回77
obj['i love you'] = 521;
obj[' '] = 666;
obj[' '] = 777;//不会互相覆盖.
你肯定发现了, 无论放什么数据类型,都会调用 toString()方法,变成字符串.
感觉也没什么用..
还有就是,上面几个例子当中, 除了obj.false之外
其他所有属性,都只能通过[]的方式获取. 而.方式定义的属性 [] 方式都能获取.
还记得我们学习js的时候,开篇就学的一个原则嘛? 我总是记得不够准确.
复制粘贴
变量名区分大小写,允许包含字母、数字、美元符号($)和下划线,
但第一个字符不允许是数字,不允许包含空格和其他标点符号
obj['@nini'] = 123;//这样子是可以设置变量的, 只不过不能obj.@nini来获取.
是不是感觉很没有用?
我也觉得没有用,谁知道呢,也可能会觉得有用.
[]里可以是一个表达式,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
比如这样
var a = 555;
var b = 666;
var obj = {};
obj[a] = 'a';
obj[b] = 'b';
obj[a + b] = obj[a] + obj[b];
console.log(obj);
比如这样
function getName (){return 'mike'};
obj[getName()] = getName();
obj[(function () {return ' '})()] = 'peter';
var num = 333;
obj[ num = 123] = num;// 会先执行 num = 123// obj[123] = 123;
var aa = true;
var bb = false;
obj[ aa && bb] = aa && bb;
obj[function fun () {}] = 123; 函数声明是不会报错的,
obj[var a = {}]; 变量声明是会报错的.
console.log(obj);
这个似乎也没什么鸟用,,