我试图理解这个函数,当我们给它一个数字时它会返回序数。
不幸的是,我无法弄清楚如何使用条件运算符,有人可以向我解释吗?
function getOrdinalNum(n) {
return n + (n > 0 ? ['th', 'st', 'nd', 'rd'][(n > 3 && n < 21) || n % 10 > 3 ? 0 : n % 10] : '');
}
答案 0 :(得分:3)
解释这种情况的最好方法是使用if
语句将其分解为一个函数。看一下newFunction
与功能getOrdinalNum
所做的相同的事情:
function getOrdinalNum(n) {
return n + (n > 0 ? ['th', 'st', 'nd', 'rd'][(n > 3 && n < 21) || n % 10 > 3 ? 0 : n % 10] : '');
}
function newFunction(n) {
if (n > 0) {
if ((n > 3 && n < 21) || n % 10 > 3) {
return n + 'th'; // essentially returning ['th', 'st', 'nd', 'rd'][0];
} else {
return n + ['th', 'st', 'nd', 'rd'][n % 10];
}
}
}
for(let i = 1; i < 9; i++) {
console.log(getOrdinalNum(i));
console.log(newFunction(i));
}
答案 1 :(得分:1)
像这样分解它:
n +
(
n > 0
? ['th', 'st', 'nd', 'rd']
[
(n > 3 && n < 21) || n % 10 > 3
? 0
: n % 10
]
: ''
);
这里:
n > 0
。如果是,则:
['th', 'st', 'nd', 'rd']
[]
告诉我们一个property accessor将紧随其后0
(将表示(th
)或n & 10
的结果n
,都会添加访问该属性的结果。n
小于等于0
,则无论n
是多少,都会向其中添加一个空字符串。了解operator precedence in JS很有帮助。认真阅读并练习一些。
答案 2 :(得分:0)
三元条件运算符与大多数其他运算符的不同之处在于,它需要3个操作数,而不是一两个。
您习惯于一元运算符,例如-5
中的负号,它采用一个操作数并将其设为负值。
还有 binary 串联运算符+
像'hello ' + 'world'
一样使用。这里有两个产生值'hello world'
的操作数。
三元条件运算符的格式为
/* conditional expression */ ? /* expression if truthy */ : /* expression if not truthy*/
其中的注释是操作数,供您填写示例中更复杂的代码。 // if n > 0 then the complex expression, otherwise the empty string
尝试在浏览器中运行以下语句。
console.log(true ? 'true value' : 'false value');
var x = 3 > 1 ? 'true value' : 'false value';
console.log(x);
prompt('try entering a blank space, or characters') ? 'a' : 'b';
代码流与其他答案所描述的大致相同。如果条件为真,则发出第一个表达式,否则发出第二个表达式。