js问题,为什么结果是“three” “two” “one”“three” “two” “one”

function symmetryArr(arr){
                   var arr2 = arr.reverse();
                   return(arr);                  
            }
            var scc = ["one", "two", "three"];
            // var css = scc.reverse()
            alert(scc  + symmetryArr(scc))

问题1:为什么最终alert的结果是“three” “two” “one”“three” “two” “one”而不是"one", "two", "three”“three” “two” “one”?

问题2:为什么我给alert(scc + "," +symmetryArr(scc))中间加上一个逗号结果就变成了"one", "two", "three”“three” “two” “one”?

问题3:以上两种形式都是从左到右执行,为什么第一种将scc的值修改了而第二种没有?

答案1:先说原因:reverse() 方法用于颠倒数组中元素的顺序,方法不会创建新数组,而是改变了原数组。整个过程是定义scc,然后下面拿到scc和symmetryArr(scc)再alert,再执行函数的时候会改变原数组,所以此时变量scc也变成了reverse()之后的数组了。故出现此结果

答案2:加上','所起的作用是拼接一个String字符串,从而使scc强制转为字符串,也就是说执行函数也将scc转为了[“three” “two” “one”],只不过,此时前面已经代码执行了拼接,从而此时的alert中的scc已然变为了字符串,所以字符串scc的值不会受到影响

答案3:重点看一下加粗部分,字符串和变量,总结起来:字符串不会被“策反”改变,而变量会随数组是什么,它就是什么。

该方法会改变原来的数组,而不会创建新的数组。

这个应该是你执行 symmetryArr 这个函数的时候吧scc这个变量也赋值更改了 加逗号就正常 不太清楚 应该是把scc变成了个字符串先进行了  函数无法赋值 

我说一下我的个人理解。

这个问题涉及js中‘+’运算符的机制和数组的浅拷贝

当执行alert(scc + symmetryArr(scc))从左往右执行,先执行scc,然后执行‘+’,接着执行symmetryArr(scc),把scc当做参数传入,函数内执行对数组arr进行置换操,正常情况当在函数内部对形参执行操作的时候,是不会影响实参的,但是这里的参数是一个数组,也就是说arr其实是scc的一个浅拷贝,那么arr的操作就会影响到scc,最后两者都会被置换位置,当函数执行完后,这时‘+’左右都是[three,two,one],对应‘+’运算符来说,只要有一侧不是数字,就会将两侧都转为字符串,然后相加,也就变成了字符串的连接,因此输出three,two,onethree,two,one。

当执行alert(scc + ‘,’ + symmetryArr(scc))时同样从左往右执行,先执行scc,然后执行‘+’,接着执行‘,’,这时‘+’运算符左右存在非数字,那么转为字符串相连,这时还没有执行函数,所以scc是[one,two,three],就变成了one, two, three,。然后执行函数,将scc置换,同样‘+’两侧存在非数字,那么转为字符串one, two, three,three,two,one。