function f1 (n) {return (n++);}
f1(2); // 结果 2
function f2 (n) {return ++n;}
f2(2); // 结果 3
function f3 (n) {return n+=1;}
f3(2); // 结果 3
function f4 (n) {return n++;}
f4(2); // 结果 2
想问下,为什么f1()的结果是2呢? return 后的括号不能提升优先级么? 为何f3()返回结果不是2呢?
其实这里我想你有一个误区,你认为f1调用后,返回的应该是 (n++) 这个值,但是不是的,而是返回了2. 要解决你这个问题其实你可以稍稍把你的f1函数修改下,改成 function f1 (n) {let r = (n++); return r;} 然后进行debug,你就会发现好玩的事情就发生了... 这里有需要掌握的知识有值传递、作用域至少这两个概念,其次是要知道无论你是否添加括号,在n++这个运算中,n都是优先赋值然后自己再执行++操作,理解清楚这一点你这个问题就随之而解了。
你的f1和f4没啥区别;
f2和f3基本一样,都是n先进行自加,然后再赋值...
是的,我在 f1()调用后,想返回 (n++),所以,我想增加 括号,提升运算优先级。但结果并不正确。
又如,f3(),我理解的 应该会 先返回 n ,再 n+=1; 结果也不对。
你说的这个,function f1 (n) {let r = (n++); return r;}我执行了下f1(2),结果也返回 2;感觉括号()没有起到提升优先级的作用。 let r = (n++); 等效于 let r = n++; 这是为什么?
我还是没有太理解,能细讲下吗?或给些知识点连接。
我又遇到了一个问题,我觉得应该也是我对当前这个知识点没理解到的原因:三目运算;
https://q.cnblogs.com/q/140150/
n==1 ? 3-1 : 9-2;
我的理解这个运算等效于 (n==1 ? 3-1 : 9)-2;
但我测试的结果,等效于 n==1 ? (3-1) : (9-2)
这个我也没有理解到。为什么?
关于 debugger执行,
function f1 (n) { debugger; let r = (n++); debugger; return r; }
我执行测试时,走到这一步,
1、在Edge 中,选中了 n左边的括号;
2、在火狐中,选中了n字母;
3、在chrome中,选中了 n++字母;
然后(F11)一跳而过, r=2 n=3,就算完了。还是没看懂。
@淋风淼淼: 好吧,我再来做个回答吧,希望可以解决你的疑惑,其实答案中已经说了,这里你需要了解值传递和作用域的概念。
首先看如下例子吧,希望看完你能明白,如果还不明白可以 私信 我。
<script>
function f1 (n) {
let r = (n++)
let r1 = n
console.log("n=" + n)
console.log("r="+ r)
console.log("r1="+r1)
return [r,r1]
}
console.log(f1(2))
</script>
在f3中,n+=1 这个表达式还原下,它的本来面目是 n=n+1,这个是本来面目,你理解下这个表达式,然后你就会明白为啥返回的是n+1的结果而不是n呢?
最后广告下,本人目前提供技术咨询解答服务,可以试用,简单说就是你们可以先提你们搞不明白的问题,然后合适了可以付费咨询,可以包年、包月、包天....哈哈哈,三包服务...
@淋风淼淼: 博客园私信我吧
这里简单点说 let r = (n++); 这里无论你是否添加了括号,它其实对结果r都是没有影响的
原因你思考如下问题:
1、n++这种运算符在计算机中运算时都是先使用n然后n才会参与运算,这个你明白的对吧
2、n++ 这个结果执行后n变为了3对吧
明白了以上两点你如果还不明白那就私信我吧
你这个括号加与不加,都没有影响到计算逻辑;你如果要想影响,必须得有计算,类似(n+1)*(n+2)这种,你现在只是单纯返回
是因为没有计算,所以 括号没有起到提升运算优先级的作用吗?
@淋风淼淼: 对,你在这个地方加与不加没有区别
n+=1等于n=n+1;不是等于n++
没有理解, n+=1 和 n++ 运算之后 不都是 n=n+1吗?
@淋风淼淼: 差不多吧,但n+=1是直接得到结果,n++是当前结束再+1,大概理解就是n++的话,结果就是return 2之后n才去加1,n+=1的话是+1完再return。n++和++n也是不一样的