记一次微众银行面试

2,774 阅读4分钟

前言


个人觉得微众银行的面试比较偏向基础,按面试官的话来说,基础好,上手框架啥的都容易,写的代码也更合理,更优雅。


1. JavaScript基础

this指向

var name = 'hello';
var obj ={
    name:'hi',
    props:{
        name:'javascript',
        getName:function(){
            return this.name;
        }
    }
}
console.log(obj.props.getName()); //javascript
var test = obj.props.getName;
console.log(test()); //hello

如果用一句话说明 this 的指向,那么即是: 谁调用它,this 就指向谁。

  • new 绑定
  • 显式绑定,可以通过call,apply,bind绑定,this指向绑定的对象
  • 隐式绑定,函数调用在某个对象上,this,指向该对象。例如:xxx.fn()
  • 默认绑定,在不能应用其它绑定规则时使用的默认规则,通常是独立函数调用。

变量、函数声明提前

function log(){
    console.log(a); //undefined
    console.log(b()); //2
    var a = 1;
    function b(){
        return 2;
    }
}
log()

立即执行函数作用域

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

作用 不破坏污染全局的命名空间,若需要使用,将其用变量传入

for循环和异步

假设页面上有6个按钮,点击第一个按钮和第四个按钮分别输出什么,为什么,如果要实现0,3要怎么修改

var buttons = document.getElementsByTagName('button');
for(var i = 0 ; i < 6 ; i++ ){
    buttons[i].addEventListener('click',fuction(){
        console.log(i);
    })
}

分别输出 6,6 异步

方法1:
for(let i = 0 ; i < 6 ; i++ ){
    buttons[i].addEventListener('click',fuction(){
        console.log(i);
    })
}

方法二: 
for(let i = 0 ; i < 6 ; i++ ){
    (function(i){
        buttons[i].addEventListener('click',fuction(){
            console.log(i);
        })
    })(i)
}

数据类型

console.log(typeof null); //object
console.log(typeof {}); //object
console.log(typeof []); //object
console.log(typeof undefined); //undefined

JS事件循环机制(event loop)

console.log(1);
setTimeout(function(){
    console.log(2)
},1000);
setTimeout(function(){
    console.log(3)
},0);
Promise.resolve().then(function() {
  console.log('4');
});
console.log(5);
// 1 5 4 3 2

JS隐式转化

["1", "0", "2", "4"].map(parseInt); //[ 1, NaN, NaN, NaN]

parseInt(string, radix)
string	必需。要被解析的字符串。
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。


2. 编写一个方法repeat,循环指定字符串.

当时,脑子有点蒙,用最简单的循环方法,其实后面想想还有更简单的方法(方法二)
方法一:
function repeat(str,n){
    if(typeof str != 'string'){
        return;
    }
    var newStr;
    for(var i = 0 ;i < n; i++){
        newStr+=str;
    }
    return newStr;
}

方法二:
function repeat(str,n){
    if(typeof str != 'string'){
        return;
    }
    return newArray(n+1).join(str);
}


3. for of和for in的区别,forEach和map的区别

for...of循环:具有 iterator接口,就可以用for...of循环遍历它的成员(属性值)。for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象、Generator 对象,以及字符串。for...of循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。对于普通的对象,for...of结构不能直接使用,会报错,必须部署了 Iterator 接口后才能使用。可以中断循环。
for...in循环:遍历对象自身的和继承的可枚举的属性, 不能直接获取属性值。可以中断循环。
forEach: 只能遍历数组,不能中断,没有返回值(或认为返回值是undefined)。
map: 只能遍历数组,不能中断,返回值是修改后的数组。


4. ES6中的class和ES5的类有什么区别?

  • ES6 class 内部所有定义的方法都是不可枚举的;
  • ES6 class 必须使用 new 调用;
  • ES6 class 不存在变量提升;
  • ES6 class 默认即是严格模式;
  • ES6 class 子类必须在父类的构造函数中调用super(),这样才有this对象;ES5中类继承的关系是相反的,先有子类的this,然后用父类的方法应用在this上。

5. 对原型链的理解,试画图说明(后续补充)


6. 你了解几种跨域方法,为什么会发生跨域

跨域需要针对浏览器的同源策略来理解,同源策略指的是请求必须是同一个端口,同一个协议,同一个域名

  • 1、JSONP
  • 2、跨域资源共享(CORS)
  • 3、iframe
  • 4、nginx 代理跨域

7. http状态码

  • 2开头 (请求成功)表示成功处理了请求的状态代码。 200请求成功 202接受请求,但未处理
  • 3开头 (请求被重定向)表示要完成请求,需要进一步操作。 301永久重定向 302临时重定向 304未修改
  • 4开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。 400错误请求 401未授权 403拒绝请求 404未找到
  • 5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 500服务器报错 504请求超时

8. 有一个列表,默认第一个文字高亮,为蓝色,其他为黑色,当移动某一项上时,文字高亮,其他为黑色

.highlight{
    background-color: yellow;
}
方法一: 通过css伪类
li:hover{
    background-color: yellow;
}
方法二:通过jQuery代理
$('ul').on('mouseenter', 'li', function() {
    //绑定鼠标进入事件
    $(this).addClass('highlight')
})
$('ul').on('mouseleave', 'li', function() {
    //绑定鼠标划出事件
    $(this).removeClass('highlight')
})

不能同时使用hover和on,hover是jQuery自己封装的函数,并不是javascript的函数