文章目录

  • 1、实现元素的居中
  • 2、flex布局以及属性
  • 3、ES6新特性
  • 4、数组有哪些方法?map和filter的区别?for of和for in的区别?
  • 5、js异步有哪些方式?promise和async/await的区别
  • 6、vue的生命周期 哪些拿到dom 哪些拿到data
  • 7、学习前端多久了?怎么学的前端?
  • 8、css3新特性有哪些?动画怎么实现的
  • 9、三栏布局
  • 10、this指向问题
  • 11、迭代器
  • 12、数组的扁平化
  • 13、事件循环是什么和一道分析输出题目
  • 14、vue2和vue3的区别
  • 15、node.js和mongdb是如何接触的
  • 16、http和HTTPS的区别
  • 17、实现一个字符串的拼接输出结果
  • 18、删除数组中的重复元素
  • 19、position的默认属性值
  • 20、写一个闭包
  • 21、removeEventListener能够解绑addEventListener绑定的事件嘛
  • 22、common.js和es6的模块化的区别
  • 23、HTML CSS JS的加载顺序
  • 24、前端和后端都是怎样的感觉?
  • 25、看你学的控制,为什么跨专业找工作
  • 26、package.json的作用?可不可以没有package.lock.json?打包的时候模块是会被打包的吗?打包后为什么main.js中挂一串数字?
  • 27、node.js和js的事件循环机制有什么区别?
  • 28、js如何监听路由的变化
  • 29、vue的双向绑定
  • 30、为什么采用虚拟dom
  • 神策数据前端二面面经
  • 31、js常见的异步操作
  • 32、了解深拷贝吗?
  • 33、js和java的有什么不同?
  • 34、js常见的事件
  • 35、页面文字添加下划线
  • 36、用户那边如何只只更新一张同名图片?
  • 37、vuex中的数据刷新后丢失的问题
  • 38、HTTPS如何保证信息传输的安全
  • 39、js中对象的常用方法
  • 40、如何判断一个js变量是空对象
  • 41、is not defined和undefined的区别
  • 42、进程和线程
  • HR常见问题
  • 1、为什么选择前端
  • 2、职业规划
  • 3、其他人对你的评价
  • 4、自己的优缺点
  • 5、为什么选择这个公司
  • 6、HR薪资问题
  • 7、最遗憾的一件事情:5.6月份的时候因为时间冲突,没有去实习。
  • 8、遇到的挫折以及不如意的事情:考研的那一年。
  • 9、如果领导交给你一件不可能完成的任务怎么办?

面试注意问题:开始先说好,说的不对的希望可以指出来;

1、实现元素的居中

行内元素:
块级元素:

2、flex布局以及属性

3、ES6新特性

4、数组有哪些方法?map和filter的区别?for of和for in的区别?

for in是用来遍历对象的,得到对象的key
for of 是用来遍历数组 set map 的,set得到每一个元素值,map得到数组形式的键值对
for in 遍历数组的话会得到索引值
for of 遍历对象的话会报错 输出不可迭代

5、js异步有哪些方式?promise和async/await的区别

6、vue的生命周期 哪些拿到dom 哪些拿到data

7、学习前端多久了?怎么学的前端?

是从去年开始接触前端,截止到今天刚好是11个月。
首先,第一遍的时候是跟着视频课程的老师过的HTML css js的基础部分,之后开始仿写pc端项目的时候,就结合着犀牛书又过了一遍基础知识,项目中碰到的问题大多是去csdn上搜答案,了解问题出现的原因,寻找最优的解决方法,以及做好总结,避免以后犯类似的错误。
之后的vue.js是看的官网文档,项目也是跟着视频课老师学的,项目中出现的问题,碰到的问题也基本是按照三大步骤解决的。

8、css3新特性有哪些?动画怎么实现的

1、边框 border-radius box-shadow
2、渐变色 线性渐变和径向渐变
3、2d和3d效果 transform: translate(移动)、rotate(旋转顺时针)、scale(缩放倍数)
4、过渡transition(属性 时间 线性变化 延迟时间再去过渡)
5、动画 用@keyframes 动画名称去定义动画,调用的时候animation: 动画名字持续时间
6、盒子模型 box-sizing
7、媒体查询配合rem做响应式

9、三栏布局

10、this指向问题

11、迭代器

语句迭代器:iterator:用Symbol.interator()生成一个迭代器,这个迭代器有一个next函数,函数中有两个参数,第一个是value第二个是done,value表示当前值,done表示是否遍历完成。他可以迭代数组和set不可以迭代对象和map

var obj = [3,4,5]
var arr = obj[Symbol.iterator]()
console.log(arr.next()); //会得到一个对象 包括 value 和 done

12、数组的扁平化

13、事件循环是什么和一道分析输出题目

浏览器的事件循环:首先要说一下浏览器的事件执行有主线程 宏任务和微任务队列。常见的宏任务队列有script脚本 setimeout setinterval 微任务有promise的then方法。先执行script脚本的同步代码,碰到宏任务的时候把它扔到宏任务队列,碰到微任务的时候把它扔到微任务队列,当执行完主线程的同步代码之后,执行微任务队列里的微任务,然后执行下一个宏任务。
try catch的用法:用来捕获同步任务中的错误的,如果里边放的是异步错误,则捕获不到

14、vue2和vue3的区别

首先从原理上来看,数据监听是一个区别,对数据的懒观察是一个(vue2是把所有的data刚开始就添加上所有的监听,但是vue3是只对初始渲染的部分添加监听),在一个是watcher的区别,vue2中通过vue.set给对象添加新属性的时候依赖该对象的所有watcher都会重新走一遍,但是vue3只对依赖的相关属性重新走一遍。
然后从组件使用上来看:vue2使用的是option api vue3使用的是composition api,所以对与创建数据,方法属性,计算属性,生命周期hooks, props 事件的使用上都发生了变化
1、创建数据,vue2的话是放在data中的,但是vue3是响应式数据 这就要求把响应式导入reactive 然后通过setup方法去创建数据state,在表单使用数据的时候不能只写数据名称,也要把state加上。
2、methods。vue2中的方法是直接放在methods中的,vue3中的方法是放在setup中的
3、computed属性。vue2中直接放在computed这个api中的,但是vue3中这是一个单独的api,所以要导入然后在setup的state中去定义
4、声明周期hooks 也是一个单独的api,vue3中没有全局的声明周期,比如组件挂载onmounted,要先把这个api引入,然后在setup中使用
5、this指向和props属性。vue2的this是指向该组件的,所以可以拿到props中的数据,但是vue3中要把props作为setup的第一个参数,然后通过props.数据名去调用数据
6、事件,vue2中通过this.$emit就可处理事件,vue3把emit作为setup的第二个参数,然后才能使用。

15、node.js和mongdb是如何接触的

最近接触的美团移动端的一个项目中后端用的是node+mongdb写的,并且现在前端的主流趋势也应该是往大前端发展,所以就入门了一下,首先node.js是一个内置V8引擎的JS运行环境,内置NODE API,并且webpack npm都是基于node开发的。node的执行过程大概是这样的。。。优点:java是多线程的,所以他处理I/O操作的能力不如node,所以node使用于处理I/O操作多 高并发的情况,但是他的计算速度不如Java。我经常用的大概就是全局模块__dirname __filename 系统模块 fs http(项目中用的是express库) 还有一些自定义的模块。
mongdb我就是学了基本的操作命令,mongod开启本地数据库 mongo连接本地数据库 show dbs, use 库名,show collections, db.集合名.insert/remove/updata/find()等命令,在这里就是用复制命令把项目中的数据放到了本地。

16、http和HTTPS的区别

1、HTTPS使用数字证书,费用较高,HTTP不需要
2、HTTP采用明文传输,HTTPS采用SSL加密传输,更安全
3、HTTP协议的端口号是80端口,HTTPS协议的端口号是443端口
4、HTTP协议是无状态的简单的连接,HTTPS可以加密传输还能验证身份查看数据包的完整性。

17、实现一个字符串的拼接输出结果

例如get(obj, a.b.c.d)
思路:给定一个字符串和他的拼接键值,把键值分割成数组,遍历这个数组,查看obj[keys[i]]是否有值,有的话就给obj重新赋值

const obj = {a: {b: {c: {d: 1}}}
}
function get(obj, keys) {if(typeof keys !== 'string') {console.error('type error');}keys = keys.split('.')for(var i = 0; i < keys.length; i++) {if(obj[keys[i]] !== 'undefined') {obj = obj[keys[i]]} else {console.error('输入的键值有错误');}}return obj
}
console.log(get(obj, 'a.b.c.d'));

18、删除数组中的重复元素

要求:不用数组的API和新数组

function dele(nums, val) {var fast = 0var slow = 0while( fast < nums.length) {if(nums[fast] !== val) {nums[slow] = nums[fast]++slow}++fast}return nums
};
var arr = [1,1,2,3,4,1,5]
console.log(dele(arr, 1));

19、position的默认属性值

static:静态属性值 有了这个属性值加top才有效

20、写一个闭包

闭包:函数外部访问不到函数内部的变量,所以用一个闭包就可以实现,该闭包就是 fn2()

function fn1() {var a = 4function fn2() {console.log(a)}return fn2
}
var f = fn1()
f()

21、removeEventListener能够解绑addEventListener绑定的事件嘛

正常情况下,向下边这样,是不可以的,因为绑定的函数,是一个匿名函数,这个函数是放在调用栈中执行的,执行完之后是被被弹出,所以下边找不到一样的函数,所以直接在removeEventListener解绑事件是不能够实现的。

var div = document.querySelector('div')
div.addEventListener('click', function add() {console.log(1);
})div.removeEventListener('click', function add() {console.log(1);
})

但是向下边这样,能把函数先定义好,在在全局调用的时候,去调用就可以实现解绑了。

var div = document.querySelector('div')function clear() {console.log(2);
}
div.addEventListener('click', clear)
div.removeEventListener('click', clear)

22、common.js和es6的模块化的区别

1、用途上:common.js只可以在node.js中使用,es6的模块化可以在浏览器和node.js中使用
2、使用方式上:common.js通过require导入module.exports导出;但是es6通过import和export导入导出
3、加载方式上:common.js是在加载是执行的,即通过require直接把fs这个模块请求过来,然后在内存中开辟一块内存空来存放,就是用一个对象来存放,然后使用其中的方法时通过该对象去调用方法,下一次加载该模块的话,也不会再去执行了,从内存中取;但是ES6模块是编译时加载的,即只是把需要的方法加载过来。
4、同步加载:common.js是同步加载的,es6是异步加载模块的
5、CommonJS模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。即当在common.js中定义了一个原始数据类型的值count=1,在a.js中通过require导入该模块,并且更改count的值,但是common.js中国的count并不会被修改,但是如果把它的调用改成方法module.exports的话就可以被更改了。通过ES6模块导入的话,就可以更改common.js中的原始数据类型值了。
common.js中的代码

var count = 1
function inccount() {count++
}
module.exports = {// count: count, 这样写的话因为是原始数据类型,所以不会外边的模块中不会改变此基本数据类型的值get count() {return count //这样写的话 count就可以在外部更改了},inccount: inccount
}
``
es6.js中的代码
```javascript
export let counter = 3;
export function incCounter() {counter++;
}

HTML中的代码

<script type="module">//下边是 common.js的导入/*  var mod = require('./common.js');console.log(mod.count); //1//mod.inccount() //这里即使是在外边改变了被引用模块中原始基本类型的值,也不会更改被引用模块中的原始基本类型的值mod.inccount() //但是如果把 输出的原始数据类型封装成一个函数的话 就会被改变了console.log(mod.count); //1  *///下边是es6的导入import {counter, incCounter } from './es6.js';console.log(counter); // 3 通过es6导入的模块就可以直接更改被引用模块的基本数据类型了incCounter();console.log(counter); // 4 *///总结:CommonJS模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。</script>

6、循环加载方面
因为common.js的加载和执行机制是这样的,当require的时候,就把该模块加载过来,然后在内存中创建一个对象来保存该模块,并且执行该模块,当用到方法的时候,从缓存的对象中拿方法,所以出现循环加载的时候,只会输出已经执行的部分。

//下边是 a.js的代码
module.exports.done = false;
var b = require('./b.js');
console.log('在 a.js 之中', b.done)
module.exports.done = true;
console.log('a.js 执行完毕');//下边是b.js的代码
module.exports.done = false;
var a = require('./a.js');
console.log('在 b.js 之中,a.done = %j', a.done);
module.exports.done = true;
console.log('b.js 执行完毕');//执行顺序:a.js中输出done:false;然后再去请求b.js就是执行b.js里边的代码,b.js中输出done:false,然后去缓存中取a.js的已经执行了的代码,就是done:false,然后b.js中的代码接着执行,done:true,输出b.js执行完毕,再去执行a.js,输出done:true,a.js执行完毕

ES6模块使用动态加载,不会在缓存中出现,所以要保证每次能拿到当前值才可以

//a.js的内容
console.log('执行a')
import b from './b' // 开始编译b模块,代码停留在这里
console.log(b)
console.log('导入b之后')
export default '我是a模块'//b.js的内容
console.log('执行b')
import a from './a' // 由于a模块还在编译阶段,代码并没有执行结果,切记在这里使用结构赋值 let {a} = undefined 会报错的
console.log(a) // 变量是undefined
console.log('导入a之后')
export default '我是b模块'//执行顺序:首先执行a.js,输出执行a 然后导入b模块了,去执行b模块,输出执行b 然后默认a从a模块导入了,然后输出a为undefined,输出导入a之后,我是b模块,导入b之后,导出我是a模块

23、HTML CSS JS的加载顺序

HTML文档的加载是从上往下顺序加载的,当加载到link引入的css标签的时候,就并行加载css文件,同时HTML结构也会继续往下渲染,碰到js文件的时候,就会停止对当前文档的加载,转去加载和执行js文件直至代码执行完毕,再去渲染HTML文档,所以一般把js文件的script标签引入放到文档的底部,当页面结构和样式渲染完毕的时候再去对DOM元素进行交互操作。但是script加了defer或者是async标签的话,js文档的加载和HTML的渲染就是并行进行的了,不一样的是,async保证的是js文档的加载和执行均是并行进行的,但是defer的话js的加载是并行进行的,但是执行要等到当前文档渲染完毕之后再去执行。
**js脚本放在head中和放在body中的区别是什么?**因为HTML页面是顺序加载的,所以如果是放在head中的话,js代码就是预先加载的,等到被调用的时候,立即执行,放在body中的代码,是等到页面加载的时候再去执行,所以可以把需要渲染过程中接着执行的代码放在head中。

24、前端和后端都是怎样的感觉?

后端注重的是数据库的管理,他的操作不可见,没太有成就感。前端负责的是页面的展示,当你做出一个页面,能立马看到成效的时候,是很有成就感的,在做仿蘑菇街移动端项目的时候,碰到bug然后花时间去了解问题出现的原因,解决方法,通过查文档,查csdn来debug成功了,是很有成就感的一件事情,比吃一顿好吃的开心得多。

25、看你学的控制,为什么跨专业找工作

其实这个问题在我去年决定不读博以后,直到决定学前端,思考了很长时间,之所以不选择控制行业,一是因为这个行业对女生是有歧视的加之我研究生的研究方向是传感器这块的,和控制关系不大,所以决定放弃从事本行业。选择互联网起初是源于互联网浪潮,他的就业机会更多一些,之所以选择前端,是因为当时对前后端做了比较,比起操作后台看不到的数据 ,我更喜欢做一个最接近用户的程序员,我写的代码可以直接直接显示在屏幕上,更有成就感,所以就对前端需要的技术HTML CSS JS等进行了系统的学习,在学习过程中更是体会到了debug带给我的快乐,更加坚定了继续追前端技术的信心,所以就决定从事前端的工作了。

26、package.json的作用?可不可以没有package.lock.json?打包的时候模块是会被打包的吗?打包后为什么main.js中挂一串数字?

因为如果每一个包都在一个地方的话,是不是每次想调用一个包就很麻烦了,所以就把这些包放在npm包管理工具中,便于安装包,并且在项目打包的时候无须打包依赖,只有一个package.json文件用来描述版本号和各种依赖的模块,在下载一个项目的时候,只需要npm install 就可以安装项目的依赖模块了,在package.json中放的是依赖的具体版本号。不可以没有,package.lock.json文件是node-modules或者是package.json文件发生更改后自动生成的文件,他锁定了当前项目依赖的具体版本号,所以必须有,如果没有的话,npm install可能会安装不一样的依赖。打包的时候只会把项目中用到的模块进行打包,

27、node.js和js的事件循环机制有什么区别?

先说一下js的事件循环机制
node:碰到代码,交给v8引擎解析,然后交给node api去执行代码,node api是通过libuv库执行的,把不同的任务分配给不同的线程,通过异步执行把结果返给V8引擎。poll阶段在接收输入的数据之后,去创建一个执行栈,执行里边的同步代码,然后把setimmediate放入check,等计时结束把settimeout和setinterval放入timer,然后检查执行check检查执行timer接着是i/o口的操作,promise.nextick会在当前阶段执行完毕进入下一个阶段之前执行,就是在两个阶段切换的时候去执行的,
他两最大的区别就是微任务的执行顺序不同,浏览器的微任务是在当前宏任务执行完毕之后再去执行的,node端的微任务是在每一个阶段都会去执行的。
例如下边的例子:

console.log('start')
setTimeout(() => {console.log('timer1')Promise.resolve().then(function() {console.log('promise1')})
}, 0)
setTimeout(() => {console.log('timer2')Promise.resolve().then(function() {console.log('promise2')})
}, 0)
Promise.resolve().then(function() {console.log('promise3')
})
console.log('end')
//浏览器端的代码执行顺序
//node端的代码执行顺序:start=>end=>promise3=>timer1=>timer2=>promise1=>promise2

28、js如何监听路由的变化

1、对于hash模式的路由,通过window.onhashchange来监听
2、对于history模式的,只有history.go()/forward()会触发onpopchange,pushState/replaceState不会触发onpopchange事件,所以得通过发布订阅模式,重写history,在history添加监听事件。

29、vue的双向绑定

指的是:组件中的data发生改变,视图更新的过程。
原理:采用数据劫持结合发布订阅者的模式,通过object.defineproperty给data中的数据转化成setter/getter,当data改变的时候发布消息给订阅者,订阅者收到消息之后触发视图的更新。核心就是object.defineproperty这修改dom的方法,在这里,实现嵌套对象的监听有两点需要实现,第一个是当对象的属性值是引用数据类型的时候,就要在方法的一开始observer一下value,在一个就是当修改的属性值变成引用数据类型的时候,在新传入的newvalue中observer一下newvalue,对于数组的监听无法实现数组下标变化时的监听问题,是重写数组的增删改查方法,在里边添加对dom的监听,对于对象新增的属性和方法监听不到的问题的解决方案,通过this.$set(对象,属性,属性值)来获取。
vue的初次渲染:解析模板为render函数;绑定事件监听,触发响应式;执行render函数生成真实的虚拟dom.
vue的更新渲染:修改data,触发setter;执行render函数生成真实的虚拟dom节点;调用init方法中的patch函数,对新旧节点进行对比,找出有差异的节点,只重新渲染差异部分。

30、为什么采用虚拟dom

因为真实的dom操作一次就触发一次渲染,耗时长,浪费性能;js的计算速度远远大于dom的渲染速度,所以采用js来模拟dom结构,计算出最小的变更,只操作有变化的dom。这里调用的是init方法中的patch函数,首先对比外层节点,当没有新节点就删除旧的,没有旧节点就增加新节点,当两个节点的tag和props一样的时候,再去通过patchVnode去对比子节点。当子节点的children是childtext的时候就去更新childtext,当不是的时候,就去对比里边的节点,有新的删除旧的,有旧的就增加新的,当完全一样的时候就进入updatechildren阶段,给新旧两组节点分别添加两个指针,首先头头比较,一样的话左指针右移,不一样的话进入尾尾比较,头尾比较和尾头比较,当新的先遍历完的时候就删除旧的,当旧的先遍历玩的时候,就增加新的。

神策数据前端二面面经

31、js常见的异步操作

1、定时器,有settimeout setinterval
2、ajax请求
3、promise
4、事件

V8引擎如何实现异步
1、事件循环。当执行一段代码的时候,创建一个全局执行上下文环境,碰到同步代码放到调用栈中执行弹出,碰到异步代码,先把他挂起,等到有返回结果的时候把它推入到消息队列中,等到调用栈中的代码执行完毕把消息队列中的推到调用栈中依次执行。
2、定时器。先执行同步代码,等到定时器定时时间结束再把它推到调用栈中执行
3、DOM事件。比如点击 滚动事件
4、ajax请求
5、promise

哪些是宏任务?哪些是微任务?
由浏览器发起的任务时宏任务:script脚本任务、定时器任务、ajax任务
由js引擎发起的是微任务:promise

32、了解深拷贝吗?

巴拉巴拉解释一下深拷贝,深拷贝的常用方法?
lodash的clonedeep
json的stringfy(把对象转换成字符串),和json的parse(再把字符串转换成对象),一来一去。新的对象就产生了。
实现深拷贝的思路:传入一个对象,首先判断该对象是不是一个object,不是的话就返回,然后开始遍历这个对象的属性,当属性值是引用数据类型的话,就递归深拷贝,不是的话,就拷贝当前值。
问:深拷贝的循环引用是怎么解决
答:创建一个哈希表来保存已经拷贝过的对象,如果再碰到的话,看该属性是不是在哈希表中出现过,出现过的话,就从哈希表中取,没有出现过的话,就把它放到哈希表中。

33、js和java的有什么不同?

js是弱类型语言,使用使用变量之前不需要定义数据类型;java是静态类型语言,必须提前声明变量的数据类型。
js具有动态语言特点。java中一旦设置的数组长度就不能在更改了,并且数组中只能放一种数据类型的元素;但是js可以更改数据长度,并且数组中可以存放不同数据类型的元素。
js是边编译边执行的,但是java是先编译在执行的。
js是面向过程的,有封装继承和多态三个特性。java是面向对象的。
封装:指的是函数的类或者是构造函数,为了提高代码的利用率。
继承:可以让一个对象访问另一个对象的属性和方法,比如js实现继承的那几种方式。
多态:指的是方法的重载和重写。重载指的是方法不同但是方法名字相同,通过传入方法的参数来区别方法。

34、js常见的事件

onmouseover:鼠标经过
onmouseout:鼠标离开
ommousedown:鼠标按下
onmouseup:鼠标弹起
onclick:点击事件
onfoucus:聚焦事件

35、页面文字添加下划线

一个是采用text-decoration:underline
二是给一个:border-bottom:1px solid red

36、用户那边如何只只更新一张同名图片?

默认情况下,vue会使用缓存中的图片,即使是更改了图片,在视图中也不会更新,解决方法:随机生成一个数字,然后在图片的路径后边加上这个随机数就可以实现了。或者是在图片的路径后边加时间戳。new Data().getTime()

37、vuex中的数据刷新后丢失的问题

因为页面刷新的时候是重新加载vue的,所以store中的数据会丢失。
解决方法一:在页面刷新的时候把vuex中的state放到sessionStorage中,然后在页面加载的时候从sessionStorage拿数据。
//在页面加载时读取sessionStorage里的状态信息
if (sessionStorage.getItem(“store”) ) {
this. s t o r e . r e p l a c e S t a t e ( O b j e c t . a s s i g n ( , t h i s . store.replaceState(Object.assign({},this. store.replaceState(Object.assign(,this.store.state,JSON.parse(sessionStorage.getItem(“store”))))
}
//在页面刷新时将vuex里的信息保存到sessionStorage里
window.addEventListener(“beforeunload”,()=>{
sessionStorage.setItem(“store”,JSON.stringify(this.$store.state))
})
解决方法二:采用vuex-persistedState插件 ,他的本质也是利用的是把store中的数据放在sessionStorage中解决的这个问题。

38、HTTPS如何保证信息传输的安全

首先采用对称加密算法:就是通信双方的加密和解密使用同一个秘钥。但这时候存在一个问题,就是秘钥的首次传输如果采用对称加密的话,很容易被黑客劫持,所以有了非对称加密
非对称加密算法指的是公钥+私钥=密钥对。用公钥加密的数据只能用这个密钥对的私钥才能解开,翻之亦然。通信双方都有一个密钥对,传输数据之前先把公钥传输给对方,然后对方采用这个公钥加密数据,自己拿到数据之后再去用自己的私钥解密。但是非对称加密的传输速度很慢,所以需要两者结合。
使用对称加密进行数据加密,采用非对称加密进行身份验证和秘钥的协商。
但是这个时候又存在一个问题,就是公钥传输的安全问题,容易被中间人劫持。这个问题用数字证书解决。
数字证书的实现:首先用hash算法对公钥进行加密形成信息摘要,然后用认证中心的私钥对信息摘要加密形成签名,签名和原始信息组合形成数字证书。对方拿到数字证书的时候用相同的hash算法生成信息摘要,然后用认证中心的公钥对数据进行解密形成信息摘要,看一下这两个信息摘要是不是一个来验证数据的完整性。

39、js中对象的常用方法

Object.assign(target, source1,source2) //对象的浅拷贝
Object.keys() //获取对象的所有属性名,并输出一个数组
Object.hasOwnProperty(k) //查看k这个属性名是不是出现在Object中,而不是出现在原型链中
Object.is(a,b) //类似于双等号 判断两个元素是不是相等
for in 遍历对象,得到的i是key 然后obj[i]就是value了
Object.toString() //对象转换成字符串
Object.valueOf() //得到对象的原始数据类型

40、如何判断一个js变量是空对象

1、先转化成字符串然后看是不是等于{}
var obj = {}
console.log(JSON.stringify(obj) === ‘{}’);
2、通过Object.keys(obj)得到对象的所有key组成的一个数组
Object.keys(obj).length == 0
3、用for in封装一个函数,如果是可以for in该对象的话,就是返回false 反之返回true
var obj = {}
function kong(obj) {
for(var k in obj) {
return false
}
return true
}
console.log(kong(obj));

41、is not defined和undefined的区别

undefined就是变量声明了但是没有赋值。
is not defined是变量都没有声明。

42、进程和线程

进程:程序运行时,系统自动为其分配的内存空间,包括代码数据等,这样的一个环境叫做进程。
线程:程序运行的最小单位。
关系:线程依赖于进程存在,可以采用多线程处理事务提高效率。
特点:
1、关联性。一个进程中,如果有一个线程出错,则整个进程崩溃,多个线程之间互不影响
2、内存释放。一个进程执行完毕,系统自动释放内存,
3、数据共享。线程共享进程的数据,但是进程之间的数据相互独立。

蓝湖终面挂
原因:全程问的webpack和node的知识,这一点已修改了简历
webpack的dist文件夹中为什么有参数,参数的意义,如何设置
为什么先创建这个package.json文件,有了这个文件package.lock.json文件可以没有吗
node是如何解决多线程的,集群用过吗?

蔚来汽车挂在了算法上
给一个对象,按照要求输出结果的题目,类似于对象的get方法
百度终面挂在了算法上
1、原地删除一个数组的目标值 返回原数组
2、求出1-n的所有质数
3、实现对象的set方法,给定一个对象,按照要求输出对象值,如果没有的话就给他附第三个参数的值
4、实现数组的flatten,有第二个人参数和没有第二个参数的情况

HR常见问题

1、为什么选择前端

从去年决定不读博开始,就对自己的职业做了详细规划。选择软件开发,起初是因为软件浪潮,就从前端和后端做了一下对比,比起后端操作逻辑性更强的数据库,个人更喜欢能带给我成就感的前端,写一段代码就可以体现出来,这更能带给我满足感,更有自学的动力,所以选择了前端。截止到现在,通过一年的学习,对于前端的基础知识掌握程度还算熟练,自己也很适应前代码的日常生活,所以在秋招到来之际就坚定地走了前端这条路。

2、职业规划

首先我觉得我的职业规划是从去年开始入门前端开始的,大概分为了这四个阶段,
第一阶段:从去年到今年拿到offer,恶补计算机专业知识和前端所需技术,到现在能有参加面试的资本。
第二阶段:从拿到offer到2022.7月正式工作。在这一阶段,如果公司可以提前实习的话,我个人更希望可以提前实习,这样的话能更早的熟悉以后的工作内容,如果不实习的话,会联系面试官问一下公司项目的具体技术栈,提前掌握好理论知识。
第三阶段:正式工作的三年时间之内,主攻技术。技术尤其是前端技术更新速度是非常快的,所以在前三年的时间里,实现项目需求的过程中会不断加深对源码的了解,这样的话,即使技术更新换代快,但是内部本质是一样的,可能就是API的调用不一样,所以这三年是技术强化的三年。
第四阶段:这个阶段是走管理岗还是继续走技术岗,这一块我觉得主要是看公司的培养机制,这个阶段,我觉得无论是继续走技术岗还是管理岗应该是一件顺水推舟的事情,如果是继续走技术岗的话,有了前三年的积淀,对技术栈的选择和项目功能需求的实现,我觉得都应该能做出更优的决断,能和整个团队一起做出更好的产品,走管理岗的话,拿到一个项目对整体的框架的认知应该也会比较深,把一线的代码任务交给年轻人,自己统筹项目,因为不得不承认,年龄对程序员确实是一道坎,我在20多岁的时候可以加班到11.00,但是可能到34.5左右的时候就只能加班到8.00了,这种情况下,可能年轻人的开发效率是比我们快的,我个人更倾向于走管路岗,我觉得这不仅是对我的身体负责,更是对公司负责,对整个团队的项目推进进度负责。

3、其他人对你的评价

我觉得其他人对我最多的评价就是我很积极,乐观了吧,就以最近这段时间来看,大家都在找工作嘛,压力都比较大,面试过程不顺利的情况有很多嘛,有的同学可能就比较消极一点,天天被打击的不行,但是他们就老说我,你也没有拿到你想要的offer呀,怎么不着急,我就觉得offer早晚回来的,只要我从每一次的面试中总结经验教训,一点点提升自己,总能拿到我想要的offer的。
还有一点就是大家可能觉得我脾气好,好相处,整天乐呵呵的,他们问我啥,我知道的也会给他们讲明白。
缺点的话,可能就是想问题想的比较多吧,在决定做一个比较大的决定之前,会想挺多方面的东西的。

4、自己的优缺点

缺点的话:想的比较多。现阶段没有实习过我觉得是一个很大的遗憾,上半年没有把科研和工作分开,导致5.6月份找实习的时候我的审稿意见回来了,在补实验,改论文,所以错过了实习的时间。性格上的缺点就是我觉得我和其他的程序员不太一样,我看网上的帖子程序员不就是那种专注敲代码不太爱说话的那种,但是我觉得我就比较相反,挺爱交际的,所以,我觉得会不会和其他的程序员格格不入。
优点的话:
1、努力加勤奋。我觉得我是一个比较努力的人,用现在一个流行词来讲的话,就是逆商,哈哈,我觉得您那边应该也可以看到我本科是菏泽学院的,是山东的一个二本院校,高考之前没有好好学习嘛,贪玩,进了大学之后,才深刻认识到少装不女里老大徒伤悲的悲哀,知道了,在现在人才济济的社会中,我如果以一个这样的身份工作的话,能有多大的就业优势,所以果断选择了考研,我也很感谢我的母校,当时选择考研院校的时候,我们辅导员劝过我,因为。。。但我还是坚持了自己的选择,不管考研的时间过得多艰苦,我都挺过来了,最后也实现了我的目标,所以我挺感谢我的母校的,如果不是我高考成绩不理想,可能我也没有破釜沉舟的勇气考东大,所以,我觉得,好多事情都是得自己的努力再加上运气的。
2、乐观。
3、与他人相处得好。

5、为什么选择这个公司

其实我找工作的三个点就是城市 公司的发展前景 还有平均十点之前能不能下班
1、选择北京是因为从小受到的教育就是人往高处走嘛,父母他们那一代可以在济南那种二线城市过上自己想要的生活,作为下一代,他们非常希望我能去一线城市发展,从我的角度考虑的话,北上广深,我还是希望找一个离家近一点的,所以选择了北京。
3、首先欣赏贵公司的发展方向。那句话怎么说的来着,要么做互联网,要么做金融,我现在秋招走的研发岗,贵公司有事金融公司,所以,我认为未来是很有发展方向的。
4、自己虽然走了开发这条路,但是很想学习金融投资这块,虽然基金已经入手很久了,但是对于股票现在还处于观望阶段,所以,很想跟着内部人员学习一下。
为什么选择海康?
1、首先是城市的选择,毕业就面临着工作城市的选择,我是想一毕业就回家的,所以选择了济南的公司。
2、在一个是公司前景,海康的业务聚焦于智能物联网,大数据服务和智慧业务,在现在互联网公司几乎处于饱和还有风向这么不稳的情况下,我更倾向于做硬件的贵公司
3、技术栈的匹配。海康是我见过的面向校招的第一家前后端分离的济南那边的公司,技术方面等正式入职之后,会上手更快一点。所以会优先选择海康。

6、HR薪资问题

1、表明态度:首先对于我个人来讲,对于没有工作经验刚毕业的应届生,我并不会把薪资作为我选择一个公司的唯一标准,更看重的是公司的发展前景和我个人职业规划的匹配,我相信公司这边也是看中我的发展潜力,应该会给应届生一个合理的薪资范围,我想问一下大概是多少?
如果说了并且自己能接受的话,再问一下薪资结构(注意绩效工资是必须发的,但是绩效奖金不是必须的),住房公积金的缴纳基数和缴纳比例,每个月的补贴大概有什么,加班会有加班费嘛,年终奖的考核制度,
如果持续追问的话,就说自己已经拿到上海总包28的offer和深圳30的offer了,所以我觉得可能我的能力差不多是在这个价位,所以,希望可以拿到总包30,但是北京是我最想去的城市,所以如果薪资差不多的话,会先选择贵公司。

7、最遗憾的一件事情:5.6月份的时候因为时间冲突,没有去实习。

8、遇到的挫折以及不如意的事情:考研的那一年。

9、如果领导交给你一件不可能完成的任务怎么办?

首先我会自己查找资源,看一下完成这件事情需要什么资源和时间成本。
然后寻找周围同事看是不是能帮忙解决
最后拿着收集的资源和报告给领导,寻求资源和帮助。

2021年秋招前端复盘相关推荐

  1. 2021年秋招遇到的前端笔试/面试题

    ** 本文仅用于记录本人2021年秋招遇到的部分前端笔试/面试题,答案仅供参考 ** 1.跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度 ...

  2. 知乎热榜:如何看待 2021 年秋招算法岗灰飞烟灭?

    公众号关注 "GitHubPorn" 设为 "星标",带你了解技术圈内新鲜事! 出处:https://www.zhihu.com/question/406974 ...

  3. 如何看待2021年秋招算法岗灰飞烟灭?

    仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:知乎,https://www.zhihu.com/question/406974583 编辑:深度学习与计算机视觉 18年是否值得进入,19年供 ...

  4. 如何看待【2021年秋招算法岗】灰飞烟灭?

    来自:知乎 链接:https://www.zhihu.com/question/406974583 XX Zhao 我以一个公司的面试官角度来回答一下这个问题吧. 我目前在tmd中一家的业务线上担任图 ...

  5. 谁说2021届秋招算法岗一定要灰飞烟灭啦?

    没错,这是一碗鸡汤,希望肝完这碗鸡汤的师弟师妹们就不要过度焦虑啦-理性上车,理性下车,希望萌新们都能遇到最适合自己的坑位 2014年末入坑AI,一路见证了AI行业的快速起飞.爆炸.焦虑和冷却. 小夕前 ...

  6. 2021届秋招算法岗真的要灰飞烟灭了吗?

    星标/置顶小屋,带你解锁 最萌最前沿的NLP.搜索与推荐技术 文 | 不拖更的夕小瑶 2014年末入坑AI,一路见证了AI行业的快速起飞.爆炸.焦虑和冷却. 小夕前几天在知乎上看到一个问题<如何 ...

  7. 2021互联网秋招,有哪些值得投的好公司?

    微信公众号 "计算机校招",每天都会更新最新的"互联网/计算机/科技类 公司" 校园招聘信息,欢迎关注! 新浪校招 | 新增岗位!抓住最后的机会 联通支付202 ...

  8. 2021届秋招—中兴面试(软件开发C++方向)

    2021届秋招-中兴面试(软件开发C++方向) 一面: 自我介绍 做题 char num[10] = {1,2,3,4,5}; char *p = num; sizeof(num) = ___? st ...

  9. 【诸神黄昏】国庆中秋双节聊2021算法秋招,附大量面经

    前言:若需获取本文全部的手书版原稿资料,扫码关注公众号,回复: 2021算法秋招 即可获取. 原创不易,转载请告知并注明出处!扫码关注公众号[AI机器学习与知识图谱],定期发布知识图谱,自然语言处理. ...

最新文章

  1. Java反射得到属性的值和设置属性的值
  2. 最强 Android Studio 使用小技巧和快捷键
  3. 电脑亮度多少对眼睛好_鲁大师性能测试多少分算好电脑?
  4. 信息学奥赛一本通C++语言——1001:Hello,World!
  5. elasticsearch使用Filter过滤查询操作(使用marvel插件)
  6. iPhone13系列预计5499起;蔚来回应31岁企业家“自动驾驶”车祸去世;小米取消MIX4防丢失模式无卡联网服务|极客头条...
  7. game with probability problem
  8. python电脑下载-PC端数据下载软件开发(Python)
  9. HTML5的革新:结构之美
  10. 白板推导系列Pytorch-高斯判别分析(GDA)
  11. MyBatis的优缺点以及特点
  12. TCPIP网络编程项目式教程(微课版)
  13. Allegro静态铜皮避让问题
  14. 小马哥-----高仿苹果6 plus刷机 详细拆机主板图与开机界面图与移植触摸屏版中文rec 界面 多图展示
  15. hp ux安装mysql5.1.56_详细讲解Linux环境下MySQL5.1安装步骤
  16. OpenCV实战(4)——像素操作
  17. cenos 解决Kernel panic – not syncing: Attempted to kill init
  18. 十五天学会Autodesk Inventor,看完这一系列就够了(二),软件界面
  19. 实训1_获取产业数据并存储_预处理与简单分析
  20. 大数据识别“爱”的羊毛党,拒绝那些它“恨”的羊毛党

热门文章

  1. SQL报错: > ORA-00918: column ambiguously defined
  2. 12. RDMA之Verbs
  3. Linux shell常用命令
  4. TensorFlow项目练手(二)——猫狗熊猫的分类任务
  5. 微信小程序picker组件的确认,取消按钮方法
  6. 埃隆·马斯克推荐的《你相信这台电脑吗?》上映,不火爆但AI威胁的论战又起(附视频地址)
  7. 文件拷贝(复制粘贴)
  8. 记录新电脑的node,vue配置和管理员权限的问题
  9. 如何给目标机器人建模并仿真【数学/控制意义】
  10. 渗透基础——通过LDAP协议暴力破解域用户的口令