摘要:比如如果不使用构造函数,则和是对象的方法,两个方法的作用是一样的谁谁,就把指向谁。,本题提到了冒泡算法,那么就认为不是要使用原生的方法,要自己封装一个类似功能的方法或称函数。就是通过中构造函数原型链继承的方式来实现的。
❤,es6中的高级数据结构set和map的使用以及与es5中旧有的obj、array等结构的差别?
(1) Set构建函数可以接受一个数组作为初始化参数
var s = new Set([1,2,3,4,"1","2","3","4"]);
(2) 有以下方法:add、delete、has、clear 作用如其名
(3) 可以用Array.from方法将Set结构转换为数组结构
var items = new Set([1,2,3,4,5]); var new_array = Array.from( items );
(4) Set中每个元素只存在一个key
(4) es5中js对象只可以使用字符串充当key值,一定程度上有限制。而Map结构就是为了解决这一问题。
(5) 可以接受一个二维数组作为初始化参数
var s = new Map([["name","小明"],["title","Author"]]) //map.size //2 //map.has("name") //true //map.get("name") //小明
❤,js中的this,比如es6箭头函数中的this
比较基础的来讲,就是“指函数执行时,它的上一级对象,如果没有上一级对象,则为最高层Window”。
当然1,需要区分strict模式,因为在strict模式中,this不会指到window,而是undefined。比如:
function abc(){ console.log(this); } 或 var abc = function (){ console.log(this); } abc(); //非严格模式下返回 Window //严格模式下返回 undefined
2,es6中箭头函数会有所差异:"箭头函数中的this,继承父级执行上下文"。在定义的时候就已经被决定了,无论使用apply还是call都无法改变。(其实这个改变主要意义是为了向静态化靠拢,因为大多数语言,比如java、php中的this,即和箭头函数中的this指向一样,而es5中非new+构造函数创建的函数的this,太特殊了),例子:
es5中: var x=11; var obj={ x:22, say:function(){ console.log(this.x) } } obj.say(); //22 而在es6中 var x=11; var obj={ x:22, say:()=>{ console.log(this.x); } } obj.say(); //11
3,有一些方法可以改变this的指向,比如new+构造函数方式,比如apply与call等。比如:
var a=11 function test1(){ a=22; let b=function(){ console.log(this.a); }; b(); } var x = new test1();//22 如果不使用构造函数,则: var a=11 var test1 = { a:22, b:function(){ console.log(this.a); } } var x = test1.b; console.log(x());//11
//call和apply是Function对象的方法,两个方法的作用是一样的: //call谁,apply谁,就把this指向谁。 //call与apply的区别就在于call的参数需要一个个传,而apply接受一个数组作为参数。 window.color = "red"; document.color = "yellow"; var s1 = {color: "blue" }; function changeColor(){ console.log(this.color); } changeColor.call(); //red (默认传递参数) changeColor.call(window); //red changeColor.call(document); //yellow changeColor.call(this); //red changeColor.call(s1); //blue
参考:https://www.cnblogs.com/pssp/... -https://blog.csdn.net/liwusen... - https://blog.csdn.net/ganying...
❤,前端开发几种设计模式的概念,及典型使用场景。参考:http://garychang.cn/2017/01/1...
1,单例模式:声明一个类,在其中使用闭包,那么这个类中的变量是一直存在于内存中的,每次实例化这个类,都会去判断内存中该类是否存在,即成为单例。参考,https://www.cnblogs.com/yongl...
2,观察者模式:设计该模式背后的主要动力是促进形成松散耦合。在这种模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象的特定活动并在状态改变后获得通知。参考,https://www.cnblogs.com/haoyi...
3,工厂模式。
4,装饰者模式。
and so on..
❤,mvvm和mvc的架构模式的概念和区别
(1) mvc:Model-View-Controller。 model是数据,view是用户视图层,controller是逻辑处理层。
(2) mvvm:Model-View-ViewModel。彻底切断model和view层的联系,使用双向绑定进行交互,view层如果修改,model层会修改,反之也会发生修改。比如AngularJs
❤,请写出从"在浏览器输入域名"到"页面静态资源完全加载"的整个过程
https://www.cnblogs.com/daiji... - https://segmentfault.com/a/11...
注:我注意到这里是问"页面静态资源完全加载",而不是"浏览器接收数据",所以需要把浏览器解析html代码的过程也详述进来,即引发面试官下一问题..
❤,浏览器加载文件的方式(js是在所有静态文件下载完之后运行,还是下载完js即刻运行?2,加载方式和js、css等一样吗)
https://segmentfault.com/a/11...
❤,冒泡排序算法将以下数组 var a = [B,A,E,C,D] 排序成a = [A,B,C,D,E]
1,冒泡算法的思想是:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置。
2,使用string.charCodeAt()方法来判断一个字符的ASCII码数值。从A-Z,依次增加。
3,本题提到了"冒泡算法",那么就认为不是要使用javascript原生的sort()方法,要自己封装一个类似功能的方法或称函数。
4,封装冒泡算法如下:
function sortage (arr) { for (let i = 0;iarr[j].charCodeAt(0)){ let temp_l = arr[j]; let temp_r = arr[i]; arr[i] = temp_l; arr[j] = temp_r; } } } return arr; } let sampleArr = ["E","A","C","F","B","D"]; sortage(sampleArr);//["A","B","C","D","E","F"]
❤,组件化思想是什么意思,实际应用场景如何?与之相对应的典型前端架构思想是什么?二者有何区别?
参考:https://www.jianshu.com/p/944...
❤,大概了解一下移动开发的几种css布局,比如css3新标准的flexible布局和grid布局等等
1,css2.1中的布局方式:
1)block布局:为了展示文档流。 2)inline布局:为了展示文本。 3)table布局:为了展示2D信息信息。 4)定位布局:为了非常直接地定位元素而设计出来的布局模式,定位元素基本与其他元素无关。
2,css3中引入了新的布局模式:伸缩布局,是为了呈现复杂的应用与页面而设计出来的。
3,一个伸缩布局,即Flexbox是由一个伸缩容器(flex containers)和在这个容器里的伸缩项目(flex items)组成。
4,常见属性:
1,flex-direction: row | row-reverse | column | column-reverse;决定浮动方向是横向还是纵向。 2,flex-wrap: nowrap | wrap 决定是否换行显示 3,flex-flow:|| 4,justify-content: flex-start | flex-end | center | space-between | space-around;项目在主轴上的对齐方式(主轴究竟是哪个轴要看属性flex-direction的设置了), 5,flex: 比例占用。举例: .main { width: 600px; } .left { flex: 1; } .right { flex: 2; } 是表示中间宽度为定宽600px,.left与.right按照1:2的比例占用flex container的剩余全部空间
参考:https://www.cnblogs.com/xuyun...
❤,React组件的生命周期
总体上分为三个状态,以及分布于其中的钩子:
1,实例化(挂载) getDefaultProps getInitialState componentWillMount render componentDidMount 2,存在期(运行) componentWillReceiveProps shouldComponentUpdate componentWillUpdate render componentDidUpdate 3,销毁&清理期 componentWillUnmount
参考:http://react-china.org/t/reac...
❤,React可控组件和非可控组件分别是什么区别,一般使用场景是什么
❤,页面加载速度优化方法。倘若有1000万用户反映网页显示很"卡"(大于3s),如何针对此情况立项排查?
❤,前端安全有了解吗。
常见的前端安全问题:
1,xss: 跨域脚本攻击 a,反射形:主要依靠站点服务端返回脚本,在客户端触发执行从而发起Web攻击。前端应对方案主要就是要过滤转义后台传过来的标签,比如script标签,以及标签属性,比如onerror等属性。后端反向一致。 b,存储型:https://segmentfault.com/a/1190000011459463#articleHeader3 2,csrf: 跨站请求伪造 https://segmentfault.com/a/1190000011459463#articleHeader4
参考:https://segmentfault.com/a/11...
❤,AngularJs中双向绑定的实现原理?脏值检测呢?
双向绑定是mvvm框架的核心特点。angular作为经典mvvm框架,它内部封装了各种事件,例如click, settimeout,xhr response等。在其中触发$digest循环,这个循环里会遍历$watch列表,只要其中有值发生改变,$digest就会递归触发,比较旧值和新值,直到没有值发生改变,完成最后一次$digest循环。这个时候更新视图,使其与数据模型一致。脏值检测的实现原理也在其中,只要$digest循环在进行,那么就存在$dirty脏值。
❤,AngularJs中依赖注入的实现原理?html伪属性指令呢?
依赖注入(Dependency Injection,简称DI)是c#、java等语言框架设计原则中"控制反转"的典型案例。angular把它引入到js中。它实际工作的原理如下:
1,得到函数的依赖项(即参数) 使用Function.prototype.toString,得到函数的源码字符串,然后解析其中的依赖项. 2,查找依赖项所对应的对象。 在angular的一个对象数组中找到这个对象即可 3,执行时注入: 通过 fn.apply方法把执行上下文,和依赖列表传入函数并执行
angular指令本质上是对html的补充扩展。在angular运行的过程中,会启动一个叫$compile的服务,这个服务会对dom树进行遍历,找到树上所有的指令名,并且对应运行。
参考:https://www.cnblogs.com/etoah... -
❤,讲一下你理解的promise。
Promise的诞生其实一开始是为了加强node后台可读性的:因为nodeJs以丰富的异步处理而提高效率著称,但是过多的异步操作会降低代码的可读性,于是在es6版本中Promise应运而生。
一般表示形式:
new Promise( function(resolve, reject) { if (/* success */) { // ...执行代码 resolve(); } else { /* fail */ // ...执行代码 reject(); } } );
方法:
1,Promise.prototype.then() 2,Promise.prototype.catch() and so on..
关于promise的resolve和reject以及promise状态:
如果then()方法中返回了一个参数值,那么返回的Promise将会变成接收状态。 如果then()方法中抛出了一个异常,那么返回的Promise将会变成拒绝状态。 如果then()方法调用resolve()方法,那么返回的Promise将会变成接收状态。 如果then()方法调用reject()方法,那么返回的Promise将会变成拒绝状态。 如果then()方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。
❤,Babel是如何编译es6中的class的。
就是通过es5中 构造函数 + prototype原型链 继承的方式来实现的。
参考:https://segmentfault.com/a/11...
❤,ES6中数组和对象新增的常用操作方法。
❤,Jquery(或zepto)和Angular源码经典部分解析。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95444.html
摘要:有趣的是,实际上并没有将事件附加到子节点本身。将使用单个事件监听器监听顶层的所有事件。这对于性能是有好处的,这也意味着在更新时,不需要担心跟踪事件监听器。 ❤,调用 setState 之后React内部发生了什么? 将传递给setState的对象和当前对象合并,将触发和解过程,react构建一个新的react树,并且进行diff对比,在绝对必要的情况触发组件渲染。 参考:https:/...
摘要:有趣的是,实际上并没有将事件附加到子节点本身。将使用单个事件监听器监听顶层的所有事件。这对于性能是有好处的,这也意味着在更新时,不需要担心跟踪事件监听器。 ❤,调用 setState 之后React内部发生了什么? 将传递给setState的对象和当前对象合并,将触发和解过程,react构建一个新的react树,并且进行diff对比,在绝对必要的情况触发组件渲染。 参考:https:/...
摘要:有趣的是,实际上并没有将事件附加到子节点本身。将使用单个事件监听器监听顶层的所有事件。这对于性能是有好处的,这也意味着在更新时,不需要担心跟踪事件监听器。 ❤,调用 setState 之后React内部发生了什么? 将传递给setState的对象和当前对象合并,将触发和解过程,react构建一个新的react树,并且进行diff对比,在绝对必要的情况触发组件渲染。 参考:https:/...
阅读 3456·2021-11-25 09:43
阅读 2604·2021-09-22 15:54
阅读 589·2019-08-30 15:55
阅读 973·2019-08-30 15:55
阅读 1997·2019-08-30 15:55
阅读 1740·2019-08-30 15:53
阅读 3464·2019-08-30 15:52
阅读 2038·2019-08-30 12:55