使用条件运算符声明数组元素的Javascript意外行为?

时间:2012-12-18 17:04:20

标签: javascript arrays syntax

我对javascript很新,我看到了这个我无法理解的问题,

以下是Chrome的代码和检查器输出,

> test?'test':'ok'
"ok"
> [test?'test':'ok']
["ok"]
> ['ok' + test?'test':'ok']
["test"]

这个阵列发生了什么?我想要的只是创建一个数组 ['浏览器'+ isIE? 'IE':'未知''。

我可以用[isIE? 'browser:IE':'browser:UNKNOWN']有效。但我不明白上面的语法有什么问题?

2 个答案:

答案 0 :(得分:5)

您可以将[isIE? 'browser: IE' : 'browser: UNKNOWN']重写为:

["browser: " + (isIE ? 'IE' : 'UNKNOWN') ]

我建议 总是使用括号和条件运算符。

一个常见的陷阱是:bool ? "a" : "b" + "c"会提供"a""bc",但不会提供预期的"ac"

(bool ? "a" : "b") + "c"是预期的功能。

另一个陷阱:

'ok' + test?'test':'ok'提供"test""ok"但不提供"oktest""okok"。这是因为'ok' + test被视为布尔值(我认为它总是正确的吗?)。

'ok' + (test ? 'test' : 'ok')是预期的功能。

答案 1 :(得分:2)

这是表达式的评估方式:

('ok' + test) ? 'test' : 'ok';

评估'ok'test的串联,如果真的则返回'test',否则返回'ok'

你想要的是:

'ok' + (test ? 'test' : 'ok');

'ok'连接到三元表达式的结果,如果'test'是真实的,则test,否则'ok'

<强>更新

具体例子。这将返回你想要的东西。

'browser: ' + (isIE? 'IE' : 'UNKNOWN')

我不确定你是否用方括号包装表达式来表示数组,但是我把它们留在了这里; - )