对象属性的两种读写方式

一种是obj.name 一种是obj['name']

两种效果是差不多的,
第一种使用起来更简洁,
第二种适用范围更广一点.

比如说这样.
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属性.

[]里都可以放什么?

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{{name:'mike'}} = 77;//对象会互相覆盖.
     console.log('[object Object]');//返回77 
     obj['i love you'] = 521;
     obj['   '] = 666;
     obj['     '] = 777;//不会互相覆盖.
     
     你肯定发现了, 无论放什么数据类型,都会调用 toString()方法,变成字符串.
       感觉也没什么用..
      还有就是,上面几个例子当中, 除了obj.false之外
       其他所有属性,都只能通过[]的方式获取. 而.方式定义的属性 [] 方式都能获取.

还记得我们学习js的时候,开篇就学的一个原则嘛? 我总是记得不够准确.
复制粘贴
变量名区分大小写,允许包含字母、数字、美元符号($)和下划线,
但第一个字符不允许是数字,不允许包含空格和其他标点符号

obj['@nini'] = 123;//这样子是可以设置变量的, 只不过不能obj.@nini来获取.

是不是感觉很没有用?
我也觉得没有用,谁知道呢,也可能会觉得有用.

[]里可以是一个表达式,

比如这样
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);

这个似乎也没什么鸟用,,

你可能感兴趣的:(对象属性的两种读写方式)