当前位置: 首页 > news >正文

前端工程师4.0

1.JS数据类型

一类是基本数据类型,也叫简单数据类型,包含7种类型,
分别是:
Number 、String、Boolean、BigInt、Symbol、Null、Undefined。
另一类是引用数据类型也叫复杂数据类型,
通常用Object代表,普通对象,数组,正则,日期,Math数学函数都属于Object

2.声明变量几种方式,区别

有块级作用域:let const
存在变量提升	var
添加全局属性	var
重复声明变量	var
存在暂时性死区	let const
必须设置初始值	const
改变指针指向    var let

3.事件循环Event loop?

事件循环机制从整体上:
 JavaScript 代码的执行顺序Event Loop即事件循环,
 是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,
 也就是我们经常使用异步的原理。
 

先同步后异步
异步 包含 宏任务 微任务
异步 遇到 微任务 先执行微任务 执行完后 如果没有微任务 就执行下一个宏任务

宏任务:
setTimeout
setInterval
setImmediate
I/O
UI
Rendering

微任务:
process.nextTick()
Promise

4.Dom事件流,优先级,对一个事件就行回调在哪个阶段。

第一阶段:捕获阶段。
第二阶段:目标阶段
第三阶段:冒泡阶段。//从目标元素上传到window对象
event.preventDefault() //阻止默认事件

event.stopPropagation() //阻止冒泡行为,应用在触发子元素事件但是不想触发父元素事件的情况

event.stopImmediatePropagation() //用在事件响应优先级的场景。举例场景:一个按钮,绑定了两个click事件A和B,通过优先级的方式,第一个响应A,第二个响应B,想A响应了之后不再响应B

event.stopImmediatePropagation()//加在A的响应函数中,就能成功阻止了B的执行,这个可以应用在事件响应优先级

event.currentTarget //指的是当前被绑定的事件,也就是事件代理中父级元素被绑定的事件。

event.target //事件代理中,表示当前被执行的是哪个子元素

5.宏任务和微任务
看上面

6.promise和setTimeout

(function test() {
    setTimeout(function() {
        console.log(4)
    }, 0);
    new Promise(function executor(resolve) {
        console.log(1);
        for( var i=0 ; i<10000 ; i++ ) {
            i == 9999 && resolve();
        }
        console.log(2);
    }).then(function() {
        console.log(5);
    });
    console.log(3);
})()
//1  2  3  5  4

then()和setTimeout执行顺序,
即setTimeout(fn, 0)在下一轮“事件循环”开始时执行,
Promise.then()在本轮“事件循环”结束时执行。
因此then 函数先输出,setTimeout后输出。

7.promise的方法

Promise 类有 .then() .catch().finally() 三个方法,
这三个方法的参数都是一个函数

,.then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,
.catch() 则是设定 Promise 的异常处理序列,
.finally() 是在 Promise 执行的最后一定会执行的序列。 .

then() 传入的函数会按顺序依次执行,
有任何异常都会直接跳到 catch 序列:
实例
new Promise(function (resolve, reject) {
    console.log(1111);
    resolve(2222);
}).then(function (value) {
    console.log(value);
    return 3333;
}).then(function (value) {
    console.log(value);
    throw "An error";
}).catch(function (err) {
    console.log(err);
});

执行结果:

1111
2222
3333
An error

8.普通函数和箭头函数区别

箭头函数跟普通函数的区别
1.写法不同

箭头函数:
let fun = () => {
    console.log('lalal');
}

普通函数:
function fun() {
    console.log('lalla');
}

2.箭头函数不能用于构造函数
普通函数可以用于构造函数,以此创建对象实例。

3.箭头函数中this的指向不同
箭头函数自身没有this,它的this是父级普通函数的this.
在普通函数中,this总是指向调用它的对象或者
如果用作构造函数,它指向创建的对象实例。

4.箭头函数不具有arguments对象
每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。
但是箭头函数并没有此对象。

5.箭头函数不能当做Generator函数,不能使用yield关键字。
6.箭头函数不具有prototype原型对象。
7.箭头函数不具有super

9.set和map
人麻了

10.map和Object的区别
上同

11.JS原型链为了解决什么问题,有什么用
嘿嘿嘿

12.父子组件间通信

组件传值/通信
	父子组件
		父---子 
			vm---myA
			vm---myB
			1.在子组件标签行写入传入得值
			2.在子组件内使用props接受父组件传递得值
		子---父
			myA/myB ---vm
			1.在子组件内部使用$emit发射自定义事件和传递给父组件得值
			2.在父组件内声明自定义事件接受参数
		myA----myB 兄弟组件 
	兄弟组件 事件总线 vuex v2.x  
		1.声明一个事件总线Bus.js  
			export default new Vue();
		2.引入事件总线
			import Bus from 'xx.js'
			//vue.prototype.$emit()
			使用总线$emit发射数据出去
			Bus.$emit(自定义事件名称,发射的数据)
		3.引入事件总线	
			Bus.$on(自定义事件名称,(形参--->发射得数据)=>{

			})
	祖先/子孙组件传值 
	1.由祖先组件使用provide方法传递数据
	privode(){
		return {"msg":this.msg}
	}
	2.由子孙组件使用inject注入数据
	inject:["msg"]
	vm 
		myA child
	vuex 
组件传值类型校验
	props:{
		age:Number,
		stu:{
			type:Array,
			default(){
				return [1,2,3]
			}
		},
		msg:String,
		对一个类型校验 
		对多个类型 msg/string/number/isBoolean
	}

13.使用过Vue的命令

1.查看版本
$ npm -v
2.3.0

2.#升级 npm
cnpm install npm -g


3.升级或安装 cnpm
npm install cnpm -g

4.用 Vue.js 构建大型应用时推荐使用 cnpm 安装:
最新稳定版
$ cnpm install vue

5.全局安装 vue-cli
$ cnpm install --global vue-cli

6.创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
这里需要进行一些配置,默认回车即可

7.进入项目,安装并运行:
$ cd my-project
$ cnpm install
$ cnpm run dev

8.Vue 项目打包
打包 Vue 项目使用以下命令:
npm run build

14.v-if和v-show的区别
点击我

15.v-for和v-if优先级,会造成什么影响

vue2 : v-for 优先级比 v-if 优先级高
vue3 : v-if 优先级比 v-for优先级高
v-for v-if不一起使用 因为v-if会不断地渲染和销毁dom

16.双向数据绑定的原理,如果不用v-model怎么实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" id="ip">
    <span id="sb"></span>
    <script>
        // 数据劫持
        var obj = {};
        Object.defineProperty(obj,'hello',{
            set: function(newValue){
                document.getElementById('ip').value = newValue
                document.getElementById('sb').innerHTML = newValue
            }
        });
        document.addEventListener('keyup',function(e){
            obj.hello = e.target.value // 监听事件 修改hello的值,触发set函数  执行set函数内的内容 
        })
    </script>
</body>
</html>

1.Object.defineProperty()方法有三个参数,
分别为监测对象,对象的方法或值,触发函数;

2.如上代码,当对象的方法或属性被读取时,
会自动触发Object.defineProperty()方法的get函数,g
et函数中定义的内容会被执行,
当对象的方法或值被修改或赋值时,
会自动调用Object.defineProperty()方法的set方法,
set中定义的方法也会被执行

3.通过事件监听监听键盘抬起事件,
获取到文本框输入的值,再给对象的属性做赋值操作,
触发Object.defineProperty()set函数,
从而实现input框与span标签的双向数据绑定

17.watch和computed的区别

computed 希望某一个变量经过计算/处理后输出
	特点:具有缓存性 如果某一个值没有发生改变 计算属性不会重新执行/响应
	计算某一个属性,只要其中一个变量发生变化,计算属性就可以监听到处理之后并返回
	不会执行异步操作
	不会存在vue变量中 新建一个属性并返回
methods
		特点:无缓存性 只要调用就重新执行
		可以封装函数和发送异步请求
watch(侦听器/监听器)
	监听属性变量得变化
	特点:无缓存性,只有值发生变化得时候才可以监听到
		执行开销较大异步操作 
	'$route.query':{
		handler(){
			this.name=this.$route.query.name;
			this.loadArtilce()
		},
		deep:true
	}
	1.浅监听  ---基本数据类型
		a(n,o){
			.....
		}
		a:{
			handler(){

			}
		}
	2.深监听 ---监听引用数据类型
		obj:{
			handler(){

			},
			deep:true 
		}

18.data为什么是一个函数,不是一个对象呢

1.根组件得data可以是一个对象 普通组件必须是一个函数

2.因为组件是一个可复用得实例 如果是一个对象组件全部指向
	同一个引用地址 其中一个发生改变 其他组件也会受到影响
	所以说组件得data是一个函数 每次返回一个新对象

19.说一说生命周期,访问data最早在哪个生命周期,获取dom节点在哪个生命周期

20.说一说Vuex是什么,每个属性是干嘛的,如何使用 ?

21.vueRouter 路由守卫,项目中有涉及权限管理吗

22.有对axios进行封装吗

23.在开发中有遇到跨域问题吗,怎么解决的
///
24.项目难点和亮点

25.学习过程中vue怎么学习的

26.用过git吗,git基本操作命令
经常用

27.平常怎么解决报错的

28.常见的接口状态码
嘿嘿嘿

29如何优化你得vue项目?提升项目性能?

	1.较少控制台得打印
	2.减少异步请求
	3.较少dom操作 上层核心减少dom操作
	4.尽可能不去一起v-if v-for 
	5.项目图片使用雪碧图/精灵图
	6.正确是用vue指令 
	7.使用loading加载动画 
	8.动态组件使用keep-alive缓存
	9.区分v-if和v-show使用场景
	10.不滥用定时器 尽可能使用别得方式处理
	11.不滥用得全局变量/全局资源.....
	12.使用得第三方框架/工具库 如果方法使用得少 我们自己封装
		lodash underscore js简化工具库
		防抖和节流 
	13.组件库组件按需引入......
	14.谨慎使用全局混入

相关文章:

  • 分别将Map以Key或Vale进行排序
  • Selenium之入门
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • 7、乐趣国学—趣谈“圣贤”
  • 35分钟了解sql注入-盲注(三)
  • python求解四位数 青少年编程电子学会python编程等级考试三级真题解析2021年6月
  • SpringCloudAlibaba之gateway网关
  • 七牛云配置自定义域名
  • Spring/IoC、DI、Bean
  • 信息管理java毕业设计项目分享【含源码+论文】
  • MASA Stack 第五期社区例会
  • JavaScript 30. JSON
  • CAS:26915-72-0,mPEG-Methacrylate,mPEG-MAC,甲氧基-聚乙二醇-甲基丙烯酸酯
  • 分布式事务最经典的八种解决方案
  • 2.ROS编程学习:话题通信c++
  • “大数据应用场景”之隔壁老王(连载四)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2017-09-12 前端日报
  • 2018一半小结一波
  • Babel配置的不完全指南
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6核心特性
  • java 多线程基础, 我觉得还是有必要看看的
  • JS实现简单的MVC模式开发小游戏
  • Sass 快速入门教程
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Travix是如何部署应用程序到Kubernetes上的
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 分布式熔断降级平台aegis
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端攻城师
  • 设计模式(12)迭代器模式(讲解+应用)
  • 深入浅出Node.js
  • 数据可视化之 Sankey 桑基图的实现
  • 双管齐下,VMware的容器新战略
  • 我的面试准备过程--容器(更新中)
  • 用简单代码看卷积组块发展
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ###C语言程序设计-----C语言学习(3)#
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma once
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (ZT)出版业改革:该死的死,该生的生
  • (二)hibernate配置管理
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (三)c52学习之旅-点亮LED灯
  • (一)SpringBoot3---尚硅谷总结
  • (转)http协议
  • (转)linux下的时间函数使用
  • ****Linux下Mysql的安装和配置
  • .NET 3.0 Framework已经被添加到WindowUpdate