看到前同事的一段代码:
var st = $("#idA");
$("#idB").val() == "1" ? st.removeClass("hide") : [st.addClass("hide")][st.val("")];
虽然我也喜欢用js三元运算式,但后面这个用中括号括起来的语法还是第一次见,网上查了很久,最接近的答案也不过是在一篇文章里说到“JavaScript中括号有四种语义”:
语义1,声明数组
语义2,取数组成员
语义3,定义对象成员(可以不遵循标识符规则)
语义4,取对象成员
但我却依然很困惑:按照这四个语义解释,也就是中括号里面的都是数组或对象,但我上面的代码里,中括号里的明明是语句呀。求高手指导!
这段代码很糟糕,一定要避免这样写。
但是,并没有任何神奇的。
这一条语句,等价于下面两条语句
他用这种少见的方式强行把两个表达式合并成一个表达式,为的就是能够塞进三元运算符的第三个操作数位置。
正如@kikong说的,用逗号表达式也一样。
至于你问有什么语法意义:
第一个中括号是“Array Initialiser”,说白了就是数组字面量,用来定义一个数组。
第二个中括号是“Property Accessor”,也就是用来访问对象的属性(包括数组的元素)。
以上两种情况下,都会首先计算中括号中的表达式的值。你的代码并不是为了得到一个值,而是利用了求值过程中产生的副作用。
所以,这段代码逻辑上没有问题,但千万不可模仿。