2020-06-03面试广州某景科技公司

2020-06-06  本文已影响0人  南方小成

JavaScript基础篇

1,以下输出什么

for(var i =1; i<=5;i++){
      setTimeout(function timer(){
        console.log(i);
      },i*1000)
    } 

知识点:

JavaScript引擎是单线程运行的,浏览器无论在什么时候都有且仅有一个线程在运行JavaScript程序。编程过程中的setTimeout(类似的还有setInterval、Ajax)为异步执行

解析:实际结果是1-6秒都是输出6,这是为什么呢?这时就要去了解setTimeout函数的运行机制了,它会等到for循环全部运行完毕后,才会执行fun函数,当for循环结束后此时i的值已经变成了6因此虽然定时器跑了5秒,控制台上的内容依然是6(当定时器跑完一秒之后for循环已经做完了)
答案参考地址: https://blog.csdn.net/xmx1314520/article/details/80927422

2,以下输出什么

  function test(x, y, z) {
    console.log(test.length);
    console.log(arguments.length);
    console.log(arguments[2]);
  }
  test(1, 2);

答案: 3 2 true undefined
解析:

3,以下输出什么

  var a = 10;
      a.pro = 10;
      console.log(a.pro + a);
      var s = "hello";
      s.pro = "world";
      console.log(s.pro + s);

答案:NaN undefinedhello
解析:JavaScript引擎内部在处理对某个基本类型 a进行形如a.pro的操作时,会在内部临时创建一个对应的包装类型(对数字类型来说就是Number类型)的临时对象,并把对基本类型的操作代理到对这个临时对象身上,使得对基本类型的属性访问看起来像对象一样。但是在操作完成后,临时对象就销毁了,下次再访问时,会重新建立临时对象,当然就会返回undefined了

4,以下输出什么

  var f = 1;
  if (!f) {
    var a = 10;
  }
  function fn() {
    var b = 20;
    c = 30;
  }
  fn();
  console.log(a);
  console.log(c);
  console.log(b);

答案:undefined 30 报错:b is not defined
解析:

  1. 没有用var声明的是全局变量,即便在函数内部;
  2. 只有在function内部新声明的才是局部变量,在if,while,for等声明的变量其实是全局变量(除非本身在function内部)
  3. 因为变量提升,虽然if块的内容没执行,但是预解析阶段会执行var a,只是没有赋值而已,因此打印a是undefined而打印b会报错

5,以下输出什么

  (function () {
    // var a = (b = 5);
    var a=b=5
  })();
  // console.log(b);
  // console.log(a);

答案:5   Uncaught ReferenceError: a is not defined
解析:在这个立即执行的函数表达式中(IIFE)包含两个赋值操作,其中 a 使用 var 关键字进行声明,因此其属于函数内部的局部变量(仅存在于函数中),相反,b 被分配到全局命名空间,可以看作 var a = 5; b = 5;
另一个需要注意的时,这里没有在函数内部使用严格模式,如果启用了严格模式,代码会在输出 b 时报错 Uncaught ReferenceError: b is not defined ,需要记住的是,严格模式要求你显示的引用全局作用域

6,说说call和apply的区别

解析:Function.prototype.call()与Function.prototype.apply()方法的作用都是一样的 —— 改变this指向。
唯一的区别就是参数不同:

7,数组pop(),push(),shift(),unshift()有什么区别

知识点链接:https://blog.csdn.net/qwe502763576/article/details/79055682

8, 以下输出什么

  let a=101;
  let b=a>100&&(a=70)
  let c=(a>50)||(a=25)
  console.log(a,b,c);

答案:70  70  true
知识点链接:https://blog.csdn.net/m0_37263637/article/details/79964874

9,说说==和===区别

答案:==表示等同,===表示恒等。==只比较内容,而===既比较内容也比较数据类型。
知识点链接:https://www.cnblogs.com/mycnblogs-guoguo/p/10101355.html

10,例举JavaScript基本数据类型和引用数据类型

答案:
基本数据类型:Null、Undefined、Boolean、String、Number。
引用数据类型:Object、Array、Date、RegExp
知识点链接:https://blog.csdn.net/weixin_41646716/article/details/81700761

11,例举浏览器本地存储几种方式,并描述他们不同

答案:

12,说说es6的‘=>’的作用

答案:

  1. 类似于匿名函数,在某些情况下使用,可减少代码量
  2. 代码简洁,this提前定义
  3. 代码太过简洁,导致不好阅读
  4. this提前定义,导致无法使用js进行一些在ES5里面看起来非常正常的操作(若使用箭头函数,在监听点击事件的回调函数中,就无法获取到当前点击的元素咯
  5. 总的来说,箭头函数只是一种函数的简写,有其利弊,可用可不用,看大家心情,当然也得用的正确
    知识点链接:https://blog.csdn.net/qq_32614411/article/details/80897256?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase

13,简写出一个数组的去重算法

答案:

//es6
    function deleteRepeat(arr){
        const seen=new Map(){
            return arr.filter((a)=>!seen.has(a)&&seen.set(a,1));
        }
    }
    //or
    function deleteRepeat2(arr){
        return Array.form(new Set(arr))
    }

知识点学习:https://www.cnblogs.com/luxueping/p/5593910.html

14,以下代码依次输出的内容是

  setTimeout(function(){
    console.log(1);
    
  },0);

  new Promise(function executor(resolve){
    console.log(2);
    for(var i=0; i<10000;i++){
      i=9999 && resolve()
    }
    console.log(3);
  }).then(function(){
    console.log(4);
  })
  console.log(5);

答案:2,3,5,4,1
知识点链接:https://juejin.im/post/59e85eebf265da430d571f89

15,jquery的ajax返回的是promise对象吗?

答案:是的,但是在jQuery中,不仅只有Ajax函数(.ajax,.get, .post)可以返回Promise对象,动画函数也可以返回Promise对象
知识点链接:https://blog.csdn.net/mzrxlxr/article/details/81475301

16,写出以下输出什么

  let node = {
    type:"ldentifier",
    name:"foo"
  };
  let {type,name,value} = node;
  console.log(type,name,value);

答案:ldentifier foo undefined
知识点:https://www.cnblogs.com/tfxz/p/12838739.html

17,用js算法实现一个函数,函数可以把一个数组拆分多个数组,并且按每3个一组。如[1,2,3,4,5,6,7,8,9,10]经过此函数可以变成[[1,2,3],[4,5,6],[10]]

 <script>
    // 方法一
    var arr = [1,2,3,4,5,6,7,8,9,10];

    let len = Math.floor(arr.length / 3)
    var i =0;
    var newArr = []
    function getArr() {
      const substringArr= arr.slice(i*3,i*3+3)
       newArr.push(substringArr)
       console.log(substringArr);
      
      i++;
      //回调
      if(i<len){
        getArr()
      }
    }
    getArr()
    if(arr.length % 3 ==1){
       let one =  newArr.push([arr.length])
       console.log(one);    
    }
    if(arr.length % 3 ==2){
       let one =  newArr.push([arr.length-1,arr.length])
       console.log(one);    
    }
    console.log(newArr);
    
    //方法二
    function onArrTwoArr(data){
      let newData = [];
      for(let i=0; i<Math.ceil(data.length/3);i++){
        console.log(data.length/3);
        
        newData[i]=[]
        newData[i].push(data[i*3])
        // newData[i].push(data[i*3+1])
      }
      return newData
    }
    
    var newArr2 =onArrTwoArr(arr)
    console.log(newArr2);
  </script>

18,用js算法实现把[{name:'张三',class:'一班'}],{name:‘李四’,class:'二班'},...],这样一个人员年龄array经行按班级分组

答案:

19,什么是浏览器跨域访问?有什么解决手段?

答案:同源策略
现在对跨域的解决方法大概有以下几种:

  1. 通过jsonp跨域
  2. document.domain + iframe跨域
  3. location.hash + iframe
  4. window.name + iframe跨域
  5. postMessage跨域
  6. 跨域资源共享(CORS)
  7. nginx代理跨域
  8. nodejs中间件代理跨域
  9. WebSocket协议跨域

知识点链接:https://blog.csdn.net/wonking666/article/details/79159180

上一篇下一篇

猜你喜欢

热点阅读