搜尋

首頁  >  問答  >  主體

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]);
    };//没值,不报错
    

這兩種有什麼不同,出現上面的情況的原因是什麼,請大神幫我解惑

天蓬老师天蓬老师2796 天前695

全部回覆(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
    而返回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
  • 取消回覆