每天背5道,务必背熟记住,希望能对找工作的小前端有点帮助
1、JS有几种数据类型,其中基本数据类型有哪些!
七种数据类型
- Boolean
- Null
- Undefined
- Number
- String
- Symbol (ECMAScript 6 新定义)
- Object
(ES6之前)其中5种为基本类型:string
,number
,boolean
,null
,undefined
,
ES6出来的Symbol
也是原始数据类型 ,表示独一无二的值
Object
为引用类型(范围挺大),也包括数组、函数
ES2020(即 ES11),又增加了新类型:**BigInt。**这里能答出来8种类型更加加分
2、原型和原型链
创建一个函数就会为其创建一个prototype属性,指向这个函数的原型对象,原型对象会自动获得constructor属性,指向prototype属性所在函数。
当一个对象调用某个方法或者属性的时候,先在自身查找,如果找到就调用,如果没有就顺着__proto__到原型对象中查找,如果还没有就继续去原型的原型中查找,一直到null,这样形成一条链叫做原型链。如果还没有找到就返回undefined。
3、继承
(1)原型链继承
(2)构造函数继承
(3)组合继承
4、作用域和闭包
作用域其实可理解为该上下文中声明的 变量和声明的作用范围。
闭包属于一种特殊的作用域,称为 静态作用域。它的定义可以理解为: 父函数被销毁 的情况下,返回出的子函数仍然可以继续访问到父级的变量对象,这样的函数称为闭包。
-
闭包会产生一个很经典的问题:
- 多个子函数的
[[scope]]
都是同时指向父级,是完全共享的。因此当父级的变量对象被修改时,所有子函数都受到影响。
- 多个子函数的
-
解决:
- 变量可以通过 函数参数的形式 传入,避免使用默认的
[[scope]]
向上查找 - 使用
setTimeout
包裹,通过第三个参数传入 - 使用 块级作用域,让变量成为自己上下文的属性,避免共享
- 变量可以通过 函数参数的形式 传入,避免使用默认的
5、call和apply、bind
首先要了解this的指向问题:
(1)this的指向不是在函数定义时确定的,而是在函数调用时确定,this默认情况下指向window,严格模式下为undefined
(2)使用new 调用构造函数时,构造函数内的this 指向新创建的对象
(3)通过 出call/apply/bind方法显式调用函数时,函数内this 指向指定的对象(第一个参数)
(4)通过上下文对象A调用函数时,函数内this指向对象A
var obj = {
name: '橘子君',
fn: function () {
console.log(this);
}
}
obj.fn();// 输出:{name: "橘子君", fn: ƒ}
(5)箭头函数本身并不存在this,
箭头函数的this的指向由它的外层作用域来决定的(指向外层作用域的this)
再来看call和apply、bind
作用:在函数调用时改变函数的执行上下文也就是this的值指向
区别:call采用不定长的参数列表,而apply使用一个参数数组。
-
call: fn.call(target, 1, 2)
-
apply: fn.apply(target, [1, 2])
-
bind: fn.bind(target)(1,2)
本着能为找工作中的前端帮一点小忙的初衷,借鉴了掘金里面很多大佬的文章,如有侵权请告知