搜索

首页  >  问答  >  正文

javascript - js对象取值

  var obj ={
        name:'nnn',
        age:22,
        job:'worker'
    };
  
    var arr=[
        'name',
        'age',
        'job'
    ];

    for (var i=0 ;i<arr.length;i++){
        document.writeln(arr[i]+':'+obj[arr[i]]);
    };//有值
     for (var i=0 ;i<arr.length;i++){
        document.writeln(arr[i]+':'+obj.arr[i]);
    };//没值,不报错
    

这两种有什么不同,出现上面的情况的原因是什么,请大神帮我解惑

天蓬老师天蓬老师2754 天前682

全部回复(6)我来回复

  • 黄舟

    黄舟2017-05-19 10:35:49

    你确定不报错? 看看控制台信息
    obj.arr[i] 这个调用是错的
    obj.arr 不存在, 等于 undefined
    undefined[i] 肯定会出错


    首先 obj 和 arr 都可以用 [] 的方式来取值:
    这个例子的两种做法不同点在于:
    obj[arr[i]] 是先取 arr[i] 再赋值给 obj[]:

    arr[i]==> 'name' ==> obj['name'] ==> 取值成功
    

    obj.arr.[i] 是先取 obj.arr, 再通过obj.arr取[i]:

    obj.arr==> undefined ==> undefined[i] ==> 报错
    嵌套的由内而外
    链式由左往右

    回复
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:35:49

    中括号运算符可以用字符串变量的内容作为属性名。点运算符不能的。

    var a={
        name:1
    }
    var str="name";
    console.log(a[str])//1
    console.log(a.str)//undefined

    回复
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:35:49

    一个是对象,一个是数组,是两种完全不同的数据结构

    遍历对象可以用

    for (var i in obj) {
        console.log(obj[i])
    }

    至于后面你说不报错的原因,是因为 for循环的3个表达式(通过分号分割的那3个),obj.length是undefined假值,所以循环不会开始,另外你还可以给obj对象增加一个length试试,这个循环就会启动了

    回复
    0
  • 阿神

    阿神2017-05-19 10:35:49

    盆友,报错了...

    原因是:
    使用obj[]可以传入字符串转换为属性名,即:
    obj['name']==obj.name返回true
    而obj.'name'的点语法是不会自动转换成obj.name的,即:
    obj.'name'==obj.name报错
    不知道我理解的对不对...

    回复
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:35:49

    肯定会报错的,运算符优先级啊

    回复
    0
  • 为情所困

    为情所困2017-05-19 10:35:49

    嵌套的由内而外
    链式由左往右
    这句说的对!

    回复
    0
  • 取消回复