前言
个人觉得微众银行的面试比较偏向基础,按面试官的话来说,基础好,上手框架啥的都容易,写的代码也更合理,更优雅。
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')
})