在班上无聊的时候看到了一份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。

题目六:

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

所在实习公司的JS笔试题的更多相关文章

  1. 某公司的U3D笔试题

    某公司的U3D笔试题   今天这套笔试题感觉做得一般. 随后是二对一的技术面试,但涉及的技术细节相对较少,更多的是对以前工作.项目经历的询问. 然后说今天先到这里,让我等通知. 我还特意问了一下,通知 ...

  2. 2016 JS 笔试题汇总:

    1 1 1 CS&S(中软国际): 1 JavaScript 循环表达式: 2  JavaScript表达式boolean返回值: 3 网页中的事件/HTML 事件属性/JavaScript ...

  3. 容易答错的JS笔试题

    1,考察this var length = 10 function fn(){     alert(this.length) } var obj = {     length: 5,     meth ...

  4. Js笔试题之千分位格式化

    用js实现如下功能,将给定的数字转化成千分位的格式,如把“10000”转化成“10,000”,并考虑到性能方面的因素. 一.首先想到的办法,将数字转换为字符串(toString())再打散成数组(sp ...

  5. 蛮考验基础的JS笔试题(有坑小心!)

    1.  考察this var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: functi ...

  6. JS笔试题

    JS 引用相关题目 以下代码输出什么? 为什么? var a = {n:1}; var b = a; a = {n:2}; a.x = a ; console.log(a.x); console.lo ...

  7. js笔试题一套(未完待续)

    1.下面程序的运行结果是: function test(x, y, z) { alert(test.length); alert(arguments.length); alert(arguments. ...

  8. Js笔试题之返回只包含数字类型的数组

    如js123ldka78sdasfgr653 => [123,78,653] 一般做法 分析: 1.循环字符串每个字符,是数字的挑出来拼接在一起,不是数字的,就给他空的拼个逗号 2.将新字符串每 ...

  9. Js笔试题之正则表达式

    一.复习字符串的传统操作 如何获取一个字符串中的数字字符,并按数组形式输出,如 dgfhfgh254bhku289fgdhdy675gfh 输出[254,289,675] 分析:循环用charAt() ...

随机推荐

  1. 用VBS将PPT转为图片

    '使用方法:把ppt文件拖放到该文件上. '机器上要安装Powerpoint程序 On Error Resume Next Set ArgObj = WScript.Arguments pptfile ...

  2. UITextField中文搜索

    导入头文件 #import "ChineseInclude.h"#import "PinYinForObjc.h" NSMutableArray *search ...

  3. POJ 2109

    #include<iostream> #include<stdio.h> #include<math.h> using namespace std; int mai ...

  4. 数据库链接 mysql,sqlserver

    1.生成对象工厂 /// <summary> /// 生成对象工厂 /// </summary> public class DBFactory { /// <summar ...

  5. JSON.stringify 函数 (JavaScript)

    在bsrck项目中,使用jQuery.Form.js的ajaxSubmit时,遇到有文件上传的form提交,在firefox和chrome浏览器中测试,报Bad Request的错误,经查代码后发现是 ...

  6. Linux网络编程3——socket

    宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...

  7. 批处理命令 - for

    0.功能 Runs a specified command for each file in a set of files.对一组文件中的每一个文件执行某个特定命令. ---------------- ...

  8. 创建新进程,就三个函数CreateProcessAsUser CreateProcessWithLogonW CreateProcessWithTokenW(附网友的流程)

    CreateProcessAsUser 怎么会还需要密码呢~~~ 先WTSGetActiveConsoleSessionId 得到当前的处理激活状态的SessionId OpenProcessToke ...

  9. c#实现打印功能,可以设置纸张大小,字体和颜色等

    /// <summary> /// 打印的按钮 /// </summary> /// <param name="sender"></par ...

  10. Clearing Floats清除浮动--clearfix的不同方法的使用概述

    清除浮动早已是一个前端开发人员必学的一课.毫无疑问,多年来,我们已经接触过多种清除浮动的方法,现在“clearfix methods”越来越被大家熟知.在深入剖析“clearfix”的多种用法之前,我 ...