javascript - 为什么这个三元会抛出错误而不是评估为 false?

标签 javascript ecmascript-6 ternary

我正在尝试测试对象属性的真实性。无论它是否存在并具有值,都使用该值,如果不存在,则将默认值添加到另一个对象。

const initNetwork = ( setupObj ) => {
    let obj = {};

    obj = Object.assign({}, setupObj);

    obj.eth0 = obj.eth0 ? obj.eth0 : {};
    obj.wlan0 = obj.wlan0 ? obj.wlan0 : {};

    obj.eth0.server = obj.eth0.server ? obj.eth0.server : {};
    obj.wlan0.client = obj.wlan0.client ? obj.wlan0.client : {};
    obj.wlan0.server = obj.wlan0.server? obj.wlan0.server : {};

    obj.eth0.mac = null;
    obj.wlan0.mac = null;

    obj.eth0.server.address = setupObj.eth0.server.address ? setupObj.eth0.server.address : "10.0.0.1";

}

initNetwork(); // intentionally leaving this empty to test setting default values.

不过我在这里遇到了错误。我认为它会返回 undefined,因此会将 obj.eth0.server.address 设置为“10.0.0.1”的错误值。

    obj.eth0.server.address = setupObj.eth0.server.address ? setupObj.eth0.server.address : "10.0.0.1";
                                       ^

TypeError: Cannot read property 'eth0' of undefined

查看此键/值对是否一直存在于树中以及如果存在则使用该值,否则设置 false 值的最佳方法是什么?

最佳答案

您正在分配一个名为 obj 的新对象,因此您的检查应该针对 obj
在这种情况下,setupObj 将始终为未定义
您可以使用 && 运算符为 setupObj 添加另一个条件:

obj.eth0.server.address = (setupObj && setupObj.eth0.server.address) ? setupObj.eth0.server.address : "10.0.0.1";

当然,建议检查每一层嵌套对象。

运行示例:

const initNetwork = ( setupObj ) => {
    let obj = {};

    obj = Object.assign({}, setupObj);

    obj.eth0 = obj.eth0 ? obj.eth0 : {};
    obj.wlan0 = obj.wlan0 ? obj.wlan0 : {};

    obj.eth0.server = obj.eth0.server ? obj.eth0.server : {};
    obj.wlan0.client = obj.wlan0.client ? obj.wlan0.client : {};
    obj.wlan0.server = obj.wlan0.server? obj.wlan0.server : {};

    obj.eth0.mac = null;
    obj.wlan0.mac = null;

    obj.eth0.server.address = (setupObj && setupObj.eth0.server.address) ? setupObj.eth0.server.address : "10.0.0.1";

}

initNetwork(); // intentionally leaving this empty to test setting default values.

关于javascript - 为什么这个三元会抛出错误而不是评估为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552489/

相关文章:

Javascript从字符串创建类对象

javascript - 在 ES6 (React) 中传递参数,SyntaxError : unknown: Unexpected token

c++ - 为什么这两个代码片段的效果是一样的呢?

无赋值的 Java 三元

C - if else 的三元运算符

javascript - 将硬编码固定线添加到 d3 条形图

javascript - 如何在 Javascript 中打开本地主机弹出窗口?

javascript - 用于 javascript/ajax 的 Rails3 重定向

javascript - 为什么 JavaScript 中函数被视为类

javascript - 使用 Promise() ECMAScript 6 异步加载文件后访问类