Skip to content

es6相关的面试题

1、如何自己实现一个类模版字符串的功能

js
// 如何自己实现一个类模版字符串的功能
let name = 'yx'
let age = 9
let str = 'hello${name}今年${age}了'

// replace 第二个参数,必需。一个字符串值。规定了替换文本或生成替换文本的函数。
// eval(string) string:必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
str = str.replace(/\$\{([^}]*)\}/g, function () {
    console.log(arguments)
    // eval('name')   eval('age')
    return eval(arguments[1])
})
console.log(str)

//[Arguments] {
//     '0': '${name}',
//     '1': 'name',
//     '2': 5,
//     '3': 'hello${name}今年${age}了'
//   }
//   [Arguments] {
//     '0': '${age}',
//     '1': 'age',
//     '2': 14,
//     '3': 'hello${name}今年${age}了'
//   }
//   helloyx今年9了

2、带标签的模版字符串

实现功能:给所有模版字符串中变量加上*号

let name = 'yx';
let age = 9;
function tagFn(){  //第一个参数是字符串的数组,第二个参数是第一个变量,第三个是第三个变量
    console.log(arguments);  //[Arguments] { '0': [ 'hello', '’今年', '了' ], '1': 'yx', '2': 9 }
    let strings = arguments[0];
    let values = [].slice.call(arguments,1);    //如果想把第一个参数除外的剩余的参数转换成数组 //把arguments转换成一个真正的数组,从arguments第一位之后项开始
    console.log(strings,values)  // 'hello', '’今年', '了' ] [ 'yx', 9 ]
    let str = "";
    for(let i=0;i<values.length;i++){
        str+= `${strings[i]}*${values[i]}*`
    }
    str +=strings[strings.length-1];
    return str;
    // return 100
}
let str = tagFn`hello${name}今年${age}岁了`
//标签(函数)返回什么,结果就是什么
console.log(str)
//hello*yx*今年*9*岁了

如果想把第一个参数除外的剩余的参数转换成数组

//...叫剩运算符 就是把多余的都放到一个数组中
let fn = (x,...arrgs)=>{
    console.log(arrgs)
}
fn('x',1,2,3,4,5)

//[ 1, 2, 3, 4, 5 ]

3、高阶函数

function a(c){
    return function(d){
        return {sum:c+d}
    }
}
或者:
let a = c =>d =>({sum:c+d})
console.log(a(1)(2))

4、箭头函数

箭头函数 箭头函数中没有this 会向上查找

箭头函数特点:

1、箭头函数没有function关键字

2、小括号和大括号之间有个箭头

3、如果参数是一个,可以省略小括号

4、如果没有return 可以不写大括号

5、如果直接返回的是对象,需要小括号包裹

6、 箭头函数中没有arguments

7、函数可以赋予默认参数

解决this指向问题:前面是谁就是谁

let obj = {
        b:1,
        a:function(){
            let that = this;
            setTimeout(()=>{
                console.log(that)
            },1000)
        }
    }
    obj.a()  //this指向obj
let obj = {
        b:1,
        a:()=>{
            setTimeout(()=>{
                console.log(this)
            },1000)
        }
    }
   obj.a()  //this指向window

5、this指向问题面试题:

let a =1;
let obj = {
    a:2,
    b:()=>{
        console.log(a)
    }
}
obj.b()   //1
let a =1;
let obj = {
    a:2,
    b:()=>{
        console.log(this.a)
    }
}
obj.b()  //undefined
var a =1;
let obj = {
    a:2,
    b:()=>{
        console.log(this.a)
    }
}
obj.b()  //1

函数可以赋予默认参数

let fn = (a=1,b=2)=>{
    console.log(a,b)
}
fn();
//1 2

Released under the MIT License.