一套腾讯前端实习的面试题以及JS异步

3.5号晚上投的简历,9号收到一面的邮件,10号晚上6点半进行一面。
使用腾讯会议进行,先给了一套面试题,8个选择1个编程,以共享文档和共享屏幕的方式进行,代码题可以用自己的软件编写
面试官友好,亲切,思维逻辑清晰。对于我在胡扯的问题,会指出来“你说的是啥啥啥,还是没说我问的问题” 哈哈哈哈哈哈哈哈哈哈,最后,面试官问,你项目的前端是用啥写的?我说 在网上找模板,然后改模板。面试官:改模板!好 我了解了。
没有反问,等通知吧。

一套腾讯前端实习的面试题:
30分钟

Javascript基础试题

一、选择题

  1. 请问以下程序的输出是? A (√)
    function Foo(){ var i=0;
    return function(){ document.write(i++);
    } }
    var f1=Foo(), f2=Foo();
    f1();
    f1();
    f2();

A. 010
B. 012
C. 000
D. 011

  1. 以下 javascript 代码,在浏览器中运行的结果是 B (√)

var a = 4399<0||typeof(4399+’ ‘);
console.log(a);

A. true
B. string
C. undefined
D. false

  1. 请问以下程序的输出是? C (√)

var myObject = {
foo: “bar”,
func: function() {
var self = this;
console.log(this.foo);
console.log(self.foo);
(function() {
console.log(this.foo);
console.log(self.foo);
}());
}
};
myObject.func();

A. bar
bar
bar
bar
B. bar
bar
bar
undefined
C. bar
bar
undefined
bar
D. undefined
bar
undefined
bar

  1. 关于这段代码正确的结论是 A (√)

var F=function(){};
Object.prototype.a=function(){};
Function.prototype.b=function(){};
var f=new F();

A. f能取到a,但取不到b
B. f能取到a,b
C. F能取到b,不能取到a
D. F能取到a,不能取到b

  1. 请问执行后弹出的值是: D(X)—->C

var name=”World!”;
(function(){
var name;
if(typeof name=== ‘undefined’){
name=’Jack’;
console.log(‘Goodbye’+name);
}
else
{
console.log(‘hello’+name);
}
})();

A. Hello world!
B. Goodbye Jack
C. Hello Jack
D. Goodbye world!

  1. 下面求a中最大值正确的是 C(×)——>D

var a = [1,4,5,2,9];

A. Math.max(a);
B. Array.max(a);
C. Math.max.call(null,a);
D. Math.max.apply(null,a);
apply的参数要封装!!!!

  1. 关于跨域问题下面说法正确的是? B(√)

A. 可以利用flash的http请求,来处理跨域问题
B. 通过iframe设置document.domain可以实现跨域
C. 一般情况下,m.toutiao.com可以ajax请求www.toutiao.com域名下的接口并获得响应
D. 通过jsonp方式可以发出post请求其他域名下的接口

  1. 运行结果是 B(×)——>C

var obj ={
a:1,
b:function () {
alert(this.a)
}
};
var fun =obj.b;
只有obj.b看不到obj全部,所以undefined
fun();

A. 弹出a
B. 弹出1
C. 弹出undefined
D. 什么也看不到

二、编程题

实现一个函数,将一个多层嵌套的数组扁平化(非递归实现 +分);

  1. 例 [1, 2, 5, [3, 7, [2, 4, 6], 10], 8, 12] => [1, 2, 5, 3, 7, 2, 4, 6, 10, 8, 12
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //reduce递归
    var a = [1,2,5,[3,7,[2,4,6],10],8,12]
    function fn(arr){
    return arr.reduce((a,b)=>{
    a.concat(Array.isArray(b)? fn(b):b)
            },[])
        }
    console.log(fn(a))

    //some
    var b = [1,2,5,[3,7,[2,4,6],10],8,12]
    function fn2(arr){
    let newArr = []
    while(arr.some(item => Array.isArray(item))){
    arr = [].concat.apply([],arr)
            }
    return arr
        }
    console.log(fn2(b))
  • 跨域
  • 学前端多久了,学了哪些东西
  • js掌握如何
  • js的数据类型
  • js的异步机制?

promise与callback
- promise的状态
- Promise的错误处理?
应该是如下:.then().catch()

1
2
3
4
5
6
7
8
fetch('products.json').then(function(response) {
return response.json();
}).then(function(json) {
products = json;
initialize();
}).catch(function(err) {
console.log('Fetch problem: ' + err.message);
});
  • promise与async的区别?

Promise原来有规范的意义,最终确定的是promise a+规范

Promise有很多并行神器,比如Promise.all\Promise.race等

在进行捕获异常的时候,promise是通过.catch();async是通过在函数内try…catch…

  • async的底层是怎么实现的?

Promiseasync函数内部的实现原理。如果async函数中有返回一个值 ,当调用该函数时,内部会调用Promise.resolve()方法把它转化成一个promise对象作为返回。

  • Cookie如何防范XSS攻击?CSRF攻击?

    • csrf攻击
      跨站点伪装请求,盗用你的身份以你的名义发送恶意请求,是单向的。成功的前提是用户必须登录到目标站点,且浏览了攻击者控制的站点

      • 防御
        • 验证http refever字段
        • 请求地址中添加token并验证
        • 在HTTP头中自定义属性并验证
    • xss攻击
      跨站脚本攻击,攻击者在返回的HTML中嵌入js脚本

      • 防御
        在http头部配上set-cookie
  • XSS深入问,嵌入js脚本,怎么嵌入