这种评估在Javascript中称为什么?

这种评估在Javascript中称为什么?,javascript,Javascript,最后的部分,(sfx[(val-20)%10]| | sfx[val]| | sfx[0]);这种评估在javascript中是否有特定的名称?有人能告诉我它叫什么,这样我就可以学习如何使用它们,试着弄清楚这段代码是如何工作的 谢谢它使用从左到右的求值来指定您想要的值 如果第一项的计算结果为未定义,则第二项的计算结果为未定义,依此类推 因此,在本例中,它用于根据日期的外观获得正确的后缀 它被用来代替嵌套大量的if。如果您指的是|的使用,它被称为短路评估。这是一种获得第一条有效语句以执行的方法。

最后的部分,(sfx[(val-20)%10]| | sfx[val]| | sfx[0]);这种评估在javascript中是否有特定的名称?有人能告诉我它叫什么,这样我就可以学习如何使用它们,试着弄清楚这段代码是如何工作的


谢谢

它使用从左到右的求值来指定您想要的值

如果第一项的计算结果为未定义,则第二项的计算结果为未定义,依此类推

因此,在本例中,它用于根据日期的外观获得正确的后缀


它被用来代替嵌套大量的if。

如果您指的是
|
的使用,它被称为短路评估。

这是一种获得第一条有效语句以执行的方法。
如果语句无效,它将移动到下一个,从左到右。第0个数组元素是有效的,因为它是定义的,所以您知道如果没有其他内容,您总是会有某种有效的输出,这就是为什么最后一条语句必须在那里的原因。但是,由于这些运算符是且不强制布尔强制,因此它们可以用于“默认值”或“替代值”,因为它们将返回它们之间的第一个真实值(除
未定义的
null
NaN
0
、或
false
)以外的任何值:

function ord(n) {
  var sfx = ["th","st","nd","rd"];
  var val = n%100;
  return n + (sfx[(val-20)%10] || sfx[val] || sfx[0]);
}
或者最后一个虚假的价值,如果没有一个是真实的:

返回n+(sfx[(val-20)%10]| | sfx[val]| | sfx[0])可以延长为:

console.log(false || 0 || null); // null

里面发生了两件事

正在内联计算数组索引。如果你不熟悉%,它就是数学模运算符:也就是说,它说“从val中减去20,然后除以10取余数”,或者减去10,然后只取十进制中的最后一位数字

x | | y | | z
结构是关于获取第一个非伪值的:javascript中的
| |
操作符具有返回第一个非伪值的奇数属性,而不一定是实际值true。也就是说:

3 | | 5
返回3

0 | | 5
返回5

false | | 5
返回5


因此,代码所做的是说,“取这三个计算中的第一个非伪数”,这意味着前两个可能访问声明数组项之外的值(因此返回“未定义”),实际上意味着“尝试前两个计算。如果它们失败,则默认返回“th”

这是一段特别难看和棘手的代码。你想从中学到什么?你在谈论什么行为?不太可能,它只是做了一些相当简洁的计算。看到它用了很多时间,我知道它反对什么,为什么用它,但很有趣,你问它是否有名字,它叫黑客,它既美丽又可怕。如果这是正确的,那么这绝对是可怕的。逻辑OR运算符可以计算为非布尔类型的值?@Jordan总是忘记
NaN
。谢谢。:)@奥利:是的;逻辑
运算符计算为第一个truthy操作数,如果两者都不是truthy,则计算为第二个操作数。结果是一样的:如果你测试结果的真实性,你仍然会得到一个真或假。严格来说,这里有趣的行为不是短路:这特别指的是,一旦结论确定,对逻辑表达式的进一步评估就会终止。也就是说,
getTrueValue()| | getFalseValue()
根本不会调用
getFalseValue()
,因为or操作符只需要其中一个为true。对于OP的问题,JS的怪癖是返回实际值,而不是强制使用布尔值作为答案;短路可被视为一种理想的优化:即在第一个良好结果的基础上进行。
console.log(false || 0 || null); // null
if (sfx[(val-20)%10]) {
    return n + sfx[(val-20)%10];
} else if (sfx[val]) {
    return n + sfx[val];
} else {
    return n + sfx[0];
}