今天进行了一次周考,其中有两道不错的题,第一是记录一下,第二也是分享一下
第一题:变量的作用域
var x=10;
var y=20;
function f(x){
x=x+10;
y=x;
}
f(x);
console.log(x,y);
首先,这道题打眼一看,这不很简单吗,x=20,y=20吗。可惜,Simple Doesn't Mean Easy。
先看函数f,函数中并没有return语句,因此这个函数并没有输出。再看变量,x,y是全局变量,但是f函数内的x却是形参,是局部变量,它的作用域仅限于函数内部,出了函数就无效了,而且这个函数也没有输出,因此,x没有变化
再看y,y也还是20,哪怕你函数内对y运算了,但是值还是20.这里的y=x应该是会执行的,只不过是值没变。
over。这是一个小坑。
第二题隐式转换
document.write(!5>6);
题再次的很简单,首先分析一下,这道题输出的是!5>6的值,大于号是关系运算,返回的应该是true or false。
PS.这里还牵扯一个小问题,计算顺序问题,一般一元计算符是优先于二元计算符的,因此要先算!再算>
再来分析左边,5是数字型,而!是逻辑运算符,因此应当先把5转换为布尔型,也就是true(我认为0是false,除了0都是true)。
!true=false,所以左边现在就是就是false。现在算式变为false>6.
我觉得false与6仍旧不能运算,个人认为,关系运算的两边应该是相同的数据类型,因此我们再把false转换为数字型,false就是0,算式最终结果为0>6,返回false
这个坑有点大,也有点绕,全程都是隐式转换。
end