鍍金池/ 問答/HTML/ 關(guān)于js變量定義問題

關(guān)于js變量定義問題

var g = { id: 1 };
var b = function(index) {
    console.log(g.index);
    //console.log(g."id");
};
b('id');
//如何實現(xiàn) console.log(g.id); 

//q2
var g = {
    id: {
        name: 1
    }
};
//請問大佬怎么用傳參數(shù)方法 console.log(g.id.name);

上述問題中 我能確定g的存在 可是里面的對象屬性我希望能夠給個配置 然后這個函數(shù)封裝起來.如果問題不清晰我能繼續(xù)補(bǔ)充

回答
編輯回答
懷中人

answer1: JS 中訪問對象屬性有兩種方法

  • 使用 . 運(yùn)算符,其左邊是引用對象的變量名稱,右邊是屬性名稱(加引號,加了引號叫字符串)
  • 使用 [] 運(yùn)算符,其左邊是引用對象的變量名稱(無引號),中間是一個表達(dá)式,其計算結(jié)果是表示屬性名稱的字符串。字符串本身也是一個表達(dá)式,所以可以直接給 g["id"],它與 g.id 效果等同

上面提到的“名稱”,其實叫做標(biāo)識符,在 JS 中,標(biāo)識符是有約束的,比如 your-name 就不是一個合法的標(biāo)識符,但是它卻是一個合法的屬性名(因為 JS 的對象可以看做一個 Hash 表,所有字符串都中以做為鍵,卻屬性名),這種情況下需要引用屬性,必須使用 [] 運(yùn)算符。比如 o.your-name 就是錯誤的,而 o["your-name"] 才是正確。

o.your-name 被會解釋器解釋為 o.your - name,是一個減法表達(dá)式。

answer2:根據(jù)上述原因,g.id.name 本身是一個合法的表達(dá)式,可以取到其值 1。但是我理解你這里是是想實現(xiàn)類似 lodash 中 _.get() 函數(shù)的功能,即給定一個字符串表示屬性路徑,要獲取其值,那么可以分解路徑,再通過循環(huán)來獲取值

function get(obj, attrPath) {
    const segments = attrPath.split(".");
    let current = obj;
    for (let i = 0; i < segments.length; i++) {
        current = current[segments[i]];
        // 容錯處理,如果某一步取值為 null 或 undefined
        // 就不可能再繼續(xù)下去,直接返回該值即可。
        // 也可以根據(jù)業(yè)務(wù)邏輯需要在這里拋出異常
        if (current === void 0 || current === null) {
            return current;
        }
    }
    return current;
}

使用

get(g, "id.name")
2018年5月21日 19:51
編輯回答
悶油瓶
 var g={id:1};
    var b=function(index){
        console.log(g[index]); // 這里要把.換成括號,訪問變量啊
    };
2017年8月2日 09:06
編輯回答
櫻花霓
 var g={
    id:{
        name:1
    }
};
//請問大佬怎么用傳參數(shù)方法 console.log(g.id.name);
2018年6月19日 00:11