JS进阶面试题整理(仅仅整理我做错的题)

    前几天看到掘金博客一篇文章,找到了这个JavaScript进阶问题列表:现在把地址贴出来,想找工作或者想要巩固自己JS的同学可以参考

              该文档会不定时更新

     一、箭头函数

    箭头函数相当于匿名函数,并且简化了函数的定义。它最大的有点是解决了this执行环境造成的一些问题。最常见的就是在setTimeout和setInterval中使用this造成的问题

    在“use strict” 严格模式下,没有直接的调用者的函数中this是指向window的,这个是约定俗成的。在“use strict”严格模式下,没有直接的挂载者的话,this指向是undefined;在非严格模式下,this指向的是函数的执行上下文

  二、普通函数  

    普通函数,this是JS的一个关键词,它是函数执行过程中自动生成的一个内部对象,是指的当前对象,只在当前函数内部使用。

     this对象是在运行时基于函数执行的环境来说的,在全局调用时,this指向window。当函数作为某个对象的方法被调用的时候,this指向这个对象

    在上述的代码中,

const shape = {
    radius:10,
    diameter(){
        return this.radius * 2
    },
    perimeter:()=>2*Math.PI * this.radius
}
shape.diameter()
shape.perimeter()

   函数diameter的值是一个常规函数,但是permeter的值是一个箭头函数;考点在于普通常规函数和箭头函数的区别

 函数diameter中,this指向的是shape这个对象,所以shape.diameter()这个函数输出来的是20

函数perimeter中,this指向是window,在window中,没有radius这个变量,所以这个函数输出的是undefined

================================================================================================

 2、一元操作符将Boolean类型转为数字类型;true转化为Number类型是1

console.log(+true)//1
console.log(-true)//-1

 3、下面哪句话是对的?

const bird = {
  size: 'small'
}

const mouse = {
  name: 'Mickey',
  small: true
}
  • A: mouse.bird.size是无效的
  • B: mouse[bird.size]是无效的
  • C: mouse[bird["size"]]是无效的
  • D: 以上三个选项都是有效的

解析:考点:点语法和括号语法

在 JavaScript 中,所有对象的 keys 都是字符串(除非对象是 Symbol)。尽管我们可能不会定义它们为字符串,但它们在底层总会被转换为字符串。

当我们使用括号语法时([]),JavaScript 会解释(或者 unboxes)语句。它首先看到第一个开始括号 [ 并继续前进直到找到结束括号 ]。只有这样,它才会计算语句的值。

mouse[bird.size]:首先计算 bird.size,这会得到 smallmouse["small"] 返回 true

然后使用点语法的话,上面这一切都不会发生。mouse 没有 bird 这个 key,这也就意味着 mouse.bird 是 undefined。然后当我们使用点语法 mouse.bird.size 时,因为 mouse.bird 是 undefined,这也就变成了 undefined.size。这个行为是无效的,并且会抛出一个错误类似 Cannot read property "size" of undefined

 三、class基础语法

    学习链接: http://es6.ruanyifeng.com/#docs/class

 题目: 

class Chameleon {
              static colorChange(newColor) {
                this.newColor = newColor
                return this.newColor
              }

              constructor({ newColor = 'green' } = {}) {
                this.newColor = newColor
              }
}

 const freddie = new Chameleon({ newColor: 'purple' })
 freddie.colorChange('orange')//TypeError

colorChange是一个静态方法,静态方法被设计为只能被创建它们的构造器使用(也就是 Chameleon),并且不能传递给实例。因为 freddie 是一个实例,静态方法不能被实例使用,因此抛出了 TypeError 错误。

如果静态方法包含this关键字,这个this指的是类,而不是实例。

 四、函数

function bark() {
  console.log('Woof!')
}

bark.animal = 'dog'


A: 正常运行!
B: SyntaxError. 你不能通过这种方式给函数增加属性。
C: undefined
D: ReferenceError

解析:Javascript中函数也是对象(除了基本类型之外其他都是对象)

 函数是一个特殊的对象,是可以拥有属性的对象,且属性可以被调用

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}
const member = new Person("Lydia", "Hallie");
Person.getFullName = function () {
  return `${this.firstName} ${this.lastName}`;
}
console.log(member.getFullName());

A: TypeError
B: SyntaxError
C: Lydia Hallie
D: undefinedundefined

这个例子告诉我们,不可以像给常规对象添加属性,如果想要一次性给所有实例添加特性,要使用原型。

修改结果:

Person.prototype.getFullName = function () {
  return `${this.firstName} ${this.lastName}`;
}

 

 

 

 

 

posted @ 2019-12-04 11:50  前端加油站  阅读(635)  评论(0编辑  收藏  举报