为什么这个三元组会抛出错误而不是评估为假?

时间:2018-01-31 22:27:58

标签: javascript ecmascript-6 ternary

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

    $capsule->addConnection([
        'driver'    => 'mysql',
        'host'      => env('Database_Host'),
        'database'  => env('Database_Name'),
        'username'  => env('Database_Username'),
        'password'  => env('Database_Password'),
        'charset'   => 'utf8',
        'collation' => 'utf8_persian_ci',
        'prefix'    => '',
    ]);


    $capsule->setFetchMode(PDO::FETCH_ASSOC);
//    $capsule->getConnection()->getPdo()->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

//    $capsule->setAsGlobal();

    return $capsule->getConnection();

我在这里遇到错误。我认为它将返回undefined,因此将obj.eth0.server.address设置为false值“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.eth0.server.address ? setupObj.eth0.server.address : "10.0.0.1";

}

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

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

3 个答案:

答案 0 :(得分:3)

您正在分配名为obj的新对象,因此您的支票应该针对obj
在这种情况下,setupObj始终为undefined 您可以使用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.




答案 1 :(得分:0)

您可以测试是否存在对象,但是您无法测试是否存在不存在的对象的属性,以及{{1}时您的代码尝试执行的操作}没有传入函数。

在尝试使用该参数之前,您需要测试函数以查看是否传入了参数。并且,鉴于您的代码中有两个位置需要执行此测试,因此更有意义的是不使用三元组而是使用传统的setupObj

该函数应如下所示(您实际上可以运行此代码以查看它的运行情况):



if




答案 2 :(得分:0)

也许try / catch块可以帮助你摆脱一些额外的代码:

try {
    obj.eth0.server.address = setupObj.eth0.server.address;
} catch (e) {
    if (e instanceof TypeError) {
        obj.eth0.server.address = '10.0.0.1';
    } else {
        throw e;
    }
}