• 可能遇到的面试题


    1 面试题数组

        // TODO 定义空数组

        var arr1 = [ ];   ——字面量方式

        var arr2 = new Array();   ——构造对象方式

        console.log(typeof arr1);// object

        console.log(typeof arr2);// object

        // TODO 定义空字符串

        var str1 = '  ' ;

        var str2 = new String();

        console.log(typeof str1);// string

        console.log(typeof str2);// object

        // TODO 定义数字值

        var num1 = 100;

        var num2 = new Number(100);

        console.log(typeof num1);// number

        console.log(typeof num2);// object

        // TODO 定义布尔值

        var boo1 = true;

        var boo2 = new Boolean(true);

        console.log(typeof boo1);// boolean

        console.log(typeof boo2);// object

    2面试题以下哪个写法是错误的 C

        /*var a = {}; - 对象

        var b = []; - 数组

        var c = ();没见过

    var d = //; - 正则表达式*/

    3比较forfor...in

    TODO for循环可以控制循环的开始和结束。

      for (var i=0; i<arr.length; i++){

            console.log(arr[i]);

        }

    TODO for......in 循环只能获取数组中的所有元素。

     for (var i in arr){

            console.log(arr[i]);

        }

    4 要求自定义完成数组元素的由大到小的排序

    var arr = [1,3,3,6,4,8,9,5];

    for(var i=0;i<arr.length;i++){

    for(var j=i+1;j<arr.length;j++){

    if(arr[i]>arr[j]){

    var c = arr[i];//比较大小

       arr[i] = arr[j]

       arr[j] = c;

    }

    }

    }

    console.log(arr);//"1,3,3,4,5,6,8,9"

    TODO 创建一个数组将数组中重复的元素去除

    var arr = [1,3,3,6,4,8,6,5];

    for(var i=0;i<arr.length;i++){

    for(var j=i+1;j<arr.length;j++){

    if(arr[i] == arr[j]){//j位置的元素删除

    arr.splice(j,1)//删除相同的元素

    j--;

    }

    }

    }

    console.log(arr);// "1,3,6,4,8,5"

    面试题  如何反转字符串

    1.使用split将字符串转换为数组

    2.数组进行反转

    3.将数组转换为字符串

     数组值从小到大排列

    var arr = [1,2,3,4,7,8,4,6,7,2];
    arr.sort(function(a,b) {
        if (a < b) {  
            return -1;
        } else if (a > b) {
            return 1;
        } else {
            return 0;
        }
    });
    console.log(arr);

    TODO 1. 实现数组去重的方式
    TODO    a. 循环数组中所有的元素
    TODO    b. 完成数组中元素的比较(是否重复)
    TODO    c. 如果重复,删除重复的元素

      第一种方式 循环嵌套

    var arr =[1,6,8,4,4,3,1,4,5,6,];
    for(var i = 0;i<arr.length;i++){
        for(var j = i+1;j<arr.length;j++){
            if(arr[i] == arr[j]){
                arr.splice(j,1);
                j--;
            }
        }
    }
    console.log(arr);//[1,6,8,4,3,5]

    TODO    * 优化嵌套循环 - 改为一次循环

    TODO a. 定义一个空数组

    TODO b. 循环原数组

    TODO c. 判断新数组中是否与原数组当前的元素重复

    TODO d. 表示新数组中没有原数组当前的元素 - 添加到新数组中

    Eg:

    var arr = [1,2,3,4,5,6,2,2,4,6];

    var n = [];   //定义空数组

    for(var i=0;i<arr.length;i++){   //循环原数组

    if(n.indexOf(arr[i]) === -1){  //判断新数组中是否与原数组当前元素重复。   相等表示新数组中没有原数组当前的元素 ------添加到新数组中。

    n.push(arr[i]);//添加的数组的最后一位

    //n[n.length] = arr[i]与上句话同意思

           } }

    console.log(arr);// "1,2,3,4,5,6,2,2,4,6"

    console.log(n);// "1,2,3,4,5,6"

    TODO 定义一个函数 - 专门用于数组元素去重

    TODO * 函数中可变内容 - 一般都为参数

    function quchong(arr){

    var n = [];

    for(var i = 0;i < arr.length;i++){

    if(n.indexOf(arr[i]) === -1){

    n.push(arr[i]);

    }

    }

    console.log(n);// "1,3,2,4"

    }

    var a = [1,3,2,3,2,2,4];

    quchong(a);

    或者(输出分别用returnconsole.log

    function quchong(arr){

    var n = [];

    for(var i = 0;i < arr.length;i++){

    if(n.indexOf(arr[i]) === -1){

    n.push(arr[i]);

    }

    }

    return n;

    }

    var a = [1,3,2,3,2,2,4];

    console.log(quchong(a))

    【面试笔试】DOM全称Document Object Model文档对象模型

    * 三个对象

    * document(文档)对象

         * node(节点)对象

         * element(元素)对象

     Node对象

       * 遍历节点

         * 祖先与后代 -> 可以利用 父与子 的关系完成

         * 父与子

           * 父节点 - parentNode

           * 子节点

             * firstChild - 第一个子节点

             * lastChild - 最后一个子节点

             * childNodes - 所有子节点(类数组-NodeList)

         * 兄弟

           * previousSibling - 前一个兄弟节点

           * nextSibling - 后一个兄弟节点

         * 注意

           * 问题 - 父与子节点关系中,浏览器自动添加一个空白文本节点

           * 解决 - 利用 getElementsByTagName() 方法解决

       * 插入节点

         * parent.appendChild(child)方法

           * child 插入到 parent 节点的所有子节点列表的最后

         * parent.insertBefore(newChild,oldChild)

           * newChild 插入到 parent 节点中子节点为 oldChild 的前面

         * 问题 - DOM 的插入节点操作没有 insertAfter() 方法

         * 注意

           * 如果将新创建的标签插入到HTML页面中指定的标签中 - 新增标签

           * 如果将HTML页面中已存在的标签插入到指定标签中 - 移动标签

    nodeValue 获取和设置指定标签的文本内容兼容问题:

    var one = document.getElementById('one');
             if(one.textContent === undefined){
                 // TODO IE 8以下
                 console.log(one.innerText);//IE浏览器

    }else{
                 console.log(one.textContent);//其他浏览器

    }

    获取当前样式兼容解决方案

    var btn4 = document.getElementById('btn4');
    btn4.onclick = function(){
        var div = document.getElementById('div1');

    if(window.getComputedStyle){
                 // TODO 其他浏览器
               var style = window.getComputedStyle(div, null);
          }else{
                 // TODO IE 浏览器
                 var style = div.currentStyle;
          }

    事件监听器与事件绑定的区别(面试题)

    TODO 事件绑定

     为相同标签绑定相同事件多次

    btn.onclick = function(){
        console.log('这是通过事件绑定实现的.')
    }
    TODO * 事件绑定方式 -> 最后一次绑定的事件处理函数有效
    TODO * 实际的原因是函数覆盖与被覆盖的问题

    TODO 事件监听器 - addEventListener()
    TODO * 事件处理函数 -> 回调函数

    btn.addEventListener('click',function(){
        console.log('这是通过事件监听器实现的.')
    });
    TODO 为相同标签绑定相同事件多次
    TODO * 多次绑定的事件处理函数逻辑全部有效
    TODO * (了解)取消绑定 - btn.removeEventListener()
    TODO   * 可以针对以上两种方式
    TODO 总结
    TODO * 事件绑定只是事件监听器的一种简化写法

    * 移除事件监听器(了解)

           removeEventListener(eventName, functionName, boolean)方法

           * eventName - 表示事件名称

           * functionName - 表示当前绑定事件的处理函数

             * 注意 - 与addEventListener()中的functionName是同一个函数

           * boolean - 表示设置事件是捕获阶段还是冒泡阶段

    事件监听器的兼容方案

    * addEventListener() - 其他浏览器(ChromeFirefoxIE 9/10/11)

     * attachEvent() - IE 6/7/8

    定义一个函数,解决事件绑定的兼容问题,

    绑定事件的元素是动态的,它应该是一个参数。

    事件的事件名称是动态的,它应该是一个参数。

    事件的处理函数是动态的,它应该是一个参数。

    * addEventListener() – click  其他浏览器
     * attachEvent() – onclick  IE浏览器

    if(btn.addEventListener){
        // TODO 其他浏览器
              btn.addEventListener('click',function(){
                  console.log('这是事件监听器实现的.')
              });
    }else{
        // TODO IE 浏览器
              btn.attachEvent('onclick',function(){
                  console.log('这是事件监听器实现的.')
              });
    }

    通用的事件监听器兼容方案

    function bind(elem, eventName, functionName){
              if(elem.addEventListener){
                  // TODO 其他浏览器
                  elem.addEventListener(eventName,functionName);
              }else{ // TODO IE 浏览器
                  elem.attachEvent('on'+eventName,functionName);
              }
    }
    bind(btn, 'click', function(){
              console.log('这是事件监听器实现的.')
    })

    TODO addEventListener()方法 - 其他浏览器
    TODO element.attachEvent(eventName, functionName) - IE 8之前的版本
    TODO * 参数
    TODO   * eventName - 表示事件名称,例如"onclick"、"ondblclick"等
    TODO   * functionName - 表示事件处理函数

    This的用法

    根据函数调用的方式不同this的值也不同:

    1. 函数的形式调用,thiswindow
    2. 以方法的形式调用,this是调用方法的对象
    3. 构造函数的形式调用,this是新创建的那个对象
    4. 使用callapply调用的函数,第一个参数就是this
    5. 在全局作用域中,thiswindow
    6. 响应函数中,给谁绑定的事件this就是

    解决兼容问题(事件对象event

    function bind(elem, eventName, functionName){
              if(elem.addEventListener){
                  // TODO 其他浏览器
                  elem.addEventListener(eventName,functionName);
              }else{
                  // TODO IE 浏览器
                  elem.attachEvent('on'+eventName,functionName);
              }
          }
       bing(btn,'click',function(event){
              // TODO 事件对象的浏览器兼容解决方案
       var event = event || window.event;
    });

    事件的兼容问题 通用(事件对象)

    var mylink = document.getElementById('mylink');

     var ul = document.getElementById('ul');

     function fun(btn,eventName,functionName){

      if(btn.addEventListener){

      btn.addEventListener(eventName,functionName);

      }else{

      btn.attachEvent('on'+eventName,functionName);

      }

     }

     fun(ul,'click',function(event){

      console.log(event.target);

       var target = event.target || event.srcElement;

       console.log(this);

     })

     2 获取目标元素兼容问题 

    * event.target属性 - 其他浏览器支持

         * event.srcElement属性 - IE 8浏览器支持

          * 注意 - this与event.target的区别

            * event.target - 获取触发当前事件的元素

            * this - 获取绑定当前事件的元素

    ul.addEventListener('click',function(event){

      console.log(event.target);//解决兼容问题

       var target = event.target || event.srcElement;

       console.log(this);

     })

    浏览器的兼容问题(阻止默认行为)

    if(event.preventDefault){

    event.preventDefault();//其他浏览器

    }else{

    event.returnValue = false;//IE浏览器

    }

    兼容问题阻止事件冒泡

    var d3 = document.getElementById('d3');
    d3.addEventListener('click',function(event){
        alert(d3.id);
        event.stopPropagation();//其他浏览器
    },false);
    d3.attachEvent('onclick',function(event){
        alert(d3.id);
        event.cancelBubble = true;//IE浏览器
    });

    使用setTimeout()改写setInterval()

    ①var num = 0;

      function fn(){

       console.log(num);

       num++;

      setTimeout(fn,1000);

      }

      fn();

      

    ②var num = 0;

      function fn(){

       console.log(num);

       num++;

      }

      setInterval(fn,1000);

    运用setTimeout()clearTimeout();常用

    var show = document.getElementById('show');

    var num = 0,t;

    var start = document.getElementById('start');

    start.onclick = startNum;

    function startNum(){

    show.value = num;

    num++;

     t = setTimeout(startNum,1000);

    }

    var stop = document.getElementById('stop');

    stop.onclick = function(){

    clearTimeout(t);

    }

    运用setInterval()  clearInterval();

    var num = 0,t;

    var show = document.getElementById('show');

    var start = document.getElementById('start');

    start.onclick = function(){

    t = setInterval( fn,1000);

    }

    function fn(){

    show.value = num;

    num++;

    }

    var stop = document.getElementById('stop');

    stop.onclick = function(){

    clearInterval(t);

    }

    22.1动态时钟案例(延迟调用)

    页面加载完毕后显示时间,每一秒刷新一次。

    var t;

       var show =document.getElementById('show');

       function startNum(){

        var time = new Date().toLocaleTimeString();//获取当时时间

        show.value =time;//获取的时间显示到界面

        t = setTimeout(startNum,1000);//设置定时器,多少秒获取一次

       }

       startNum();//调用函数,一次调用,一直循环。

         var stop =document.getElementById('stop');

         stop.onclick = function(){

          clearInterval(t);

         }

    22.1 轮播图效果(自动)

    TODO 思路的分析
    TODO * 先选择图片轮播是累加(向右)还是累减(向左)
    TODO   * 选择的结果没有多少区别
    TODO   * 如果选择向右自动轮播 - 修改向右轮播的逻辑代码
    TODO * 当点击向右或向左按钮时 - 自动轮播要停止

    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="UTF-8">

    <title>轮播图效果</title>

    <link rel="stylesheet" href="css/style.css" />

    <style>

    body {

    padding: 100px;

    }

    </style>

    </head>

    <body>

    <div id="carousel-example-generic" class="carousel slide" style=" 492px;">

    <div class="carousel-inner">

    <div class="item active">

    <img src="img/1.jpg" alt="...">

    </div>

    </div>

    <a id="prev" class="left carousel-control" href="#">

    <span class="glyphicon glyphicon-chevron-left"></span>

    </a>

    <a id="next" class="right carousel-control" href="#">

    <span class="glyphicon glyphicon-chevron-right"></span>

    </a>

    </div>

    </body>

    <script>

    var prev = document.getElementById('prev');

    var next = document.getElementById('next');

    var show = document.getElementsByTagName('img')[0];

    var index = 0;

    var imgArr = ["img/1.jpg" , "img/2.jpg" , "img/3.jpg" , "img/4.jpg" ,"img/5.jpg"];

    prev.onclick = function(){

    clearInterval(t);//解除定时播放

    prevName();//调用手动播放

    }

    function prevName(){

    index--;

    if(index<0){

    index = imgArr.length-1;

    }

    show.src = imgArr[index];

    }

    next.onclick = function(){

    clearInterval(t);//解除定时播放

    nextNum();//调用手动播放

    }

    function nextNum(){

    index++;

    if(index > (imgArr.length-1)){

    index = 0;

    }

    show.src = imgArr[index];

    }

    var t = setInterval( nextNum,1000);//定时播放

     * 面试题 - bind()one()live()on()的区别

                   unbind()die()off()的区别

           * one() - 事件绑定,只能绑定一次(触发一次即失效)

           * live() - 事件绑定,为后面添加的元素绑定事件

             * jQuery 1.7版本后,被弃用了

             * jQuery 1.7版本后,新增delegate()方法,作用与live()相同

           * bind() - 事件绑定

           * on() - 统一以上所有事件绑定

             * jQuery 1.7版本后,新增

    面试题: typeof instanceof 的相同点和不同点分别是什么?

    不同:判断类型不同,语法结构不同。

    相同:都能判断数据类型,都是关键字。

    instanceof 关键字

         * 作用 - 类似于 typeof 关键字。用来判断当前值的类型

    * typeof - 判断原始类型

           * instanceof - 判断包装类型

    特殊类型面试题undefined

       TODO 1. undefined是什么类型?
    TODO    * 既不是原始类型,也不是包装类型
    TODO    * undefined的类型就是 undefined
    TODO undefined本身就是一个类型
    TODO * 该类型中只有一个值 - undefined
    TODO null是什么类型? object
    TODO * null值是 Object(对象) 的一个特殊值
    TODO * 注意 - null并不是一个类型,而是一个值

    TODO ** 面试题 - nullundefined的共同点和不同点
      TODO   * 共同点
    TODO     * nullundefined 都代表空
    TODO   * 不同点
    TODO     * null
    TODO       * object 类型
    TODO       * 存在,不指向任何值
    TODO     * undefined
    TODO       * undefined 类型
    TODO       * 存在,但没值
    TODO *null 作用 - 释放资源

    * 特殊类型总结

       * undefined:表示未定义

         * undefined既是类型,也是值

           * undefined类型中只有一个值 - undefined

         * 得到undefined的情况 - 面试题

           1只声明,但不赋值

           2 声明也赋值,值为undefined

           3 函数中不明确指定 return - undefined - 函数内容

           4访问一个对象不存在的属性 - undefined - 对象内容

       * null:含义 -

         * 注意 - null只是一个值,而不是类型

         * nullobject 类型中的一个特殊值

         * 作用 - 释放资源

    8.3 类型转换

     * 隐式类型转换 - 没有明确转换方式【注意】

         * 转换为字符串 - '' + = 字符串

         * 转换为number - + = 数字值

         * 转换为布尔值 - !! = 布尔值

         * 注意 - 在实际开发中,类型的自动转换机制

       * 显式类型转换 - 明确转换方式【常用】

         * 转换为字符串 - String()

           * 提供了一个转换方法 - toString()

             * 将数字值使用 toString() 转换为 字符串 时

               * 先定义数字值的变量

               * 再利用该变量调用 toString()

         * 转换为数字值 - Number()

           * 整型 - parseInt()

             * 如果定义的是一个浮点型的数字值,直接去掉小数点后面的内容

           * 浮点型 - parseFloat()

             * 如果定义的是一个整型的数字值,直接转换

         * 转换为布尔值 - Boolean()

         * 注意 - 在实际开发中,一般使用这种方式

    11.2.2函数的案例【笔试题】

     // TODO 读代码题 - 提供这样的代码内容,让你说出输出结果

        var a;

          // TODO 声明变量,但没赋值

        console.log(a);// undefined

        a = 100;

          // TODO 变量赋值为 100

        console.log(a);// 100

        a = function(a){

             // TODO a是形参 - 实参的值为 200

            console.log(a);// 200

        }

        a(200);

         // TODO 将变量a重新赋值为一个函数

        console.log(a);// function

        a = 300;

         // TODO 将变量a重新赋值为 300

        console.log(a);// 300

     

  • 相关阅读:
    【Jsoi2010】连通数
    【CQOI2009】中位数图
    【POJ 1151】 Altlantis
    【2017省中集训】 香港记者
    【AHOI2009】中国象棋
    【SCOI 2009】 Windy数
    【HDU 4722】 Good Numbers
    【HDU 2089】 不要62
    BZOJ3129 SDOI2013方程(容斥原理+扩展lucas)
    BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
  • 原文地址:https://www.cnblogs.com/huifang/p/7067255.html
Copyright © 2020-2023  润新知