所在实习公司的JS笔试题

在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没作过这份题~~),开始还以为蛮简单。。。。。。后来以为仍是颇有意思的,贴出来一块儿看看。html

题目一:web

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

题目二:函数

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

题目三:this

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

题目四:spa

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

题目五:3d

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

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

答案和分析:orm

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

首先结果的确是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。

题目六:

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

相关文章
相关标签/搜索