关于javascript:面试拼多多前端开发岗已拿到offer这些知识点该放出来了

3次阅读

共计 6076 个字符,预计需要花费 16 分钟才能阅读完成。

一面:

CSS

1. 盒模型

2.css 文件中结尾加 * 号 / 高低盒子重叠问题(为正值如何 / 负值如何)

3. 伪类和伪元素的理解,伪类有什么作用

JS

4. 原型链

5. 继承

6. 为什么 3.tostring()会报错

7.var 先应用会怎么

8. 函数表达式和函数申明有什么区别

9. 高阶函数理解过吗

10. 对 ES6 新属性用过哪些

11.var 和 function 申明时的不同

12.class 的用途

13. 改写 reduce 函数

14. 数组改写 flat 函数,怎么做到拉伸

15. 数组将反复的元素进行输入

16. 输出汉字的多少多少万转成数字

17.promise 的 api

18. 三个 promise 实现之后怎么判断

19. 把办法间接写到原型上有什么害处

20. 判断是对象上的办法还是原型上的办法

Vue

21. 父子组件通信

22.vue 指令中 v -if/v-show 的区别

23.vue 的申明周期

jQuery

24.jQuery 的 api 办法

25.jQuery 做过动画没有

26.jQuery

27. 取到某 id 上面所有的某个 class

HTTP 申请头

28. 申请的时候怎么设置不缓存

编程题:

29.spacify(‘hello world’) // => ‘h e l l o w o r l d’ 怎么转化

怎么实现这个 ’hello world’.spacify();

二面:

1. 做题

2. 不定高的标签,在父元素中居中 -

3. 写一个 promise,怎么实现执行前面第二个 then 的第二个参数

4.reduce 办法,及参数还能够是什么,

5.sort 办法,返回类型能够返回布尔值吗

6. 原生 js 增加事件,

7.map 和 foreach 的区别,map 返回的和原数组的长度一样吗

8. 类数组对象转数组

9. 创立 dom 节点

10. 如何实现深拷贝

11.webpack 优化

三面

1. 组件平台有哪些性能?

2. 实现一个 redux

3. 用 ts 实现一个 redux

只记得这些了 ……

大节

一面的时候其实我本人感觉答得不是特地好,过后面下来感觉要凉了,平时写款式的工夫的确太少了。

很侥幸的时候还是给我过了,二面面试官我感觉面得很业余,根本都是从浅入深的考查常识的深度,我感觉答得还能够,因为我是属于那种会的就尽量深一点,临时不必的就很少花工夫,所以我目前常识的广度很有欠缺,对于 node、ssr、挪动端、小程序这些方面我的能力都很单薄,然而面试的时候如果你不相熟,间接说不相熟就行,他就不会面了。

我筹备面试之前对我本人的要求就是,我会的尽量不会很快就被问倒,所以我重点温习了我善于的常识,并且到网上刷了很多拼多多面试题,做了一个整顿,当初分享给大家,算是一个感恩回馈吧。

JavaScript

(因为内容过多,我就挑重点的讲了,局部内容会简略,如有趣味浏览全文,能够 【点击我】 无偿获取。)

  • 数据类型

说说 JavaScript 中的根本类型有哪些?以及各个数据类型是如何存储的?

javaScript 的数据类型包含原始类型和援用类型 (对象类型)。
原始类型包含以下 6 个:
String
Number
Boolean
null
undefined
Symbol
援用类型统称为 Object 类型,如果细分的话,分为以下 5 个:
Object
Array
Date
RegExp
Function

1、数据类型的存储模式

栈(Stack)和堆(Heap),是两种根本的数据结构。Stack 在内存中主动分配内存空间的;Heap 在内存中动态分配内存空间的,不肯定会主动开释。个别咱们在我的项目中将对象类型手动置为 null 起因,缩小无用内存耗费。
原始类型是按值模式寄存在栈中的数据段,内存空间能够自在调配,同时能够按值间接拜访。

var a = 10;
var b = a;
b = 30;
console.log(a); // 10 值
console.log(b); // 30 值

援用类型是寄存在堆内存中,每个对象在堆内存中有一个援用地址,就像是每个房间都有一个房间号一样。援用类型在栈中保留的就是这个对象在堆内存的援用地址,咱们所说的“房间号”。通过“房间号”能够疾速查找到保留在堆内存的对象。

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "zhizhi";
console.log(obj1.name); // zhizhi

2、Null
面试官:为什么 typeof null 等于 Object?
不同的对象在底层原理的存储是用二进制示意的,在 javaScript 中,如果二进制的前三位都为 0 的话,零碎会断定为是 Object 类型。null 的存储二进制是 000,也是前三位,所以零碎断定 null 为 Object 类型。
扩大:
这个 bug 个第一版的 javaScript 留下来的。俺也进行扩大一下其余的几个类型标记位:
000:对象类型。

  • 1:整型,数据是 31 位带符号整数。
  • 010:双精度类型,数据是双精度数字。
  • 100:字符串,数据是字符串。
  • 110:布尔类型,数据是布尔值。

3、数据类型的判断

typeof 与 instanceof 有什么区别?

typeof 是一元运算符,同样返回一个字符串类型。个别用来判断一个变量是否为空或者是什么类型。

除了 null 类型以及 Object 类型不能精确判断外,其余数据类型都可能返回正确的类型。

typeof undefined // 'undefined'
typeof '10'      // 'String'
typeof 10        // 'Number'
typeof false     // 'Boolean'
typeof Symbol()  // 'Symbol'
typeof Function  //‘function'
typeof null         //‘Object’typeof []        // 'Object'
typeof {}        // 'Object'

既然 typeof 对对象类型都返回 Object 类型状况的局限性,咱们能够应用 instanceof 来进行判断某个对象是不是另一个对象的实例。返回值的是一个布尔类型。

var a = [];
console.log(a instanceof Array) // true

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,如果对原型链不怎能理解,后边俺会具体的写到,这里大体记一下就 OK。
咱们再测一下 ES6 中的 class 语法糖是什么类型。

class A{}
console.log(A instanceof Function) // true

留神:原型链中的 prototype 随时能够被改变的,扭转后的值可能不存在于 object 的原型链上,instanceof 返回的值可能就返回 false。

4、类型转换

类型转换通常在面试口试中呈现的比拟多,对于类型转换的一些细节应聘者也是很容易疏忽的,所以俺整顿的尽量零碎一些。javaScript是一种弱类型语言,变量不受类型限度,所以在特定状况下咱们须要对类型进行转换。

「类型转换」分为显式类型转换和隐式类型转换。每种转换又分为原始类型转换和对象类型转换。

显式类型转换就是咱们所说强制类型转换。

其余数据类型转字符串类型!

对于原始类型来说,转字符串类型会默认调用 toString() 办法。

String(123);      // "123"
String(true);     // "true"
String(null);     // "null"
String(undefined);// "undefined"
String([1,2,3])   // "1,2,3"
String({});          // "[object Object]"

其余数据类型转布尔类型!

除了非凡的几个值‘’、undefined、NAN、null、false、0 转化为 Boolean 为 false 之外,其余类型值都转化为 true。

Boolean('')         // false
Boolean(undefined)  // false
Boolean(null)       // false
Boolean(NaN)        // false
Boolean(false)      // false
Boolean(0)          // false
Boolean({})            // true
Boolean([])            // true

转化为数字类型!

Number(10);        // 10 
Number('10');      // 10 
Number(null);      // 0  
Number('');        // 0  
Number(true);      // 1  
Number(false);     // 0  
Number([]);        // 0 
Number([1,2]);     // NaN
Number('10a');     // NaN
Number(undefined); // NaN

对象类型转原始类型!

对象类型在转原始类型的时候,会调用内置的 valueOf()和 toString() 办法,这两个办法是能够进行重写的。
转化原始类型分为两种状况:转化为字符串类型或其余原始类型。

  • 如果曾经是原始类型,不须要再进行转化。
  • 如果转字符串类型,就调用内置函数中的 toString()办法。
  • 如果是其余根本类型,则调用内置函数中的 valueOf()办法。
  • 如果返回的不是原始类型,则会持续调用 toString() 办法。
  • 如果还没有返回原始类型,则报错。

5、四则运算
隐士类型转化是不须要认为的强制类型转化,javaScript 主动将类型转化为须要的类型,所以称之为隐式类型转换。
加法运算符是在运行时决定,到底是执行相加,还是执行连贯。运算数的不同,导致了不同的语法行为,这种景象称为“重载”。

  • 如果单方都不是字符串,则将转化为 数字 字符串

    • Boolean + Boolean会转化为数字相加。
    • Boolean + Number 布尔类型转化为数字相加。
    • Object + Number 对象类型调用 valueOf,如果不是 String、Boolean或者 Number类型,则持续调用 toString()转化为字符串。
true + true  // 2
1 + true     // 2
[1] + 3      // '13'
  • 字符串和字符串以及字符串和非字符串相加都会进行 连贯
1 + 'b'     //‘1b’false + 'b' //‘falseb’
[](https://github.com/luxiangqia…

其余算术运算符(比方减法、除法和乘法)都不会产生重载。它们的规定是:所有运算子一律转为数值,再进行相应的数学运算。

1 * '2'  // 2
1 * []   // 0

6、逻辑运算符

逻辑运算符包含两种状况,别离为条件判断和赋值操作。

条件判断

  • &&:所有条件为真,整体才为真。
  • ||:只有一个条件为真,整体就为真。
true && true   // true
true && false  // false
true || true   // true
true || false  // true

赋值操作

A && B
首先看 A 的虚实,A 为假,返回 A 的值,A 为真返回 B 的值。(不论 B 是啥)

console.log(0 && 1) // 0
console.log(1 && 2) // 2

A || B
首先看 A 的虚实,A 为真返回的是 A 的值,A 为假返回的是 B 的值(不论 B 是啥)

console.log(0 || 1) // 1
console.log(1 || 2) // 1

7、比拟运算符
比拟运算符在逻辑语句中应用,以断定变量或值是否相等。

== 和 === 的区别?

对于 === 来说,是严格意义上的相等,会比拟两个操作符的类型和值。
如果 X 和 Y 的类型不同,返回 false;
如果 X 和 Y 的类型雷同,则依据下方表格进一步判断

而对于 == 来说,是非严格意义上的相等,先判断两个操作符的类型是否相等,如果类型不同,则先进行类型转换,而后再判断值是否相等。

  • 如果 X 和 Y 的类型雷同,返回 X == Y 的比拟后果;
  • 如果 X 和 Y 的类型不同,依据下方表格进一步判断;

  • this
  • new
  • 闭包

闭包面试中的重点,然而对于很多初学者来说都是懵懵的,所以俺就从最根底的作用域讲起,大佬请绕过。

什么是作用域?什么是作用域链?

规定变量和函数的可应用范畴叫做作用域。只看定义,挺形象的,举个例子:

function fn1() {let a = 1;}

function fn2() {let b = 2;}

申明两个函数,别离创立量两个公有的作用域(能够了解为两个关闭容器),fn2 是不能间接拜访公有作用域 fn1 的变量 a 的。同样的,在 fn1 中不能拜访到 fn2 中的 b 变量的。一个函数就是一个作用域。

每个函数都会有一个作用域,查找变量或函数时,由部分作用域到全局作用域顺次查找,这些作用域的汇合就称为作用域链。如果还不是很好了解,俺再举个例子​:

let a = 1
function fn() {function fn1() {function fn2() {
            let c = 3;
            console.log(a);
        }
        // 执行 fn2
        fn2();}
    // 执行 fn1
    fn1();}
// 执行函数
fn();

尽管上边看起来嵌套有点简单,咱们前边说过,一个函数就是一个公有作用域,依据定义,在 fn2 作用域中打印 a,首先在本人所在作用域搜寻,如果没有就向下级作用域搜寻,直到搜寻到全局作用域,a = 1,找到了打印出值。整个搜寻的过程,就是基于作用域链搜寻的。

什么是闭包?闭包的作用?闭包的利用?

很多应聘者喜爱这样答复,“函数里套一个函数”,然而面试官更喜爱上面的答复,因为能够持续为你挖坑。

函数执行,造成一个公有的作用域,爱护里边的公有变量不受外界的烦扰,除了爱护公有变量外,还能够保留一些内容,这样的模式叫做闭包。

闭包的作用有两个,爱护和保留。

爱护的利用

团队开发时,每个开发者把本人的代码放在一个公有的作用域中,避免相互之间的变量命名抵触;把须要提供给他人的办法,通过 return 或 window.xxx 的形式裸露在全局下。
jQuery 的源码中也是利用了这种爱护机制。
封装公有变量。

保留的利用

选项卡闭包的解决方案。

循环绑定事件引发的索引什么问题?怎么解决这种问题?

// 事件绑定引发的索引问题
var btnBox = document.getElementById('btnBox'),
    inputs = btnBox.getElementsByTagName('input')
var len = inputs.length;
for(var i = 0; i < 1en; i++){inputs[i].onclick = function () {alert(i)
    }
}
整顿的知识点除了上文我具体讲述的,还有上面我简要概述的,如果全副陈说会导致文章篇幅过长,如有趣味能够 【点击我】 支付。
  • 原型和原型链
  • 继承

1. 经典继承
2. 组合继承
3. 原型继承
4. 寄生式继承

  • 垃圾回收机制

1. 两种垃圾回收策略
2. 标记革除法
3. 援用计数法
4. 如何治理内存
5. 深拷贝和浅拷贝

  • 异步编程

1. 执行上下文
2. 执行栈
3. 宏工作
4. 微工作
5. 运行机制

ES6

  • 变量晋升
  • var、let、const
  • map、filter、reduce

1.map
2.filter
3.reduce

  • Proxy 字面量定义

1.ES6 中的 Class 定义
2.Object.definedProperty()
3.Proxy 代理

  • ES6/7 的异步编程

1.Generator 生成器
2.Promise
3.async 及 await

  • 模块化形式一:函数

形式二:立刻执行函数
形式三:CommonJS
形式四:AMD 和 CMD
形式五:ES6 Moudle
小结

如果想要支付全副面试知识点,能够【点击我】

正文完
 0