if(a)和if(a!=null && a!=undefined)的区别

3

因为对象或数组中没有我想要使用的值,所以在填充DOM数据时我遇到了很多问题。

例如,我有一个对象:

var obj = {
  name: 'rajat',
  age: 20
}

我正在动态地将数据填充到HTML元素中,例如:

<p id='paragraph'></p>  

var data = document.getElementById('paragraph');
data.innerHTML = obj.name;

现在,我只想在为HTML元素分配值之前添加条件,我对if(obj.a)if(obj.a!=undefined && obj.a!=null)感到困惑。
请问有人能解释一下两者之间的区别吗?

4个回答

5

if(obj.a)将会被评估为true,如果obj.a的值为真值,则一切都是真值,但是

  • false
  • 0
  • +0-0
  • ""''`` -长度为0的字符串
  • null
  • undefined
  • NaN

if(obj.a!=undefined && obj.a!=null)即使obj.a为以下内容时也会被评估为真:

  • false
  • 0
  • +0-0
  • ""''`` -长度为0的字符串
  • NaN

因此,它不那么具有排他性,obj.a可以是更多的值而不需要进入if


1
“false”不等于“false”吗? - ibrahim mahrir
1
我认为这个 false 值被错误地重复了,实际上在我打字的时候已经修复了。 - Huangism
1
第二个 if 的答案有点令人困惑。如果 obj.a 是 "hello"、215 或几乎任何其他值,它也会被评估为 true。知道它何时评估为 false 可能会很有用。 - Mark
@MarkMeyer 我认为 "即使,如果" 已经涵盖了那个。 - Luca Kiebel
这个列表仍然不完整。完整的列表在这里 - Sebastian Simon
@Xufox 我省略了 document.all,因为它与问题无关,而 +/-0 将在编辑中添加。 - Luca Kiebel

4
if (obj.a)

测试是否 obj.a 不是 null, undefined, NaN, 0, false, 或者 ""(空字符串)中的任何一个。

if (obj.a != undefined && obj.a != null)

只是检查nullundefined,与以下内容完全相同

if (obj.a != null)

因为这是!=的定义方式。事实上,这是使用!=比使用!==更可取的少数几种情况之一。
[编辑] 评论中指出,由于JavaScript中存在-0(在所有IEEE浮点系统中都存在),因此它也是“假值”。

这个列表不完整。完整的列表在这里 - Sebastian Simon
@Xufox,你用-0这个我服气了,但是document.all?那肯定不可能在语言规范里。 - Pointy
@Pointy MDN:提供对文档中所有元素的访问。这是一种遗留的、非标准的属性,不应该被使用。 - Luca Kiebel
1
@Luca 当然,它将是 nullundefined,但语言规范不知道也不关心浏览器API。换句话说,就JavaScript而言,在 document.alldocument.zimbabwe 之间没有区别。 - Pointy

1
在Javascript中,if评估条件的“真实性”。以下值为“虚假”:
  • false
  • undefined
  • null
  • ""
  • +/-0
  • NaN

其他任何内容都将被评估为true。因此,在您的情况下,如果obj.a是以上任何符号,则if(obj.a)将评估为false。但是,if(obj.a != undefined && obj.a != null)仅检查这两个值(undefinednull),这意味着如果该值是任何其他虚假项,则仍将评估为true。

此博客可作为进一步解释的良好资源:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/


1
同时,NaN 也是“假值”。 - Pointy
这仍然是不完整的。完整列表在这里 - Sebastian Simon
@Xufox 虽然那个列表可能更明确,但我认为 0 暗示着 +/-0。我知道它们是不同的,但两者都是 0。话虽如此,我会在帖子中明确说明这一点。另一个区别只有 document.all,在旧版 IE 浏览器中实际上会评估为 true(这是不太可能的情况,但并非不可能)。我认为假设 document.all 是 falsey 是不好的做法。 - TFrazee

0
这与JavaScript的类型转换有关,它是一个概念,确定值如何转换为不同的类型。 JavaScript是一种弱类型语言(没有像int、string等严格的类型)。
因此,如果JS引擎遇到一个if语句并需要将表达式转换为布尔值。
例如:

// Boolean converts the value to a boolean
// The following values are converted to false, the rest is converted to true

console.log(Boolean(0));  // false
console.log(Boolean(''));  // false
console.log(Boolean(null));  // false
console.log(Boolean(undefined));  // false
console.log(Boolean(NaN));  // false
console.log(Boolean(false));  // false

// Bonus you can also convert to boolean really concise with the double !! operator 
// For example:

console.log(!!5);  // true
console.log(!!'random');  // true

因此代码:
if(a!=null && a!=undefined){}

不同于

 if(a){}

因为你错过了其他类型,这些类型会被转换为false。例如:

if(NaN){
  console.log('I wont log');
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接