//待更新。。。
1.可以用typeof方法打印的类型:
答:1字符串string、2数字number、3布尔boolean、4对象Object(数组array,Null空值)、56Undefined未定义、6function。
---->基本数据类型
number,null,string,undefined,boolean
---->引用数据类型
指的是那些保存在堆内存中的对象
2.undefined 和 null :
答:Undefined 这个值表示变量不含有值。可以通过将变量的值设置为 null 来清空变量。
3.在数组的第一位插入,删除元素:
答:shift(),unshift()
4:在数组的末尾插入删除元素:
答:push(),pop()
5:在数组的中间插入删除元素
答:splice(1,2,'替代'),替代位置不填则仅删除,填写则替代
6:按顺序写下生命周期所在的阶段:
7:什么是高阶组件并书写一个高阶组件:
答:high-order-component(高阶组件)类似于高阶函数,即指接受React组件作为参数(重点),输出一个新的组件的函数,在这个函数中,我们可以修饰组件的props与state,所以在一些特定情况下高阶组件可以让我们的代码看起来更优美,更具有复用性
8:创建一个react组件是什么类型:
答:function类型
9:react组件引入后是什么类型:
答:实例化后为Object类型
10:说说PureComponent:
答:浅比较state与props,使得shouldComponentUpdate自动判断是否重新渲染组件。
注意点是当指向对象一致时,及时对象内部变化也不回渲染。
当需要组件重新渲染时,
let {items} = this.state
items.push('new-item')
this.setState({ items })
//结果不重新渲染
//需要写成
let {items} = this.state
items.push('new-item')
this.setState({ items: [...items] })
11: 0.1 +0.2 !== 0.3 为什么
答:计算机为二进制算法。
0.1的二进制为0.0001100110011001100110011001100110011001100110011001101
0.2的二进制为0.001100110011001100110011001100110011001100110011001101
加起来为:0.010011001100110011001100110011001100110011001100110101化为十进制为0.30000000000000004
不相等
12:说说对原型链对理解:
13:
14:js中对继承
-
类、继承
js里的类 class 是属于函数,对象的模板typeof的结果回是function,
js的私有继承:
//class类 extends 继承 Component组件
class WaitContainer extends Component {
/*constructor会覆盖父类的constructor,所以需要传入props绑定,否则无法使用super(name),
super是代替的是父类的构造函数,
super(name)相当于sup.prototype.constructor.call(this, name)
*/
constructor(props) {
super(props)
//super关键字来实现对父类成员Component的访问
}
}
- 闭包:
答:理解来说就是在一个房子里有许多的东西,还有一个人,这个人身上携带着房子里的东西。这个人在房子外和别人交流的时候就暴露了房子里的东西。大概。。em...就是这样把,资料就泄漏了。
- 线程
答:是程序执行流的最小单元,可并发执行。
这里可以涉及到js是单线程却可通过浏览器实现异步操作:
以下内容来自网络:
事件循环:JS 会创建一个类似于 while (true) 的循环,每执行一次循环体的过程称之为 Tick。每次 Tick 的过程就是查看是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中由主线程执行。待处理的事件会存储在一个任务队列中,也就是每次 Tick 会查看任务队列中是否有需要执行的任务。
任务队列:异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。
onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任务队列中。
setTimeout 会由浏览器内核的 timer 模块来进行延时处理,当时间到达的时候,才会将回调函数添加到任务队列中。
ajax 则会由浏览器内核的 network 模块来处理,在网络请求完成返回之后,才将回调添加到任务队列中。
主线程:JS 只有一个线程,称之为主线程。而事件循环是主线程中执行栈里的代码执行完毕之后,才开始执行的。所以,主线程中要执行的代码时间过长,会阻塞事件循环的执行,也就会阻塞异步操作的执行。只有当主线程中执行栈为空的时候(即同步代码执行完后),才会进行事件循环来观察要执行的事件回调,当事件循环检测到任务队列中有事件就取出相关回调放入执行栈中由主线程执行。
call:
//设计一下函数,输出为“什么函数”:this指向的name
function ws() {this.name = 'ws';console.log('ws:',this.name)}
function ydd() {this.name = 'ydd';console.log('ydd:',this.name)}
//this转换
ws.call(ydd,ws) //可视为ws函数中,用ydd替换ws
//输出为 ws: ydd
ydd.call(ws,ws) //可视为ws函数中,用ydd替换ws
//输出为 ydd: ws
apply: 指向改变同call
区别: