gpt4 book ai didi

javascript - 如何检测代理对象中获取序列的结尾?

转载 作者:行者123 更新时间:2023-11-29 22:44:27 25 4
gpt4 key购买 nike

为了避免访问深度嵌套的属性时出错,我写了一个代理返回函数:

const safe_access = obj =>
new Proxy(obj, {
get: (o, k) =>
o[k] == null
? safe_access({})
: typeof o[k] === 'object'
? safe_access(o[k])
: o[k] });

这是一个例子:

const a = safe_access({});
a.x.y.z; // no TypeError 🎉

然而,在其当前形式中,safe_access 无法判断它何时到达路径的末端。这意味着它不能返回 undefined 来表示该属性确实不存在。这也意味着您不能有默认值:

const a = safe_access({});
a.x.y.z || 42; // not 42

const {x: {y: {z = 42}}} = a;
z; // not 42

我的代理对象如何检测属性查找的结束?

最佳答案

This answer出于同样的原因,或多或少适用于此。

您无法检测到访问链的结尾,因为它与前面的访问没有任何不同。在运行时,以下代码实际上与 let r = a.x.y.z 相同。

let r = a;
{
r = r.x;
r = r.y;
r = r.z
}

如果您真的想在您编写的代码中使用这种安全导航,最好是使用 optional chaining (?.) 和 nullish coalescing (??) 运算符已于 2020 年添加到 Javascript 标准中。它们提供了一种更简洁、更不易混淆的方式来执行此类操作,并且受到所有现代浏览器的支持。

let r = a?.x?.y?.z ?? 42;

如果您需要支持旧版浏览器,您可以从这两个 Babel 插件中获取这些运算符:( [1][2] )。


但是,如果您真的想自己实现“安全”访问,可以使用一些技巧来解决这个问题。

一个可能需要最少额外工作的技巧是保留一个名称来指示安全访问链的末端。 (我过去在 Python 中做过类似的事情。)

function safe_access(value) {
let obj = (typeof(value) === 'object') ? value : {};

return new Proxy(obj, {
value: value,
get: function(target, property) {
if (property === "$")
return this.value;
else
return safe_access(target[property]);
}
});
}

let a = {'x': {'y': 123}};
// a.x.y is a proxy object
a.x.y.$ === 123
a.x.y.z.$ === undefined

另一个技巧详见this blog post .

关于javascript - 如何检测代理对象中获取序列的结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59003675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com