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的存在 可是里面的对象属性我希望能够给个配置 然后这个函数封装起来.如果问题不清晰我能继续补充
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")