美文网首页
2020-06-03面试广州某景科技公司

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

作者: 南方小成 | 来源:发表于2020-06-06 15:49 被阅读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
解析:

  • test.length是返回的函数的形参个数,所以为3;
  • arguments.length返回的是函数调用时的实参个数,所以为2;
  • arguments.callee:初始值就是正被执行的 Function 对象,用于在函数内部调用自身,arguments对象本身是个由函数调用时传入的实参组成的伪数组,访问单个参数的方式与访问数组元素的方式相同。
    只传入了两个参数,自然为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指向。
唯一的区别就是参数不同:

  • Function.apply(obj,args):
    obj: 这是一个对象,将代替Function里面的this对象
    args:这是一个数组,它将作为参数传递给Function(args —> arguments)

  • Function.call(obj,value1,value2…)
    obj: 这是一个对象,将代替Function里面的this对象
    value1,value2…: 是参数列表
    关于性能问题: call()比apply()性能要好
    在ES6中即使参数是数组,也可以使用call(),使用扩展运算符…即可。
    let array = [1, 2, 3, 4];
    xxx.call(obj, ...array);
    apply()还用一些妙用:例如找出数组中的最大最小值、Array.prototype.push使用apply可以将一个数组添加到另一个数组的尾部
    知识点链接:https://www.cnblogs.com/shaozhu520/p/11463192.html

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

  • shift()方法:移除数组中的第一项并返回该项
  • push()方法:从数组末端添加项
  • unshift()方法:在数组的前端添加项
  • pop()方法:从数组末端移除项

知识点链接: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,例举浏览器本地存储几种方式,并描述他们不同

答案:

  • cookie
    cookie算是比较早的技术,最初是为了记录http的状态,提高访问速度。cookie是服务器"种植"在客户端的key-value形式文本文件。但同时客户端也能操作cookie。
    特点:大小:cookie的大小限制在4k。每个域名下cookie的个数现在在20个。
    在客户端请求服务器端和服务器响应时,cookie始终被携带在http请求中,即使不需要(造成流量浪费)。这也是限制cookie大小的原因。
    客户端可以通过document.cookie操作cookie,并不安全。
    cookie可以设置过期时间、路径、域和httpOnly等字段。如果设置了过期时间,cookie会保存在硬盘里,知道到了设定的过期时间才会失效。若未设置过期时间,在浏览器窗口关闭时,cookie就失效了。路径和域两个字段限制了cookie的作用范围。httpOnly设置为true,则js不能通过document.cookie操作cookie。
  • localStorage
    它也是采用key-value的形式存储数据,但是它与cookie有很大的区别
    特点:
    对比着来,localStorage能保存更大的数据,标准浏览器是5Mb。
    localStorage保存在客户端,不随着请求发送给服务器,避免了流量的浪费。
    客户端可以通过:setItem、getItem方法访问localStorage。
    并且,localStorage没有过期时间,如果不手动清除,数据就永远不会过期,一直保存在浏览器当中。
    存储的信息在同一域中是共享的。
  • sessionStorage
    特点:
    与localStorage不同的是,sessionStorage并不持久化,在窗口关闭那一刻,sessionStorage会被清除。
    存储的信息是会话级别的,同域也是不能共享的。关闭当前标签页,sessionStorage即失效。
  • session(附加)
    上面提到了cookie,顺带提一下session。客户端第一次访问服务器,服务器种植一个cookie,保存唯一的sessionId。后面客户端再次访问,会读取此sessionId,随即能在服务端读取到此id保存的会话对象。
    特点:
    session是基于cookie的,由于session在客户端不可被修改,相对于cookie来说安全,所以可存放一些重要数据。
    数据保存在服务器端,客户端通过sessionId,读取到相对应的数据。

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

相关文章

网友评论

      本文标题:2020-06-03面试广州某景科技公司

      本文链接:https://www.haomeiwen.com/subject/ngmbzhtx.html