前端程序猿的面试题之(上)(10题)

381 阅读6分钟

程序猿找工作面试需要准备的,这是我面试的总结:

一. let和var const 区别:

let的特点:

1.ES6新增了let命令,用来声明变量。它的用法类似于var,但所有声明的变量,只在let命令所在的代码块内有效。

2.不存在变量提升。

3.暂时性死区,只要块级作用域内存在let命令,它所声明的变量就“绑定” 这个区域,不再受外部的影响。

4.不允许重复声明,let允许在相同作用域内,重复声明同一个变量。

var的特点:

var 变量关键字的真正问题在于其在方法内部的定义变量开始的任何地方都可以访问到这个变量。

const的特点:

1.const声明一个只读的常量,一旦声明,常量的值就不会改变。

2.const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后复制。

二. 什么是箭头函数及特点?

箭头函数是一种使用箭头( => )定义函数的新语法。

特点:

1.不能通过new关键字调用

2.new.target和super关键字是es6新增的

3.箭头函数中的this,取决于他的上层非箭头函数的this指向

4.没有arguments对象,但是可以获取到外层函数的arguments

5.没有原型, 因为不能通过new调用,所以没有原型

6.call,apply,bind不能改变箭头函数的this指向

7.没有this, super,arguments和new.target绑定,

三. Proxy

用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。

  1. get() get方法用于拦截某个属性的读取操作,可以接受三个参数,依次为目标对象、属性名和 proxy 实例本身(严格地说,是操作行为所针对的对象),其中最后一个参数可选

  2. set() set方法用来拦截某个属性的赋值操作,可以接受四个参数,依次为目标对象、属性名、属性值和 Proxy 实例本身,其中最后一个参数可选。

  3. apply() apply方法拦截函数的调用、call和apply操作。 apply方法可以接受三个参数,分别是目标对象、目标对象的上下文对象(this)和目标对象的参数数组。

  4. has() has方法用来拦截HasProperty操作,即判断对象是否具有某个属性时,这个方法会生效。典型的操作就是in运算符。 has方法可以接受两个参数,分别是目标对象、需查询的属性名。

  5. construct() construct方法用于拦截new命令,下面是拦截对象的写法。

  6. deleteProperty() deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除。

  7. defineProperty() defineProperty方法拦截了Object.defineProperty操作。

  8. getOwnPropertyDescriptor() getOwnPropertyDescriptor方法拦截Object.getOwnPropertyDescriptor(),返回一个属性描述对象或者undefined。

四. javascript的数据类型?

JavaScript的数据类型分为俩种,一种是基本数据类型,一种是引用数据类型

基本数据类型包括:

1.String - - (字符串)

2.Number - - (数字)

3.Boolean - - (布尔值)

4.Null - - (空的)

5.Undefined - - (未定义)

6.Symbol - - (符号)

引用数据类型包括:

1.Object - - (对象)

2.Array - - (数组)

3.Function - - (函数)

五. 什么是原型及继承方式:

原型:就是每个函数都有一个原型属性prototype指向自身的原型,而由这个函数创建的对象也有一个proto属性指向这个原型,而函数的原型是一个对象,所以这个对象也会有一个proto指向自己的原型,这样逐步深入直到object对象原型,这样就形成原型链。

继承的方式:

1.原型继承:就是直接把父类的对象赋值给子类构造函数的原型,这样子类的对象就可以访问父类以及父类构造函数的prototype中的属性。

2.借用构造函数:就是子类构造函数中通过apply调用父类的构造函数来进行相同初始化工作,这样不管父类中做了多少初始化工作,子类也同样可以初始化工作。

六.什么是promise:

就是一个构造函数,可以new promise() 得到一个promise实例。 promise有两个函数,一个是成功后的回调函数(resolve),另一个是(reject)失败之后的回调函数。

当new出一个实例的时候,就会立即执行异步操作中的代码,就是new的时候,除了可以得到一个promise实例之外,还会立即调用我们为promise构造传递的哪个function,执行这个function中的异步操作代码。

七.new关键字经历了什么过程?

1.创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型。

2.属性和方法被加入到this引用的对象中。

3.新创建的对象由this所引用,并且最后隐式返回this。

八.relative和absolute的区别?

Relative(相对定位)对象不可层叠,不脱离文档流,参数自身静态位置通过top,bottom,left,right定位,并可以通过z-index进行层次分级。

Absolute(绝对定位)脱离文档流,通过top,bottom,left,right定位,如父级没有设置定位元素,会将以body坐标原点进行定位,也可以通过z-index进行层次分级。

九.箭头函数与函数的区别?

1.箭头函数没有prototype(原型),所有箭头函数本身没有this,箭头函数的this在定义的时候继承自外层第一个普通函数的this。

2.如果箭头函数外层没有普通函数,严格模式和非严格模式下的它的this都会指向window。

3.箭头函数本身的this指向不能改变,但可以修改他要继承的对象的this。

4.箭头函数的this指向全局,使用arguments会报未声明的错误。箭头函数的this指向普通函数时,它的arguments继承于该普通函数。

十.防抖和节流分别是什么?

防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

节流:事件触发后执行函数执行期间内事件再次触发,执行函数将不会执行,等规定事件之后事件触发,执行函数方可再次执行。