zoukankan      html  css  js  c++  java
  • 【前端】2015阿里前端实习生在线笔试题

    网上找的题,自己做了做。

    ...

    2015阿里巴巴前端实习生在线笔试题

    1. (单项选择)对于下列程序运行结果,符合预期的是

    function f1() {
      console.time('time span');
    }
    function f2() {
      console.timeEnd('time span');
    }
    setTimeout(f1, 100);
    setTimeout(f2, 200);
     
    function waitForMs(n) {
      var now = Date.now();
      while (Date.now() - now < n) {
      }
    }
    waitForMs(500);

    A. time span:700.077ms       B. time span:0.066ms

    C. time span:500.077ms       D. time span:100.077ms

    答:

    • console.time() 和 console.timeEnd() 这两个方法用于计时,可以算出一个操作所花费的准确时间。

    time方法表示计时开始,timeEnd方法表示计时结束。它们的参数是计时器的名称。

    调用timeEnd方法之后,console窗口会显示“计时器名称: 所耗费的时间”。

    (详情见我的博客《Web前端学习笔记【1】》第23条)

     

    • 引用《JavaScript高级程序设计》里的一段话:

    第100ms和200ms的时候,f1 和f2 就已经被装进消息队列里了。

    而 waitForMs() 占用了主线程500ms,导致这500ms内主线程没有取消息,导致f1 和 f2被装进消息队列里以后并没有立即被取出来,而500ms之后f1 和f2 几乎是同时连续地被取出来的。

    所以,f1 和 f2 几乎就同时执行了。

    如图:

    2. (单项选择)请选择结果为真的表达式:

    A. null instanceof Object         B. null == undefined

    C. NaN == NaN                     D. false == undefined

    答:

    undefined:

    undefined是全局对象(window)的一个特殊属性,其值是未定义的。但typeof undefined返回undefined。 

    未定义的值和定义未赋值的为undefined.

    null:

    null是一种特殊的object,所以typeof null 返回的应该是object。但是null instanceof Object返回的是false, 原因就是null是个特殊的Object类型的值 ,表示空引用的意思 。instanceof 表示某个变量是否是某个对象的实例 ,所以为false 。

    null是一个对象,但是为空。因为是对象,所以typeof null返回object 。null是JavaScript保留关键字。 null参与数值运算时其值会自动转换为0,因此,下列表达式计算后会得到正确的数值: 表达式:123 + null 结果值:123 表达式:123 * null 结果值:0 

    undefined == null是正确的,但null和undefined并不是等价的。每个作为其独特的类型的唯一成员,undefined是Undefined类型和null是Null类型。所以undefined === null是不正确的,因为他们虽然值相等,但是类型不相等。区分这两个值,可以认为undefined代表一个意想不到的没有值而null作为预期没有值的代表。

    NaN是一个值类型,同是也是一个数值.意思是Not A Number,这个都知道是什么意思.值比较特殊,特殊在于NaN是一个数字,是一个与任何数值都不相等的数字。所以NaN == NaN返回false。

    undefined被转换为布尔值为false,Boolean(undefined)返回的是false,但是undefined不等于false。所以false == undefined返回false。 

     

    3. (单项选择)下面程序的执行结果是:

    var name = 'World!';
    (function () {
        if (typeof name === 'undefined') {
            var name = 'Jack';
            console.log('Goodbye '+ name);
        } else {
            console.log('Hello ' + name);
        }
    })();

    A. Goodbye Jack          B. Hello Jack

    C. Hello undefined       D. Hello World

    答:

    变量提升。函数内的name是局部变量

    4. (不定项选择)以下关于DOM事件流的表述哪些是正确的

    A. 事件流包括两个阶段:事件捕获阶段、事件冒泡阶段。

    B. IE跟标准浏览器对于DOM事件流实现不一样

    C. 假设parentEle是childEle的父节点,绑定事件:

      parentEle.addEventListener(“click”, fn1, false)和

      childEle.addEventListener(“click”, fn2, false),当点击childEle的时候fn1将先于fn2触发。

    D. addEventListener第三个参数true代表支持捕获,false代表不支持捕获

    答:

    当一个事件发生以后,它会在不同的DOM节点之间传播(propagation)。这种传播分成三个阶段:
    第一阶段:从window对象传导到目标节点,称为“捕获阶段”(capture phase)。
    第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。
    第三阶段:从目标节点传导回window对象,称为“冒泡阶段”(bubbling phase)。

    “DOM2级事件流”规定的事件流包括三个阶段:事件捕获阶段、事件处于目标阶段、事件冒泡阶段。

    addEventListener第三个参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。  

    IE只支持事件冒泡,通过attachEvent()添加的事件处理程序都会被添加到冒泡阶段。

    详情见我的博客《Web前端学习笔记》第24、25、26条

    5. (不定项选择)通过下面的哪些方法可以获取页面的html元素

    A. document.getElementById

    B. document.getElementsByClassName

    C. document.querySelector

    D. document.querySelectorAll

    答:

    详情参见《JavaScript参考教程》第5.2 document节点 (http://javascript.ruanyifeng.com/dom/document.html#toc11)  的第3.3

    6. (不定项选择)下面选项中,对javascript事件的描述不正确的是:

    A. IE使用attachEvent/detachEvent方法来添加和删除事件监听器;w3c使用addEventListener/removeEventListener方法。

    B. IE是将event对象作为参数传递给监听器,w3c事件监听器内使用的是一个全局的Event对象。

    C. IE提供了对事件捕获阶段的支持。

    D. 要停止事件的传递,IE的做法是设置event对象的cancelBubble为true,而w3c的做法是设置执行stopPropagation方法。

    答:

    B 写反了。C 无中生有。

    7. (单项选择)

    var array1 = [1,2];
    var array2 = array1;
    array1[0] = array2[1];
    array2.push(3);
    console.log(array1);
    console.log(array2);

    执行上面的代码array1和array2的值分别是什么?

    A. Array1的值为[2,2];Array2的值为[1,2,3]

    B. Array1的值为[2,2,3];Array2的值为[1,2,3]

    C. Array1的值为[2,2,3];Array2的值为[2,2,3]

    D. Array1的值为[1,2,3];Array2的值为[1,2,3]

    答:

    数组对象是引用的关系。

    array1 和 array2 指向的是同一个数组对象。一个改变,另一个也会改变。

    8. (不定项选择)有如下代码:

    function Test(name,age){
        this.name = name;
        this.age = age;
    };
    Test.prototype = {
        name:’aliyun’,
        hasOwnproperty:function(){
        return false;
    }
    };
    var instance = new Test(‘alibaba’,102);

    以下关于原型链的说法正确的是:

    A. JavaScript对象有两种不同的属性,一种是对象自身的属性,另一种是继承于原型链上的属性

    B. instance.name == ‘aliyun’为true

    C. instance.hasOwnproperty(‘age’)结果将是false

    D. 所有对象都继承自Object.prototype

    答:

    instance.name 将会覆盖掉 Test.prototype.name, 所以B错。

    9. 实现函数range([start,]stop[,step])返回一个数组(step大于1)

    > range(1,11); => [1,2,3,4,5,6,7,8,9,10]

    > range(0); => []

    > range(10); => [0,1,2,3,4,5,6,7,8,9]

    > range(0,30,5); => [0,5,10,15,20,25]

    答:

     1 function range() {
     2     var arr = [],
     3         start = 0,
     4         stop = 0,
     5         step = 1;
     6     switch(arguments.length) {
     7         case 1:
     8             stop = arguments[0];
     9             break;
    10         case 2:
    11             start = arguments[0];
    12             stop = arguments[1];
    13             break;
    14         case 3:
    15             start = arguments[0];
    16             stop = arguments[1];
    17             step = arguments[2];
    18             break;
    19         default:
    20             throw Error('number of arguments must be 1, 2 or 3');
    21     }
    22     if (step < 1) 
    23         throw Error('step must >= 1');
    24     for (var i = start; i < stop; i += step) {
    25         arr.push(i);
    26     };
    27     return arr;
    28 }
     

     

    10. 背景:

    ①. 对象A直接调用对象B的某个方法,实现交互逻辑。但是导致的问题是A和B紧密耦合,修改B可能导致A调用B的方法失效。

    ②. 为了解决耦合导致的问题,我们可以设计成:

    对象A生成消息 -> 将消息通知给一个消息处理器(Observable)-> 消息处理器将消息传递给B

    具体的调用过程变成:

    A.emit(‘message’,data); B.on(‘message’,function(data){});

    请实现这一事件消息代理功能

    //请将事件消息功能补充完整

    function EventEmitter(){

       

    }

    答:

    暂时不会

    11. 实现下图的布局

    <main>

        <div>

            A

        </div>

        <div>

            B

        </div>

        <div>

            C

        </div>

    </main>

    答:

     1 div {
     2     /* important: */
     3     height: 50px;
     4     line-height: 50px; /* line-height一定要等于height */
     5     width: 50px;
     6     background-color: black;
     7     display: inline-block;
     8     color: white;
     9     text-align: center;
    10     
    11     /* not important: */
    12     margin-left: 10px;
    13     font-size: 20px;
    14 }

     

    12. 有一个包含数据列表的页面,数据行数不确定。每一行数据都有一个删除按钮,单击删除按钮删除该列数据,请用JavaScript实现该功能。

    答: 

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     <ul>
     9         <li><button>删除一</button></li>
    10         <li><button>删除二</button></li>
    11         <li><button>删除三</button></li>
    12         <li><button>删除四</button></li>
    13         <li><button>删除五</button></li>
    14         <li><button>删除六</button></li>
    15     </ul>
    16     <script>
    17         window.addEventListener('load', function () {
    18             var ul = document.getElementsByTagName('ul')[0];
    19             ul.addEventListener('click', function (ev) {
    20                 ev = ev || window.event;
    21                 var target = ev.target || ev.srcElement;
    22                 // 当点击的元素===button元素时,移除此button所属的li元素
    23                 if (target.tagName.toLowerCase() === 'button') {
    24                     var li = target.parentNode;
    25                     li.parentNode.removeChild(li);
    26                 }
    27             });
    28         });
    29         // 另一种写法(不推荐):
    30         // window.onload = function () {
    31         //     var btnArr = document.getElementsByTagName('button');
    32         //     for (var i in btnArr) {
    33         //         btnArr[i].onclick = function (ev) {
    34         //             var ev = ev || window.event;
    35         //             var target = ev.target || ev.srcElement;
    36         //             var li = target.parentNode;
    37         //             li.parentNode.removeChild(li);
    38         //         };
    39         //     }
    40         // };
    41     </script>
    42 </body>
    43 </html>

     

     

    13. 编写CSS让一个已知宽高的DIV, 在PC/手机端水平垂直居中

    答:

     1 div {
     2     /* important: */
     3     position : absolute;
     4     top : 50%;
     5     left : 50%;
     6     margin-top : -150px; /* margin-top的大小一定要是height的一半 */
     7     margin-left : -150px; /* margin-left的大小一定要是width的一半 */ 
     8 
     9     /* not important: */
    10     width : 300px;
    11     height : 300px;
    12     border : 1px solid red;
    13 }

      

    14. 使用语义化的 HTML 标签及css完成以下布局

     

    • 容器默认宽度320px,图片100*100

    • hover 时容器宽度变为400px

    • 右侧文字宽度自适应,考虑模块化和扩展性

    答:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5     <style type="text/css">
     6     div {
     7         width: 320px;
     8     }
     9     div:hover {
    10         width: 400px;
    11     }
    12     img {
    13         float : left;
    14         width : 100px;
    15         height : 100px;
    16     }
    17     h1 {
    18         color : #333;
    19         margin-bottom : 8px;
    20         font-size : 20px;
    21     }
    22     p {
    23         color : #666;
    24         font-size : 12px;
    25         line-height: 1.2em;
    26     }
    27     </style>
    28 </head>
    29 <body>
    30 <div>
    31     <img src="/Users/zhaokang/Desktop/c.jpg">
    32     <h1>第一行<br>第二行</h1>
    33     <p>some text some text some text some text some text some text some text some text some text some text </p>
    34 </div>
    35 </body>
    36 </html>


      

    15. 写一个可以暂停执行的JS函数

    答:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5 </head>
     6 <body>
     7     <input type="button" value="继续" onclick='bar();'/>
     8     <script>
     9         function foo(x){
    10             return function(){
    11                 console.log(x++);
    12             }
    13         }
    14         var bar = foo(10);
    15     </script>
    16 </body>
    17 </html>

     

    16. 用JavaScript写一个Ajax的get请求

    答:

     1 var request;
     2 if (window.XMLHttpRequest) {
     3     request = new XMLHttpRequest();
     4 } else {
     5     request = new ActiveXObject('Microsoft.XMLHTTP');
     6 }
     7 request.onreadystatechange = function () { // 状态发生变化时,函数被回调
     8     if (request.readyState === 4) { // 成功完成
     9         // 判断响应结果:
    10         if (request.status === 200) {
    11             // 成功,通过responseText拿到响应的文本:
    12             return success(request.responseText);
    13         } else {
    14             // 失败,根据响应码判断失败原因:
    15             return fail(request.status);
    16         }
    17     } else {
    18         // HTTP请求还在继续...
    19     }
    20 }
    21 // 发送请求:
    22 request.open('GET', 'some url...', true);
    23 request.send();
    24 alert('请求已发送,请等待响应...');
    25 // ======用来处理结果的函数======
    26 function success(text) { /* ... */ }
    27 function fail(code) { /* ... */ }

    
    
    

     17. 使用html+css实现以下图形(不能用图片)

     

    答:

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <title>picture</title>
     5     <style type="text/css">
     6         #rectangle {
     7             height: 120px;
     8             width: 200px;
     9             border: 10px solid #999999;
    10             padding: 10px;
    11             
    12             /* not important: */
    13             background: #fff;
    14         }
    15         .innerShape {
    16             position:absolute;
    17         }
    18         #circle {
    19             margin-left: 140px;
    20             margin-top: 10px;
    21             width: 40px;
    22             height: 40px;
    23             background: #999999; 
    24             border-radius: 20px;
    25 
    26             /* not important: */
    27             -moz-border-radius: 20px; 
    28             -webkit-border-radius: 20px; 
    29         }
    30         .triangle {
    31             width: 0; 
    32             height: 0; 
    33         }
    34         #triangleLeft {
    35             /* 40 + 80 = 120 */
    36             margin-top: 40px;
    37             border-bottom: 80px solid #999999; 
    38 
    39             border-left: 50px solid transparent; 
    40             border-right: 70px solid transparent; 
    41         }
    42         #triangleRight {  
    43             margin-left: 90px;
    44 
    45             /* 60 + 60 = 120 */
    46             margin-top: 60px;
    47             border-bottom: 60px solid #999999;
    48 
    49             border-left: 30px solid transparent; 
    50             border-right: 70px solid transparent; 
    51         }
    52     </style>
    53 </head>
    54 <body>
    55     <div id="rectangle">
    56         <span id="circle" class="innerShape"></span>
    57         <span id="triangleLeft" class="triangle innerShape"></span>
    58         <span id="triangleRight" class="triangle innerShape"></span>
    59     </div>
    60 </body>
    61 </html>

     

     

    18. 数组去重,然后使数组元素按降序排序 

    答:

    1 Array.prototype.unique = function () {
    2     var newArray = [];//结果数组
    3     for (var i = 0; i < this.length; i++) {
    4         if (newArray.indexOf(this[i]) === -1) {
    5             newArray.push(this[i]);
    6         }
    7     }
    8     return newArray;
    9 }


    或者:(速度更快)
     1 Array.prototype.unique = function () {
     2     var arrayMap = {}, newArray = [];
     3     for (var i = 0; i < this.length; i++) {
     4         if (!arrayMap[this[i]]) {
     5             arrayMap[this[i]] = true;
     6             newArray.push(this[i]);
     7         }
     8     }
     9     return newArray;
    10 }

    最后:
    1 arr = arr.unique();
    2 arr.sort(function (a, b) {
    3     return a - b;
    4 });
    
    
    
    
    

    19. 已知:

        var data = {
    name: 'xiaoming',
    age: '18'
    };
    var template = "My name is {$name}, my age is {$age}";
        //写一个函数,实现:
    foo(template, data) => "My name is xiaoming, my age is 18."

     答:

    function templateReplace(template, data) {
    for (var i in data) {
    oldRe = new RegExp('\\{\\$' + i + '\\}', 'g');
    newStr = data[i].toString();
    template = template.replace(oldRe, newStr);
    }
    return template;
    }

    20. 利用闭包,实现点击<p>时,被点击的p的背景色变为#eee

    答:(暂时没有利用闭包...)

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5 </head>
     6 <body>
     7     <p>第一个</p>
     8     <p>第二个</p>
     9     <p>第三个</p>
    10 
    11     <script>
    12         window.addEventListener('load', function () {
    13             var body = document.body;
    14             body.addEventListener('click', function (ev) {
    15                 if (ev.target.tagName.toLowerCase() === 'p') {
    16                     ev.target.style.backgroundColor = '#eee';
    17                 }
    18             })
    19         });
    20     </script>
    21 </body>
    22 </html>

     

    ====================================

    1. 

    var arr = [1,2,3,4,5];
    arr.splice(1,2,3,4,5);
    arr = ?

    答:

     arrayObject.splice(index,howmany,item1,.....,itemX) 

    参数描述
    index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
    howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    item1, ..., itemX 可选。向数组添加的新项目。

     

     

     

    ...

  • 相关阅读:
    监控代码运行时长 -- StopWatch用法例程
    验证码处理算法(一)
    Linux下安装JDK及相关配置
    JAVA爬虫---验证码识别技术(一)
    JAVA4大线程池
    海量数据去重(上亿数据去重)
    python协程与异步协程
    解决WinSCP连接虚拟机
    生产消费者模式与python+redis实例运用(中级篇)
    生产消费者模式与python+redis实例运用(基础篇)
  • 原文地址:https://www.cnblogs.com/forzhaokang/p/5184682.html
Copyright © 2011-2022 走看看