在SegmentFault网上看问题的时候(这个网站是真的厉害,以前很多问题在上面看到答案就跑到这网站上来闲逛),看到别人发的一个知乎的链接,就点进去看,https://www.zhihu.com/question/20127472/answer/17925170,发现这个问题我以前也不知道,挺有趣的。
摘取几个我觉得不错的回答句子:
1.这个时候 EMCAScript 解析器会认为 alert 是个「引用类型(Reference Type)」,那么它将会在当前作用域(默认为 window)去寻找这个引用类型引用的值,那么 windows.alert 自然是个函数。
同时,他留下了这个问题:
* [1,2,3][0||1,2] * [1,2,3][1,2||3] * ("hello","world")[1,2,3]
这个问题放到后面解决
2.不是括号的问题,是逗号运算符。
多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
这是从C语言借鉴过来的属性。
看到他的回答,我就去搜索了一下逗号运算符,看到百度百科上举了这个例子:
int a1,a2,b=2,c=7,d=5; a1=(++b,c--,d+3); a2=++b,c--,d+3;
对于给a1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(d+3)的值,为8,所以a1的值为8。
对于给a2赋值的代码,也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=4(第2行代码运算完时,b=3,即第3行代码运行时,b的值为4)。
这里要注意的几点,首先,它虽然是只得到最后的表达式,但是这种++他还是会计算(自己得出的结论),其次,如果没有()括号运算符之后,他就直接得到第一个表达式了,这应该是运算符的优先级问题。
第三个人的回答:
这既不是什么“遗留问题”,也不是什么“故意”设置,是因为你对整个js的体系完全不了解,建议先放下来多看书,别急着提问,了解大局后就不会有这种问题了。
----
在(1,2,3)里,括号和逗号都是运算符,逗号运算符返回最后一个表达式的求值结果,具体规则可自己查。
("Amazing")的括号表示函数调用。
alert是一个函数对象,当它作为表达式的求值结果返回,当然可以被调用。
[1,2,3]这里的方括号是声明数组常量,紧跟[1]表示取数组元素。[1,2,3][1]意为取[1,2,3]这个数组里的第一个元素,即2(下标从0开始)
[1,2,3][1,2]=[1,2,3][(1,2)]=[1,2,3][2]=3;
汗!哎,看来我就是他说的那个对整个js的体系完全不了解的人了,不过他这个回答最近人意吧,直接解释,看了他的基本就明白啦。
最后总结:逗号整个表达式的值是最后一个表达式的值。但是遇到++的时候还是会计算,如果没有()括号运算符就会直接得到第一个表达式的值。那么问题来了,第一个回答下那个人的问题怎么解:
* [1,2,3][0||1,2] * [1,2,3][1,2||3] * ("hello","world")[1,2,3]
忧伤,又出来个新的||运算符,得,又不知道结果啦,百度下先。
条件运算符具有右结合性
当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。
例如: w<x ? x+w : x<y ? x : y 与 w<x ? x+w : ( x<y ? x : y) 等价 与 (w<x ? x+w : x<y) ? x : y 不等价
但若在java语言里,JAVA中条件表达式的值必须参与运算。
publicclassdemo{ publicstaticvoidmain(String[]args){ inta=10,b=20,y; a>b?(y=a):(y=b);//1,这样写是错误的 y=a>b?a:b;//2,这样写是正确的 y=a<b?b:b<c?a:c;//3,这样写是正确的 } }
以上程序中,1处错误是由于条件表达式的值没有参与运算,不能构成语句。3处(b<c?a:c)先结合,再将这个值参与到另一个条件运算中去,是合法的,这也说明了条件运算符的右结合性。
运算符妙用
——用条件表达式判断输出单词的单复数。
程序示例:ChooseDemo05.java
程序中会自动根据apples的个数来输出单词的单数或复数。
publicclassChooseDemo05{ publicstaticvoidmain(String[]args){ intapples=1;//苹果的个数 System.out.println("Ihave"+apples+"apple"+(apples==1?".":"s.")); } }
1、 在某些地方使用“他”还是“她”。当然,还有其他的应用:
2、日期输出时决定使用后缀“st”、“nd”等。
然而看完这个词条我还是没得到||运算符的一些消息。
我又找了一会,还是没有找到答案,于是我就自己试,发现我暂时的结果是,||运算符一般会取前面这个数,如:1||5,会取得1,但是当前面这个数为0时,会取得后面这个数,当两个数都为0时,则会取得0,我还不知道为什么,但是暂时我试了几次都是这样。(
"hello"
,
"world"
)[
1
,
2
,
3
],这个当然后面会取得3,前面的话,我试了下,他会取第后面这个数,即world,那么3就是获得这个词第三个字母,即l。这些是我实验的发现。