前端面试2021-003

2021-10-14  本文已影响0人  大牧莫邪

一、多选题

1、关于剩余参数的使用,正确的是?AB

A、function fn(name, ...args) {...}
B、function fn(...args) {...}
C、function fn(...args, name) {...}
D、function fn(...name, ...args) {...}

答案:AB
C问题:剩余参数只能出现在参数列表的最后一个位置
D问题:函数的参数中,剩余参数只能有一个

2、声明类型的语法,正确的是?BC

A、class Person() {}
B、class Person {}
C、function Person () {}
D、function Person {}

答案:BC
A问题,class语法中没有类型名称后面的括号
D问题,function语法中,类型名称后面包含一个括号,使用函数模拟的类型

3、关于ES6中constructor()的描述,正确的是?ABD

A、类型中的构造函数,用来在创建对象的同时初始化对象属性
B、创建指定类型的对象时,会自动调用执行
C、类型中的构造函数,需要手工调用执行
D、类型中的普通函数,需要手工调用执行

答案:ABD
C问题:构造函数是创建对象的时候自动执行,不需要手工调用

4、箭头函数的使用,操作语法正确的是?BD

A、let fn = ()-> console.log("hello")
B、let fn = ()=> console.log("hello")
C、let fn = name -> console.log("params")
D、let fn = name => console.log("params")

答案:BD
AC问题:箭头函数中使用错误了箭头符号

5、箭头函数中的参数的使用,正确的是? BD

A、let func = name, age => console.log(名称:${name}, 年龄:${age})
B、let func = (name, age) => console.log(名称:${name}, 年龄:${age})
C、let func = name, age => {console.log(名称:${name}, 年龄:${age})}
D、let func = (name, age) => {console.log(名称:${name}, 年龄:${age})}

答案:BD
AC问题:多个参数出现时,不能省略括号

6、箭头函数中返回值的操作,正确的是?AD

A、let fc = (x, y) => {x++; y++; return x + y;}
B、let fc = (x, y) => {x++; y++; x + y;}
C、let fc = (x, y) => return x + y
D、let fc = (x, y) => x + y

答案:AD
B问题:函数代码部分,带有花括号的情况下需要通过return才能返回数据
C问题:函数代码部分,省略花括号的情况下不需要添加return关键词可以直接返回数据

7、关于类和对象的描述,正确的是?ABD

A、类表示类型的意思
B、对象是包含数据的、实际存在的物体
C、一个类型只能创建一个对象
D、多个对象可以属于一个类型

ABD
C问题:一个类型可以创建多个互相独立的对象

8、ES6类型中,对于静态属性和静态函数的操作正确的是?BC

A、静态属性是声明在类型内部、类型方法外部的、使用let声明的变量
B、静态属性是声明在类型内部、类型方法外部的、使用static声明的变量
C、静态属性是属于类型的属性,所以只能被类型名称调用
D、静态属性是属于类型的属性,所以可以被类型名称和该类型创建的所有对象调用

BC

9、关于函数中使用默认值,操作方式正确的是?ACD

A、function fct(name) { name = name || 'default';... }
B、function fct(name) {name = "default";...}
C、function fct(name="defeult") {...}
D、let fct = (name="default")=> {...}

ACD
A-原生JS中默认值的添加
B-数据覆盖,不是默认值
C-ES6语法中给形式参数添加默认值
D-箭头函数中使用ES6语法的默认值

10、面向对象的继承关系中,正确的操作语法是?A

A、class Student extends Person {...}
B、class Student(Person) {...}
C、class Student extends Person() {...}
D、class Student extends Person, Job {...}

A
B问题:继承语法,不是类型后面添加括号的语法
C问题:继承的父类不能添加括号
D问题:JS中的继承是单继承机制,不能同时继承多个类型

二、简答题

1、观察下面的代码,最终控制台会输出什么结果呢?请说明原因?

let name = "TOM"
function fn() {
    console.log(name)   // ? 
    let name = "JERRY"
}
fn()

输出错误,let声明的变量存在暂时性死区,变量声明之前不能使用该变量

2、梳理下面的代码,最终输出的数据是什么呢?请说明原因?

let person = {'pName': 'OFFCN', 'pAge': 20, 'pGender': 'male'}
let {pName: name, pAge} = person
console.log(name)   // ①
console.log(pName)  // ② 
console.log(pAge)   // ③

① 输出OFFCN,别名输出,给pName的值赋值到了一个名称为name的变量中
② 错误,一旦出现了别名赋值,原来的属性名称就不能使用
③ 20
解构赋值中,如果给一个属性添加了别名,属性名称就不能再使用了,所以pName报错

3、解析下面的代码,最终输出什么结果?为什么?

for ( var i = 0; i < 10; i ++ ) {
    setTimeout(function() {
        console.log(i);  // ① 10, 10, 10, 10, 10, 10, 10...
    })
}
for ( let j = 0; j < 10; j ++ ) {
    setTimeout(function() {
        console.log(j);  // ②
    })
}

① 10,var声明的变量的作用域只有全局和局部,for循环中多次循环使用的是同一个作用域空间,setTimeout()延时函数会在循环全部执行完成后输出,循环中最后一次判断时i=10<10跳出循环,此时最终i的值是10;
② 0.1.2.3....9,let声明的变量存在块级作用域,for循环每次循环都是一个独立的作用域,延时函数执行的时候相当于在10个不同的作用域中执行,最终输出了差异化的数据

编程题

1、公司要给员工涨薪,并重新记录到一个新的变量中,请编写代码实现

// 公司员工数据
let emps = [
{name: 'Jams Gosling', job: 'Java工程师', salary: 12000},
{name: 'Guido Van Rossum', job: 'Python工程师', salary: 11000},
{name: 'Brendan Eich', job: 'JavaScript工程师', salary: 12500},
{name: 'John Resig', job: '前端工程师', salary: 12800},
{name: 'Dennis Ritchie', job: 'C工程师', salary: 9000},
{name: 'Bjarne Stroustrup', job: 'C++工程师', salary: 10000},
{name: 'Tim Berners Lee', job: 'WEB工程师', salary: 13000},
{name: 'Alan Cooper', job: 'VB工程师', salary: 8000},
{name: 'Rob Pick', job: 'Go工程师', salary: 13000}
]

请编写代码实现员工的涨薪操作:

解答过程:

var newEmps = emps.map(value=> {
    return {
        ...value,
       salary: value.salary + 1000
}
})
console.log(newEmps) // 涨薪后的数组
上一篇下一篇

猜你喜欢

热点阅读