关于js变量定义问题

var g = { id: 1 };
var b = function(index) {
    console.log(g.index);
    //console.log(g."id");
};
b('id');
//如何实现 console.log(g.id); 

//q2
var g = {
    id: {
        name: 1
    }
};
//请问大佬怎么用传参数方法 console.log(g.id.name);

上述问题中 我能确定g的存在 可是里面的对象属性我希望能够给个配置 然后这个函数封装起来.如果问题不清晰我能继续补充

阅读 2.3k
3 个回答
 var g={id:1};
    var b=function(index){
        console.log(g[index]); // 这里要把.换成括号,访问变量啊
    };

answer1: JS 中访问对象属性有两种方法

  • 使用 . 运算符,其左边是引用对象的变量名称,右边是属性名称(加引号,加了引号叫字符串)
  • 使用 [] 运算符,其左边是引用对象的变量名称(无引号),中间是一个表达式,其计算结果是表示属性名称的字符串。字符串本身也是一个表达式,所以可以直接给 g["id"],它与 g.id 效果等同

上面提到的“名称”,其实叫做标识符,在 JS 中,标识符是有约束的,比如 your-name 就不是一个合法的标识符,但是它却是一个合法的属性名(因为 JS 的对象可以看做一个 Hash 表,所有字符串都中以做为键,却属性名),这种情况下需要引用属性,必须使用 [] 运算符。比如 o.your-name 就是错误的,而 o["your-name"] 才是正确。

o.your-name 被会解释器解释为 o.your - name,是一个减法表达式。

answer2:根据上述原因,g.id.name 本身是一个合法的表达式,可以取到其值 1。但是我理解你这里是是想实现类似 lodash 中 _.get() 函数的功能,即给定一个字符串表示属性路径,要获取其值,那么可以分解路径,再通过循环来获取值

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
        // 就不可能再继续下去,直接返回该值即可。
        // 也可以根据业务逻辑需要在这里抛出异常
        if (current === void 0 || current === null) {
            return current;
        }
    }
    return current;
}

使用

get(g, "id.name")
 var g={
    id:{
        name:1
    }
};
//请问大佬怎么用传参数方法 console.log(g.id.name);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题