我是 JS 新手,正在练习编写逻辑。任何帮助/批评表示赞赏。对于整个功能,而不仅仅是我的具体问题。
我的问题是:为什么这段代码返回 --> [3,5]
function divisors(integer) {
let divisors = []
for (let i = 2; i < (integer/2); i++){
if (integer % i === 0){
divisors.push(i)
}
}
return divisors
};
divisors(15)
但是下面的代码返回True
function divisors(integer) {
let divisors = []
for (let i = 2; i < (integer/2); i++){
if (integer % i === 0){
divisors.push(i)
}
}
return divisors ? divisors != [] : 'test${interger} is prime'
};
divisors(15)
这就是我想写的: 如果除数 != [],则返回除数,否则 f'{integer} 是素数'
如果你能准确解释两个代码块之间发生了什么,那就太好了
条件运算符由三个部分组成:
condition ? true value : false value
你写道:
divisors ? divisors != [] : 'test${interger} is prime'
所以条件是
divisors
(即是divisors
真值)。
如果是,则返回
divisors != []
。 !=
运算符为您提供一个布尔值。没有值会等于全新的数组,因此 divisors != []
将始终为 true。
这就是我想写的:如果除数!= [],则返回除数,否则 f'{integer} 是素数'
那么你有三个问题
divisors
永远不会不等于全新的数组。测试“是否为空数组”就是测试它的
length
。
divisors.length > 0 ? divisors : `test${interger} is prime`
您可以将 divisors.length > 0
简化为
divisors.length
,因为
0
是假值,任何其他数字都是真值。
但是下面的代码返回True这就是这次操作的结果:
divisors ? divisors != [] : 'test${interger} is prime'
如果 divisors
是truthy 值,则此表达式解析为
divisors != []
的结果,即
true
。否则,它将解析为字符串
'test${interger} is prime'
。大概您的
意图是如果它非空则返回divisors
,否则返回字符串。在这种情况下,您可以测试数组的length,并返回数组本身(而不是与空数组进行比较)。例如:
divisors.length > 0 ? divisors : 'test${interger} is prime'
此外,如果该字符串是一个模板文字,那么它使用了错误的引号:
divisors.length > 0 ? divisors : `test${interger} is prime`
不是“单行 if 语句”。这是使用三元条件运算符的表达式。虽然功能具有相似的方面,但三元条件表达式和 if
语句/块不能相互替代。
数字 15 的约数是 [1, 3, 5, 15],假设这应该是你的输出。
情况并非如此,因为您从 2 开始循环迭代(明确排除除数 1)并且仅上升到整数的一半,这意味着您最终也会排除整数本身作为除数。
在这种情况下,您只剩下 3 和 5,如第一个结果所示。
关于第二个结果:
您的单行/单语句/三元验证divisor 是否具有值。如果它有值,则将结果返回给条件:
divisors != []
鉴于它有一个值,[3, 5],如前所述,并且上面的陈述为真,您将获得 True 作为函数输出。
我相信您想要实现的目标:
return divisors != [] ? divisors : f'{integer} is prime'
上面的三元语句计算第一个条件(除数与空数组不同),如果为 true,则返回除数,否则返回第二个条件(字符串),格式如下:
return {condition} ? {value_if_true} : {value_if_false}
如果答案足够清楚,请告诉我,还有什么我可以帮助的。