【问题标题】:What is the process of an if-statement when evaluating an object for a specific property directly?直接评估特定属性的对象时,if 语句的过程是什么?
【发布时间】:2018-10-28 19:03:20
【问题描述】:

我对编程相当陌生,在探索对象时遇到了这个问题。似乎 if 语句可以搜索对象内部的属性,而无需使用 hasOwnProperty() 或关键字“in”或其他任何东西。您可以输入如下内容:

if (object.property) {code here};

我搜索了网络,但没有内容说明为什么会这样。除了一些关于真假概念的浅薄讨论。这几乎有帮助,但很浅。下面是我用来发现这个问题的示例代码

var obj = {
    prop1: {
        propa: "x",
        propb: ["b", "q", "y"],
        prop3: "y",
        prop4: "zz"
    }
},
    output = document.getElementById("output");
if (obj.prop1) {
    output.innerHTML = "The propery exist.";  //The property exist shows. 
} else {
    output.innerHTML = "The property does not exist.";
}

所以问题是 Javascript if 语句执行什么过程以从诸如 if (object.property) {} 之类的语句返回布尔答案?

【问题讨论】:

  • 是的,真实性和虚假性正是这里所应用的。 if 条件中的值被转换为布尔值,就像!!xBoolean(x) 一样,这就是控制流的决定因素。访问对象上不存在的属性会产生值 undefined,这是虚假值之一 - 在条件中被视为 false
  • 非常感谢Bergi,但这是否意味着当您放入if (object.property) {} 之类的表达式时。它 1) 导航到对象 2) 按对象中的名称搜索对象中的属性以查找该特定属性。 3)如果找到则评估为真,如果没有找到则为假
  • 不,如果找到,则评估为属性的值,如果未找到,则评估为 undefined。就像任何财产访问一样。然后,在第四步中,由于该值用于预期为布尔值的if 条件,该值被转换为布尔值。
  • 如果有帮助:它的评估与 var value = obj..prop1; if (val) { … } else { … } 没有区别
  • 是的,它确实有帮助。如果我有一个评估为 false 的值,例如 prop1 中的 NaN,而不是评估为 true 的对象。我本可以早点看到它。谢谢

标签: javascript object if-statement search


【解决方案1】:

与所有编程语言一样,JavaScript 期望表达式在 if (expr) 中的大括号之间计算为布尔值。现在,当表达式不计算为布尔值时,JavaScript 使用所谓的强制转换值。也就是说,它在评估if (object.property) {} 时隐式运行if(Boolean(object.property)) {}

此操作的结果取决于object.property 的值,您可以查阅此表了解其工作原理:

https://dorey.github.io/JavaScript-Equality-Table/

或阅读docs 中关于真实性语义的文档。

但是请注意您的发现和检查属性是否存在之间的区别:

const object = { property: false };
if (object.property) {
    console.log("No go. The value evaluates to false.")
} 

if ("property" in object) {
    console.log("Yes. The property exists.");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多