本帖最后由 逆风TO 于 2018-7-30 12:42 编辑
公司名称:西安邦途国旅 公司地址:西安市未央区太元路君诚国际20层 公司官网:http://www.xabtly.com
该公司是一家旅游服务公司,主要运营一个旅游在线网站,目前他们准备对他们现有的网站进行升级开发,并准备推出移动网页版,正在组件开发团队 以下为技术面试环节部分问题整理: Q:js是单线程还是多线程 A:javacript是一门单线程的语言
Q:js中使怎么实现异步操作的? A:js的主线程负责执行栈内存中的代码, 当遇到相对耗时的操作或需要操作一些webAPI的时候,如ajax,setTimeout,setInterval等,会有浏览器启动一个进程去执行这些操作,执行完毕或会将回调函数之类的放到一个事件队列里面,然后会有一个loop循环负责将事件队列里面的回调函数拿到栈内存,让js解析器的主线程去执行 Q:简单描述一下浏览器渲染页面的过程 A:1、首先获取html,然后构建dom树 2、其次根据css构建render树,render树中不包含定位和几何信息 3、最后构建布局数,布局是含有元素的定位和几何信息
Q:let和var声明的变量有何异同? A:let是es6中声明变量的新语法结构, Let声明的变量存在{}作用域,比如在{}内部声明的变量在{}外部是不能访问的 Var声明的变量默认是没有{}作用域的,只存在函数作用域(在函数内部声明的变量,在函数外部无法访问) Let声明的变量不存在变量声明提升,也就是必须先声明,再使用,否则报错 Var声明的变量存在变量声明提升,可以在声明之前使用,但是变量的赋值没有提升,会返回undefined
Q:什么是浏览器回流和重构 A:浏览器的重构指的是改变每个元素外观时所触发的浏览器行为,比如颜色,背景等样式发生了改变而进行的重新构造新外观的过程。重构不会引发页面的重新布局,不一定伴随着回流。 回流指的是浏览器为了重新渲染页面的需要而进行的重新计算元素的几何大小和位置的,他的开销是非常大的,回流可以理解为渲染树需要重新进行计算,一般最好触发元素的重构,避免元素的回流;比如通过通过添加类来添加css样式,而不是直接在DOM上设置,当需要操作某一块元素时候,最好使其脱离文档流,这样就不会引起回流了,比如设置position:absolute或者fixed,或者display:none,等操作结束后在显示。 Q:什么是同步,什么是异步 A: 同步:指下一个程序的执行需要等到上一个程序执行完毕,也就是得出结果后下一个才能执行, 异步:指的是上一个程序执行后,下一个程序不用等到上一个程序出结果就能执行,等上一个程序执行出结果了调用回调函数处理结果就好。
Q:怎么理解JavaScript的值类型和引用类型 A:JavaScript有两种类型的数据,值类型和引用类型,一般的数字,字符 串,布尔值都是值类型,存放在栈中,而对象,函数,数组等是引用类型,存放在堆中,对引用类型的复制其实是引用复制,相当于复制着内存地址,对象本身并没有真正的复制。
Q:谈谈对前端模块化的理解 A:前端模块话就是把复杂的文件分成一个个独立的模块,比如js文件,分成独立的模块之后有利于代码的重用和维护,但是这样又会引来模块与模块之间的依赖问题,所以就有了 CommonJS、AMD、CMD规范,CommonJS是nodejs遵循的一个模块化规范,最后出现了webpack,webpack就是前端模块话的一种解决方案 Q:怎么准确的判断一个复杂数据类型的具体类型? A:可以利用Object.prototype.toString.call()精确判断数据类型,如下: 函数类型 Function fn(){console.log(“test”);} Object.prototype.toString.call(fn);//”[object Function]” 日期类型 var date = new Date(); Object.prototype.toString.call(date);//”[object Date]” 数组类型 var arr = [1,2,3]; Object.prototype.toString.call(arr);//”[object Array]” 正则表达式 var reg = /[hbc]at/gi; Object.prototype.toString.call(arr);//”[object Array]”
|