与同事讨论时,$null
应该在支票的左侧还是右侧?为什么这很重要的任何例子?
$abc = $null
$null -eq $abc
True
$abc -eq $null
True
一切正常
$abc = 6,7,$null,8,9
$null -eq $abc
False
$abc -eq $null
*No output*
有人可以解释比较数组时发生了什么吗?
答案 0 :(得分:5)
执行比较操作时,PowerShell将评估操作的 first 操作数,以确定它是 collection 还是 scalar 值。如果是标量,它将把操作数彼此比较为整个对象。
2 -eq 1,2,$null,3
False
$null -eq 1,2,$null,3
False
4 -eq 1,2,$null,3
False
如果它是一个集合,它将在集合中进行迭代,将每个元素与第二个操作数进行比较,如果找到匹配项,则返回第二个操作数的值。
1,2,$null,3 -eq 2
2
1,2,$null,3 -eq $null
<nothing appears, indicating returned value is $null>
1,2,3 -eq 4
<nothing appears, indicating returned value is $null>
第二个和第三个示例之间的关键区别。除非您完全了解,否则第二个操作数始终是 还是从不 $null
,否则您将无法信任比较操作的输出
另一方面,如果两个操作数都是集合,则-eq
在每种情况下都会返回$null
,因为您不能使用-eq
来比较集合。
因此要回答这个问题,通常将$null
放在左侧是一个好习惯,因为在比较操作中使用$null
时,假定想要比较标量值。如果这个假设是错误的,那么$null
可能会更好地放在另一侧,但这不太可能。
相反,我总是将$null
放在右边,因为我在上述假设下编写了我的代码-当明确提到$null
时,我总是比较标量值在比较操作中。这样,当我返回非布尔值时,我知道我没有正确访问方程式中的集合对象。但是,我被困在陷阱中,所以通过改变方式可以更好地服务于我的编码实践。
总而言之,就像任何编码实践一样,这是一个见解的问题。如果我要教PowerShell,我会教这种做法。但是,我发现我不太可能改变自己的煽动性方式。
答案 1 :(得分:0)
-eq与左侧的数组不同。很多运营商。
1,2,3 -eq 2
输出:
2
因此,在您的情况下,它返回的不是$ 2,因为$ null在数组中。