1、浏览器都包含哪些进程?
1)Browser进程:浏览器的主进程(负责协调、主控),只有一个。作用有:
a、负责浏览器界面显示,与用户交互。如前进,后退等;
b、负责各个页面的管理,创建和销毁其他进程;
c、网络资源的管理,下载等。
2)第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建
3)GPU进程:最多一个,用于3D绘制等
4)浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的):默认每个Tab页面一个进程,互不影响。主要作用为页面渲染,脚本执行,事件处理等。
Renderer进程,也就是我们每个标签页所拥有的进程,互不影响,负责页面渲染,脚本执行,事件处理等。
浏览器内核,即我们的渲染进程,有名Renderer进程,内部是多线程的。我们页面的渲染,js脚本执行,事件的循环都在这一进程内进行,也就是说,该进程下面拥有着多个线程,靠着这些现成共同完成渲染任务。
a、图形用户界面GUI渲染线程:负责渲染浏览器界面,包括解析HTML、CSS、构建DOM树、Render树、布局与绘制等。当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。
b、JS引擎线程:JS内核,也称JS引擎,负责处理执行javascript脚本。浏览器无论什么时候都只有一个JS引擎在运行JS程序。
c、事件触发线程:会将对应任务添加到事件线程中。当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。
d、定时触发器线程:setInterval与setTimeout所在线程。定时计时器并不是由JS引擎计时的,因为如果JS引擎是单线程的,如果JS引擎处于堵塞状态,那会影响到计时的准确。当计时完成被触发,事件会被添加到事件队列,等待JS引擎空闲了执行。
e、异步HTTP请求线程:在XMLHttpRequest在连接后新启动的一个线程。线程如果检测到请求的状态变更,如果设置有回调函数,该线程会把回调函数添加到事件队列,同理,等待JS引擎空闲了执行
2、Web Worker
JavaScript语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。
Web Worker的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。
Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。
主线程采用new命令,调用Worker()构造函数,新建一个 Worker 线程。Worker()构造函数的参数是一个脚本文件,该文件就是 Worker 线程所要执行的任务。由于 Worker 不能读取本地文件,所以这个脚本必须来自网络。如果下载没有成功(比如404错误),Worker 就会默默地失败。
主线程调用worker.postMessage()方法,向 Worker 发消息。参数,就是主线程传给Worker 的数据。它可以是各种数据类型,包括二进制数据
主线程通过worker.onmessage指定监听函数,接收子线程发回来的消息。事件对象的data属性可以获取 Worker 发来的数据。
Worker 完成任务以后,主线程就可以把它关掉。worker.terminate();
Worker 线程
3、JSON.stringify()
JSON.stringify()方法将一个 JavaScript 对象或值转换为 JSON 字符串。
注意:1、非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
2、布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
3、undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成null(出现在数组中时)。
4、函数、undefined 被单独转换时,会返回 undefined;NaN 和 Infinity 格式的数值及 null 都会被当做 null。
4、es5和es6的区别
1)ES5新增
a、strict严格模式;
b、Array方法:every、some 、forEach、filter 、indexOf、lastIndexOf、isArray、map、reduce、reduceRight方法;
c、Object方法:Object.getPrototypeOf、Object.create、Object.getOwnPropertyNames、Object.defineProperty、Object.getOwnPropertyDescriptor、Object.defineProperties、Object.keys、Object.preventExtensions / Object.isExtensible、Object.seal / Object.isSealed、Object.freeze / Object.isFrozen等。
2)ES6新增
a、块级作用域:let、常量const;
b、赋值解构;
c、函数参数:默认值、参数打包、 数组展开(Default 、Rest 、Spread);
d、箭头函数;
e、Iterators(迭代器)+ for..of;
f、Class:constructor、extends、super;
g、Map + Set + WeakMap + WeakSet
H、Symbols | Promise等。
5、不使用第三个变量得情况下交换两个变量得值
第一种:a=a+b;b=a-b;a=a-b;
第二种:a=a^b;b=a^b;a=a^b;
6、HTML引入js的方式
内部引入:需要一个标签<script></script>。
外部引入:创建一个独立的外部 js 文件, 用 <script></> 标签引入. 使用他的src 属性引用对应的Js文件。
7、ES6的 Class 类
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。class 的本质是 function。
注意要点:a、不可重复声明。
b、类定义不会被提升,必须在访问前对类进行定义,否则就会报错。
c、类中方法不需要 function 关键字。
d、方法间不能加分号。
1)类的主体
a、属性:静态属性(static 关键字定义);
公共属性(在类的原型prototype上定义的);
name属性(返回跟在class后的类名(存在时))。
b、方法:constructor 方法是类的默认方法,创建类的实例化对象时被调用。
静态方法(static 关键字定义);
原型方法。
8、衬线字体和非衬线字体区别
衬线字体:文字边缘有修饰的字体;在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。适用于传统的印刷体,易读性高。
非衬线字体:文字边缘没有修饰的字体,笔画的粗细差不多。适合于标题海报等需要醒目的地方。
font-family属性设置时,为了匹配不同环境下的字体,可以书写多个值。其中,为了使得页面在用户电脑上没有任何其他字体安装的情况下也显示得较为好看,可以加上sans-serif,表示由计算机自动选择默认的非衬线字体进行渲染(计算机操作系统都分别会有一种默认的衬线字体和非衬线字体)
9、Javascript组成
JavaScript的实现包括以下3个部分:
1)ECMAScript(核心):描述了JS的语法和基本对象。
2)文档对象模型 (DOM):处理网页内容的方法和接口
3)浏览器对象模型(BOM):与浏览器交互的方法和接口
10、JavaScript和java c c++的区别
Java是强类型的语言;JavaScript是弱类型的语言。
Java、C、C++是编译型语言,需要编译器编译成本地可执行程序后才能运行;JavaScript解释性语言,像,开发语言写好后直接将代码交给用户,用户使用脚本解释器将脚本文件解释执行。
11、在js中0.1+0.2===0.3吗?如果不相等如何解决?
在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为false。
那么应该怎样来解决0.1+0.2等于0.3呢? 最好的方法是设置一个误差范围值,通常称为”机器精度“。而对于Javascript来说,这个值通常是2^-52,而在ES6中,已经为我们提供了这样一个属性:Number.EPSILON,而这个值正等于2^-52。这个值非常非常小,在底层计算机已经帮我们运算好,并且无限接近0,但不等于0。
这个时候我们只要判断(0.1+0.2)-0.3小于Number.EPSILON,在这个误差的范围内就可以判定0.1+0.2===0.3为true。
我们还要考虑解决IE的不兼容问题。我们需要对于Number.EPSILON进行一个改写。
12、Javascript异步编程的4种方法
回调函数、事件监听、发布/订阅、Promises对象
网友评论