JavaScript的组成
-
JavaScript 由以下三部分组成:
JS的基本数据类型和引用数据类型
检测浏览器版本版本有哪些方式?
-
根据 navigator.userAgent // UA.toLowerCase.indexOf('chrome')
-
根据 window 对象的成员 // 'ActiveXObject' in window
介绍JS有哪些内置对象?
-
数据封装类对象:Object、Array、Boolean、Number、String
-
其他对象:Function、Arguments、Math、Date、RegExp、Error
-
ES6新增对象:Symbol、Map、Set、Promises、Proxy、Reflect
如果有想一起学习web前端,HTML5及JavaScript的可以来一下我的前端群733581373,好友都会在里面交流,分享一些学习的方法和需要注意的小细节,每天也会准时的讲一些前端的炫酷特效,及前端直播课程学习
更多网页前端开发教程,行业资讯,面试技巧,欢迎关注公众号:网页前端开发学习
说几条写JavaScript的基本规范?
-
代码缩进,建议使用“四个空格”缩进
-
代码段使用花括号{}包裹
-
语句结束使用分号;
-
变量和函数在使用前进行声明
-
以大写字母开头命名构造函数,全大写命名常量
-
规范定义JSON对象,补全双引号
-
用{}和声明对象和数组
如何编写高性能的JavaScript?
-
遵循严格模式:"use strict";
-
将js脚本放在页面底部,加快渲染页面
-
将js脚本将脚本成组打包,减少请求
-
使用非阻塞方式下载js脚本
-
尽量使用局部变量来保存全局变量
-
尽量减少使用闭包
-
使用 window 对象属性方法时,省略 window
-
尽量减少对象成员嵌套
-
缓存 DOM 节点的访问
-
通过避免使用 eval 和 Function 构造器
-
给 setTimeout 和 setInterval 传递函数而不是字符串作为参数
-
尽量使用直接量创建对象和数组
-
最小化重绘(repaint)和回流(reflow)
描述浏览器的渲染过程,DOM树和渲染树的区别?
-
浏览器的渲染过程:
-
DOM树 和 渲染树 的区别:
-
-
DOM树与HTML标签一一对应,包括head和隐藏元素
-
渲染树不包括head和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的css属性
-
更多网页前端开发教程,行业资讯,面试技巧,欢迎关注公众号:网页前端开发学习
-
重绘和回流(重排)的区别和关系?
-
重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
-
回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
-
注意:JS获取Layout属性值(如:offsetLeft、scrollTop、getComputedStyle等)也会引起回流。因为浏览器需要通过回流计算最新值
-
回流必将引起重绘,而重绘不一定会引起回流
如何最小化重绘(repaint)和回流(reflow)?
-
需要要对元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示
-
需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document
-
缓存Layout属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
-
尽量避免用table布局(table元素一旦触发回流就会导致table里所有的其它元素回流)
-
避免使用css表达式(expression),因为每次调用都会重新计算值(包括加载页面)
-
尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
-
批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx
script 的位置是否会影响首屏显示时间?
-
在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script的位置不影响首屏显示的开始时间。
-
浏览器解析 HTML 是自上而下的线性过程,script作为 HTML 的一部分同样遵循这个原则
-
因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间
解释JavaScript中的作用域与变量声明提升?
-
JavaScript作用域:
-
-
在Java、C等语言中,作用域为for语句、if语句或{}内的一块区域,称为作用域;
-
而在 JavaScript 中,作用域为function{}内的区域,称为函数作用域。
-
-
JavaScript变量声明提升:
-
-
在JavaScript中,函数声明与变量声明经常被JavaScript引擎隐式地提升到当前作用域的顶部。
-
声明语句中的赋值部分并不会被提升,只有名称被提升
-
函数声明的优先级高于变量,如果变量名跟函数名相同且未赋值,则函数声明会覆盖变量声明
-
如果函数有多个同名参数,那么最后一个参数(即使没有定义)会覆盖前面的同名参数
-
介绍JavaScript的原型,原型链?有什么特点?
-
原型:
-
原型链:
-
原型特点:
-
-
JavaScript对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变
-
JavaScript有几种类型的值
-
引用数据类型(对象、数组和函数)-- 堆
-
两种类型的区别是:存储位置不同:
-
原始数据类型是直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据;
-
引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;
-
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
-
当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
谈谈this对象的理解
-
this 总是指向函数的直接调用者
-
在事件中,this指向触发这个事件的对象
-
IE下 attachEvent 中的this总是指向全局对象Window
eval是做什么的?
eval的功能是把对应的字符串解析成JS代码并运行
-
应该避免使用eval,不安全,非常耗性能(先解析成js语句,再执行)
-
由JSON字符串转换为JSON对象的时候可以用 eval('('+ str +')');
什么是 Window 对象? 什么是 Document 对象?
-
Window 对象表示当前浏览器的窗口,是JavaScript的顶级对象。
-
我们创建的所有对象、函数、变量都是 Window 对象的成员。
-
Window 对象的方法和属性是在全局范围内有效的。
-
Document 对象是 HTML 文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)
-
Document 对象使我们可以通过脚本对 HTML 页面中的所有元素进行访问
-
Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问
介绍 DOM 的发展
-
DOM:文档对象模型(Document Object Model),定义了访问HTML和XML文档的标准,与编程语言及平台无关
-
DOM0:提供了查询和操作Web文档的内容API。未形成标准,实现混乱。如:document.forms['login']
-
DOM1:W3C提出标准化的DOM,简化了对文档中任意部分的访问和操作。如:JavaScript中的Document对象
-
DOM2:原来DOM基础上扩充了鼠标事件等细分模块,增加了对CSS的支持。如:getComputedStyle(elem, pseudo)
-
DOM3:增加了XPath模块和加载与保存(Load and Save)模块。如:XPathEvaluator
介绍DOM0,DOM2,DOM3事件处理方式区别
-
DOM0级事件处理方式:
-
-
btn.onclick = func;
-
btn.onclick = null;
-
-
DOM2级事件处理方式:
-
-
btn.addEventListener('click', func, false);
-
btn.removeEventListener('click', func, false);
-
btn.attachEvent("onclick", func);
-
btn.detachEvent("onclick", func);
-
-
DOM3级事件处理方式:
-
-
eventUtil.addListener(input, "textInput", func);
-
eventUtil 是自定义对象,textInput 是DOM3级事件
-
事件的三个阶段
-
捕获、目标、冒泡
介绍事件“捕获”和“冒泡”执行顺序和事件的执行次数?
-
按照W3C标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段
-
事件执行次数(DOM2-addEventListener):元素上绑定事件的个数
-
-
注意1:前提是事件被确实触发
-
注意2:事件绑定几次就算几个事件,即使类型和功能完全一样也不会“覆盖”
-
-
事件执行顺序:判断的关键是否目标元素
-
-
非目标元素:根据W3C的标准执行:捕获->目标元素->冒泡(不依据事件绑定顺序)
-
目标元素:依据事件绑定顺序:先绑定的事件先执行(不依据捕获冒泡标准)
-
最终顺序:父元素捕获->目标元素事件1->目标元素事件2->子元素捕获->子元素冒泡->父元素冒泡
-
注意:子元素事件执行前提 事件确实“落”到子元素布局区域上,而不是简单的具有嵌套关系
-
在一个DOM上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?
-
该DOM上的事件如果被触发,会执行两次(执行次数等于绑定次数)
-
如果该DOM是目标元素,则按事件绑定顺序执行,不区分冒泡/捕获
-
如果该DOM是处于事件流中的非目标元素,则先执行捕获,后执行冒泡
事件的代理/委托
-
事件委托是指将事件绑定目标元素的到父元素上,利用冒泡机制触发该事件
-
-
优点:
-
-
-
可以减少事件注册,节省大量内存占用
-
可以将事件应用于动态添加的子元素上
-
-
-
缺点:
-
使用不当会造成事件在不应该触发时触发
最后,如果有想一起学习web前端,HTML5及JavaScript的可以来一下我的前端群733581373,好友都会在里面交流,分享一些学习的方法和需要注意的小细节,每天也会准时的讲一些前端的炫酷特效,及前端直播课程学习
如果想看到更加系统的文章和学习方法经验可以关注的微信号:‘web前端技术圈’或者‘webxh6’关注后回复‘2018’可以领取一套完整的学习视频