所在实习公司的JS笔试题

在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没做过这份题~~),开始还觉得蛮简单。。。。。。后来觉得还是很有意思的,贴出来一起看看。

题目一:

if(!("a" in window)){
    var a = 1;
}
 alert(a);

题目二:

var a=1,
     b= function a(x){
         x&&a(-xx);
     };
 
alert(a);

题目三:

 function a(x){ 
..     return x*2; 
.. }
   var a;
   alert (a);
    

题目四:

function b(x,y,a){ 
..   arguments[2] = 10; 
..   alert(a); 
.. }
   b(1,2,3);
    

题目五:

function a() {
    alert(this);
}
a.call(null);

题目六:
写深度克隆的代码。

答案和分析:

题目一,有人认为a没有存在window里面,所以输出a=1,还有人认为a在私有作用域,alert访问不到。是undefined。

首先结果的确是undefined。先说第二种情况,所谓私有作用域一般都是写在function里面的,在这些判断语句里面有赋值操作,就要看这些判断语句所处的作用域,这里很明显全局的。所以a不是私有变量。

下面可以尝试输入以下代码试试:

alert(“a” in window);
var a;

首先所有的全局变量都可以作为window的属性,window.a,所以可以用上述方法查看a是否存在window中。上面的输出是true,因为Js中所有的变量声明都会在作用域的顶部(有点类似函数声明的预编译)。js引擎会首先搜索所有的变量声明然后提到作用域的顶部,但是变量的赋值却不会提前(如果是的话,可以想像会发生很多不可预知的错误),var a=1;是等价于var a; a=1;的。
所以这道题,因为变量a会在作用域顶部存在window中,所以跳过赋值操作,输出结果是undefined。

题目二:

function a(){
    return 1;
}
var a;
alert(typeof  a);    //"function"

这个题有点意思,上面说过函数声明会提前,变量声明也会提前,现在var a;要提前,function a也要提前。。。。。。到底谁会覆盖谁呢?

function a(){
    return 1;
}
var a;
alert(typeof  a);    //"function"

很明显上面上面中函数声明会覆盖变量声明,优先级较高一点。但是改成var a=1;之后结果却是截然相反的。


function a(){
    return 1;
}
var a =1;
alert(typeof a);    //“number”
当变量申明遇到VO中已经有同名的时候,不会影响已经存在的属性。var a;只是一个变量声明,不会影响已经存在的function  a 的值。
而当赋值的时候,就会相当于重写a。但要记住函数声明会比变量声明提前,所以一般会是被赋值重写。
也许有人或说,a被重写,在用a(--)岂不是会出现错误。在这里a没有被执行,一般 函数没有被执行 内部没有明显语法错误 可以看成黑盒


题目三:

题目二中有涉及,所以答案是function。。。。。。。。。。。。

题目四:

深入理解JavaScript系列(12):变量对象(Variable Object)》中的函数上下文中的变量对象一节就可以清楚地知道,活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象:

AO = {   arguments: <ArgO> };

Arguments对象是活动对象的一个属性,它包括如下属性:

  1. callee — 指向当前函数的引用
  2. length — 真正传递的参数个数
  3. properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。

这个共享其实不是真正的共享一个内存地址,而是2个不同的内存地址,使用JavaScript引擎来保证2个值是随时一样的,当然这也有一个前提,那就是这个索引值要小于你传入的参数个数,也就是说如果你只传入2个参数,而还继续使用arguments[2]赋值的话,就会不一致,例如:

function b(x, y, a) {     arguments[2] = 10;     alert(a); } b(1, 2);

这时候因为没传递第三个参数a,所以赋值10以后,alert(a)的结果依然是undefined,而不是10,但如下代码弹出的结果依然是10,因为和a没有关系。

function b(x, y, a) {     arguments[2] = 10;     alert(arguments[2]); } b(1, 2);

题目五:

根据ECMAScript262规范规定:如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(也就是window)作为this的值。所以,不管你什么时候传入null,其this都是全局对象window,所以该题目可以理解成如下代码:

function a() {     alert(this); } a.call(window);

所以答案是object window。

题目六:

深度克隆,百度会有代码的。

 

 

 

posted on 2013-09-09 11:35  happycloud~~  阅读(383)  评论(2编辑  收藏  举报