以下是async await的demo,async await就是把异步请求以同步的形式写出来,异步的目标就是让代码越来越像同步的:
function a(){
return new Promise((resolve, reject)=>{
resolve(1)
});
}
function b(data){
return new Promise((resolve, reject) => {
resolve(data + 4);
});
}
async function test(){
let a_result =await a()
let b_result =await b(a_result)
console.log(a_result);
console.log(b_result);
return 'test返回值';
}
test().then(res => {
console.log('res', res);
});
跟es6有关的面试题,要联想到es5的相关知识
promise和jQuery的deferred用法几乎一致,如果3年前开始做前端的时候就把jQuery学好,现在学习promise一看就能懂,所以不要以为jQuery过时了,其实他的影子一直都在
问:let a = 6;
function f() {
setTimeout(function () {
alert(a); //为什么这里会报错
let a = 666;
}, 0);
}
f();
es6的部分技术,在以前就已经实现了:
es6的剩余参数,其实在coffeescript里已经实现了;
es6的promise,在jQuery1.5的deferred有类似功能;
学习es6时,要联想到相关知识(比如es6的一些东西可以用es5来实现只不过更复杂,es6的一些东西早在jQuery、coffeescript的时代已经有了),有利于对es6的记忆更加深刻
问:es6的箭头函数有什么特点?
答:this是定义时就确定了,而不是调用时才确定
问:es6的class和es5的构造函数有什么区别?
答:class没有提升功能,构造函数有提升功能,示例如下:
问:为什么箭头函数可以改变this的指向?
答:因为箭头函数是和父级上下文绑定在一起的,原文链接:https://cn.vuejs.org/v2/guide/instance.html
问:你能写1个promise的demo吗?
答:
let a = 10;
let promise = new Promise(function (resolve, reject) {
if(a == 10){
resolve('成功');
}
else{
reject('失败');
}
});
promise.then(function (res) {
console.log('res', res);
});
如果不考虑浏览器兼容性问题,定义对象的时候不要这样写:
var name = "name";
var obj = {
name : name
};
要这样写:
var name = "name";
var obj = {
name
};
Object.assign的用途:
1.复制1个对象
2.合并参数
问:如果某个数据,用户写了,就用用户写的内容,如果用户没写,就用默认值,怎么实现?
答:
function ajax(options){ //用户传的数据
let defaults = {
type : 'get',
header : '',
data : {},
};
let data = Object.assign({}, defaults, options)
}
问:你能写几个扩展运算符的demo吗?
答:
demo1:
function show(...a) { //这里的...a,就是[1, 9, 8, 3, 2]
return a.sort();
}
console.log(show(1, 9, 8, 3, 2));
demo2:
function show(a, ...b) { //...b,就是[9, 8, 3, 2],也就是剩余的参数,所以,扩展运算符也叫作剩余运算符
console.log(a);
console.log(b);
}
show(1, 9, 8, 3, 2);
demo3:
let arr = [1, 2];
// 我需要复制一份这个数组,可以使用let arr2 = arr;但是这样的话,他们就是引用同一个地址了,arr2和arr会互相影响,怎么办?怎么样才能实现复制又没有引用同一个地址?
let arr2 = [...arr];
demo4:
扩展字符串可以把伪数组改成数组,
let ul = document.querySelectorAll('ul'); //这里的ul,是伪数组
let newUl = [...ul]; //这里的newUl,就是真数组了
我觉得ecma会新增这些es6的特性,一定是有人提出这样的需求,所以,学习的时候,不要以为自己用不到,或者,不要以为可以用其他方式实现就不认真学习es6了,要认真学习es6,以后哪天遇到某个需求的时候,说不定用es6的某些特性,可以提高工作效率
字符串模板(``)的用途:避免拼接字符串
问:解构赋值的时候,如果值是空的,会报错,怎么设置默认的函数参数?
答:
let a;
({a} = {a : 'apple', b : 'banana'}) //如果用结构赋值的时候括号写得不对,js会把解构赋值的东西,解析成块级作用域,这个时候,外面包一层括号就行了,也就是:({a} = {a : 'apple', b : 'banana'}) console.log(a);
解构赋值的用途:
1.ajax数据交互
2.交换2个数据:通过[a, b] = [b, a];可以交换a和b的值
3.import a from '../a.vue',引用模块的时候会用到
const arr = [1];
arr.push(2);
console.log(arr); //[1, 2],const里的数组,虽然不能直接进行arr=[];这样修改,但是可以间接修改,如果真的要完全禁止修改,可以这样:
const arr2 = Object.freeze([1]);
arr2.push(2);
console.log(arr2);//Uncaught TypeError: Cannot add property 1, object is not extensible
symbol的用途:node底层会用到
class里的get、set、静态方法的用途:封装框架的时候用得到
网友评论