go/back/forward、JS数据类型、符号、node.js模块引入机制、浏览器渲染/回流/重绘、闭包、事件方法、原型、JS运算

1. window.history.go、window.history.back、window.history.forward的区别和联系?
window.history.go(-1) //返回+刷新页面
window.history.back() //返回(单纯地返回上一页)

window.history.go(0) //刷新当前页面

window.history.go(1) //前进
window.history.forward() //前进

2. JS数据类型有哪些?
基本数据类型:undefined、null、Number、Boolean、String、Symbol(ES6)。
引用数据类型:Object,其包含Function、Date、Array(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)。
其他:BigInt(谷歌67)。

①undefined(未定义):表示变量未初始化,属性不存在,函数没有返回值。

②null(空值):表示变量为空值。

③Boolean(布尔值):true 或 false。

④String(字符串):单引号字符串 ‘’ 或 双引号字符串 “”。

⑤Number(数值):范围 [-2^53, 2^53]。

⑥Object(对象):表示属性的集合,其中每个属性由“名/值对”构成。

⑦Symbol(符号):表示独一无二(ES6)。

⑧BigInt:安全存储,操作大整数(谷歌67)。

3. js中某些符号的意义

^ : 匹配字符串的开头;
$ : 匹配字符串的结尾;
 1. ; 出现零次到多次;
 2. :出现一次到多次;
?: 出现零次或一次;
. : 除了\n以外的任意字符
{n} : 出现n次;
{n,m}: 出现n到m次;
{n,}: 出现n次到多次

4. node.js模块引入机制
点此查看详解
首先,优先加载核心模块(CORE MODULES);

其次,按照相对路径/绝对路径加载文件模块(加载顺序,首先试图按照路径查找 .js 扩展名的文件,如果没有,试图按照路径查找 .json 扩展名的文件,如果还是没有,就按照路径查找 .node 扩展名的c++模块了);

最后,搜索node_modules目录下通过npm下载的第三方模块。
在这里插入图片描述
5. 浏览器渲染页面原理、reflow(回流)、repaint(重绘)
浏览器渲染页面过程
(1)用户输入网址,浏览器向服务器发出HTTP请求,服务器返回 HTML 文件;(善用缓存,减少HTTP请求,减轻服务器压力)
(2)浏览器载入 HTML 代码,发现 <head> 内有一个 <link> 引用外部 CSS 文件,则浏览器立即发送CSS文件请求,获取浏览器返回的CSS文件;(CSS文件合并,减少HTTP请求)
(3)浏览器继续载入 HTML 中 部分的代码,并且 CSS 文件已经拿到了,可以开始渲染页面了;(CSS文件需要放置最上面,避免网页重新渲染)
(4)浏览器在代码中发现一个 <img> 标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;(图片文件合并,减少HTTP请求)
(5)服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;(最好图片都设置尺寸,避免重新渲染)
(6)浏览器发现了一个包含一行 JavaScript 代码的 <script> 标签,会立即运行该js代码;(script最好放置页面最下面)
(7)js脚本执行了语句,它令浏览器隐藏掉代码中的某个 <div>,突然就少了一个元素,浏览器不得不重新渲染这部分代码;(页面初始化样式不要使用js控制)
(8)终于等到了 </html> 的到来,浏览器泪流满面……
(9)等等,还没完,用户点了一下界面中的“换肤”按钮,JavaScript 让浏览器换了一下 <link> 标签的 CSS 路径;
(10)浏览器召集了在座的各位 <div><span><ul><li> 们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

影响页面渲染速度的主要有reflow、repaint。
reflow(回流)
  当我们打开一个页面时,浏览器就要去渲染这个页面,尤其是当它发现某个部分发生了一些变化影响了布局,需要倒回去重新渲染,这个过程就叫做reflow(回流)。

  reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的reflow。鼠标滑过、点击…只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,他们都彼此相互影响着。

  reflow 是导致DOM脚本执行低效的关键元素之一。页面上任何一个结点触发reflow,都会导致它的子结点及祖先结点重新渲染。

  那么在哪些情况下会导致reflow发生?
  (1)改变窗口大小
  (2)改变文字大小
  (3)添加/删除样式表
  (4)内容的改变,如用户在输入框输入内容
  (5)激活伪类,如:hover(IE里是一个兄弟结点的伪类被激 活)
  (6)操作class属性
  (7)脚本操作DOM
  (8)计算offsetWidth和offsetHeight
  (9)设置style属性

  怎样应对reflow,将reflow对性能的影响减到最小?
  (1)尽可能限制reflow的影响范围。需要改变元素的样式,不要通过父级元素影响子元素,最好直接加在子元素上。
  (2)通过设置class的方式改变结点样式。(如果通过设置style属性,每设置一次都会导致一次reflow)
repaint(重绘)
  如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint(重绘)。
比较
repaint的速度明显快于reflow或者reflow要比repaint更缓慢(IE)。
本段内容转载自该链接

6. JS中的offsetWidth、offsetHeight、clientWidth、clientHeight等等的详细介绍
点此查看下图中各个属性详解
在这里插入图片描述
7.javascript闭包详解
理解下面两段代码的输出:

代码片段一:
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());

代码片段二:
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());

代码片段一:这里把立即执行的括号去掉输出一下就很清楚了,我的理解是这个demo里没有闭包,只是单纯的把最里面的函数拿到全局环境下执行了一下,这里的this是在全局环境下。

代码片段二:这里因为有一个that,所以它需要依赖getNameFunc这个函数,就形成了一个闭包,局部变量会一直在内存中,that点的就是局部变量的值。

点此查看详解

8.几个常见的事件方法
preventDefault() 取消事件默认行为,如阻止点击提交按钮时对表单的提交

stopImmediatePropagation() 取消事件冒泡同时阻止当前节点上的事件处理程序被调用,影响当前的事件执行

stopPropagation() 取消事件冒泡,不影响事件执行

cancelBubbe() 取消事件冒泡(IE)

returnValue() 取消事件默认行为(IE)

9.js原型详解
js原型遵循5个规则
1、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外);
2、所有的引用类型(数组、对象、函数),都有一个__proto__(隐式原型)属性,属性值是一个普通的对象;
3、所有的函数,都有一个prototype(显式原型)属性,属性值也是一个普通对象;
4、所有的引用类型(数组、对象、函数),__proto__属性值指向(完全相等)它的构造函数的“prototype”属性值;
5、当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去__proto__(即它的构造函数的prototype中)寻找。
点此查看详解

10.JS运算

1. 取余 %
console.log(10 % 3); //1
2. 除法 /
console.log(10 / 3); //3.3333333333333335
3. 
(1)取整(保留整数部分)
parseInt(10 / 3); //3
(2)向上取整(有小数就舍弃小数,整数部分加一)
Math.ceil(10 / 3); //4
(3)向下取整(有小数就舍弃小数)
Math.floor(10 / 3); //3
4. 四舍五入
(1)小数部分为0.5
Math.round(3.5); //4
Math.round(-3.5); //-3(向上舍入)
(2)其他情况为正常的四舍五入
Math.round(3.4); //3
Math.round(3.6); //4

Math.round(-3.4); //-3
Math.round(-3.6); //-4
5. 按位取反 ~
(1)整数:用-1减去要取反的数即可
~4 //-5(-1-4)
~(-4) //3(-1-(-4))
(2)小数:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值