_.get 的不确定行为

Uncertain behaviour of _.get

let a = {
   b  : null
}

_.get(a, 'b',''); //return null

但是

_.get (a, null, '') //return ''

null 是 _.get() 的虚假值吗?

let a = {
   b  : {c:{
}
} //basically a nested object

我正在尝试执行 _.get(a, 'b.c','').toString() 但出现错误,因为 _.get return 为空。最好的可读方式是什么?

第三个参数 defaultValue 将只返回 undefined 个解析值,而不是 nullsee docs

如果您想要 nullundefined 的后备值,请使用 nullish coalescing operator:

(_.get(a, "b.c") ?? "").toString()

以下是使用不同机制定义默认值的不同结果:

let a;

a = { b: null };
_.get(a, "b", ""); // null
_.get(a, "b") ?? ""; // ""
_.get(a, "b") || ""; // ""

a = { };
_.get(a, "b", ""); // ""

a = { b: undefined };
_.get(a, "b", ""); // ""

a = { b: 0 };
_.get(a, "b") || ""; // ""
_.get(a, "b") ?? ""; // 0

_.get(a, 'b','');

你要求 属性 a['b'],恰好是 null,而不是 undefined,所以你得到 null 作为最后结果。接下来,在

_.get(a, null, '');

你要求 属性 a['null'],它不存在,所以它是 undefined,你最终得到备用值 ''。最后,用

let a = {b: {c: {}}};
_.get(a, 'b.c', '');

您似乎在要求 a['b']['c'],这将是一个空对象。但是,虚线路径表示法是 Lodash-specific。如果您使用的是 Underscore,默认情况下路径被解释为 a['b.c'],它不存在并且是 undefined。在这种情况下,您应该得到 '' 作为最终结果。我看不出这个表达式会导致 null,即使您使用的是 a = {b: null}.

的原始值

如果您实际上正在使用 Underscore 并且想要检索 b 属性 中嵌套的 c 对象,您有两个选择。首先,您可以使用数组路径表示法,它可以在 Underscore 和 Lodash 之间移植:

_.get(a, ['b', 'c'], '');

其次,您可以覆盖 _.toPath 以启用所有 Underscore 函数的点路径表示法:

const originalToPath = _.toPath;
_.toPath = function(path) {
    if (_.isString(path)) return path.split('.');
    return originalToPath(path);
}

_.get(a, 'b.c', '');

我不推荐这样做,因为它会破坏试图检索名称中包含句点字符 . 的属性的代码。我提到它是为了完整性;用你自己的判断。