|| (或)三元运算符在 JS 和 React 中不起作用

|| (or) in ternary operator is not working in JS and React

我有以下三元组,它检查名为 isCheckedprop 是否为 true。如果为真,则检查另一个道具是否为 true,如果为真,则使用该道具,否则,它使用对象中的不同变量:

props.isChecked ? '2px solid ' + props.theme || vars.blue : '2px solid ' + vars.black 
// if isChecked is true, check if theme is true, and if not use vars.blue, otherwise something else

vars.blue = "1778f2" | vars.black= "111111"

只有在我指定 theme 属性时它才有效,否则它将无效。这里有什么问题?

尝试使用模板字符串。

props.isChecked ? `2px solid ${props.theme || vars.blue}` : `2px solid ${vars.black}`
props.isChecked ? '2px solid ' + (props.theme ? vars.blue : vars.black) : ''

看看这个是否可行

+最高operator precedence,然后是||,然后是条件运算符? ... :.

没有括号,你的代码将被这样计算:

props.isChecked ? (('2px solid ' + props.theme) || vars.blue) : ('2px solid ' + vars.black)

括号可以提供自定义运算符顺序。添加以下内容:

//                               v--------------------------v
props.isChecked ? '2px solid ' + ( props.theme || vars.blue ) : '2px solid ' + vars.black 

这里发生的事情是由operators precedence造成的。

+运算符的优先级高于||,所以'2px solid ' + props.theme || vars.blue总是会先解析'2px solid ' + props.theme,然后将结果作为操作数传递给[=16] =].

在任何情况下,|| vars.blue 永远不会被解析,因为您的字符串总是以 2px solid 开头,因此永远不会是假的。

你可以这样修正你的三元表达式:

props.isChecked ? '2px solid ' + (props.theme || vars.blue) : '2px solid ' + vars.black;

现在对于代码样式,您应该尽可能避免对字符串使用 + 运算符,并尽可能使用 template literals :

const result = `2px solid ${props.isChecked ? props.theme || vars.blue : vars.black}`;

您不会在这里遇到运算符优先级问题,因为您不会以这种方式混合它们。

我建议去掉后缀,用三元不加同值

'2px solid ' + (props.isChecked
    ? props.theme || vars.blue
    : vars.black
)