
JS札记
 数字取整:
 ~~ 其实这是个按位非的运算符做了俩次
 2.33|0
 2.33>>0
 字符转数字:
 var a ='1'; +a; 它用隐式转换来的
 类型判断:
 
 parseInt范围:
 parseInt(0.0000008)//这个结果是8, 小数点后7位出错
 parseInt(10000000000023291)//20位出错
 数组去重:
 [...new Set([1, "1", 2, 1, 1, 3])]
 指定长度填充:
 以前就在想了,赶紧笔记: let aa = Array(6).fill(8) 长度6,填充8
 短路表达式:
 
 高逼格创建函数:
 
 立即执行函数:
 
浏览器安全
- xss安全,对url和内容做过滤,防止嵌入js执行代码
- csp, 通过服务器应答头或者html的META标签,限制请求源
浏览器Console命令
| 
 | 
 | 
浏览器其它
 浏览器能设置条件语句断点
 左边可以直接启动手机模式,这样就能看手机状态下的浏览情况
CSS黑魔法
浏览器缓存
强缓存:
- 当头的Cache-Control的max-age(最多有效时间)/s-maxage(代理最大有效时间) 被设置时, 用头的date和当前时间比对
- 当无 头的cache-control只有头的expires时,则用expires和当前时间对比 - 协商缓存: 
- 头有last-modiied和etag,会向服务器请求是否失效,请求包加头if-modified-since和if-none-match.
 服务器回应304浏览器就本地加载,否则重新发送数据
box-sizing
 这个属性来源于css3属性
 从里到外,margin->border->padding->content.
- content-box标准盒。height指content的高,width指content的宽 
- border-box怪异盒。height指content+padding+border的高,width指content+padding+border的高 
网上说在网页的顶部加上 doctype 声明。假如不加 doctype 声明,那么各个浏览器会根据自己的行为去理解网页。
浏览器安全
CSRF(跨站点请求伪造): 用户c打开网站a,未推出a之前,打开网站b。网站b发出请求要求访问网站a,来利用未销毁的cookie来达到攻击的目的
防范方法:
- 验证http referer字段,这个字段表示http请求来源地址
- 请求接口添加token验证
- http添加自定义属性 - XSS(跨站脚本攻击):调用web接口时,提交js代码进去,下次访问页面会执行js代码达到攻击 - 防范方法: 
- 输入数据编码处理(HTML Entity)
- 输入数据过滤
- 矫正
JS技巧
[]+{} 非primitive type(即值类型)的+运算,对于数组和object,其实都是在调用toString方法.
数组[]的toString其实就是调用.join()方法.Object转String就是[object Object](用String({})测试)
[]+{}相当于””+”[object Object]”{}+[] 会变成俩端{}和+[],一个代码段一个执行语句,由于后面是空且被隐式转换了,所以结果是0{}+{}
JS有6个假值:false null undefined 0 “” NaN
 但是它们之间并非都相等
 以下是相等的:
 false==0
 false==''
 null==undefined
 0==''
数组去重
| 
 | 
 | 
浏览器渲染和服务器渲染
浏览器端渲染,指的是用js去生成html,前端做路由。举例:React, Vue等等前端框架。适合单页面应用程序。
服务器端渲染,指的是用后台语言通过一些模版引擎生成html。举例:PHP文件、JSP文件、Python的Flask配合Jinja引擎、Django框架、Java配合vm模版引擎、NodeJS配合Jade。适合多页面应用。
 浏览器渲染过程
 DOM Tree:浏览器将HTML解析成树形的数据结构。
 CSS Rule Tree:浏览器将CSS解析成树形的数据结构。
 Render Tree: DOM和CSSOM合并后生成Render Tree。
 layout: 有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系,从而去计算出每个节点在屏幕中的位置。
 painting: 按照算出来的规则,通过显卡,把内容画到屏幕上
 过程是异步的,下载多少内容,构建多少render树
 (1)Reflow(回流):浏览器要花时间去渲染,当它发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染(要尽量避免它:操作dom 元素尺寸变化 css属性变化)。
 (2)Repaint(重绘):如果只是改变了某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的repaint,重画某一部分。 
 浏览器优化
 减少refow/repaint:
- 不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css 的 class,然后修改 DOM 的 className
- 不要把 DOM 结点的属性值放在一个循环里当成循环里的变量
- 为动画的 HTML 元件使用 fixed 或 absoult 的 position,那么修改他们的 CSS 是不会 reflow 的
- 千万不要使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局 - CSS优化 
 CSS选择符是从右到左进行匹配的。从右到左!所以,#nav li 我们以为这是一条很简单的规则,秒秒钟就能匹配到想要的元素,但是,但是,但是,是从右往左匹配啊,所以,会去找所有的li,然后再去确定它的父元素是不是#nav12345dom深度尽量浅减少inline javascript(script嵌入那种)、css的数量不要为id选择器指定类名或是标签,因为id可以唯一确定一个元素避免后代选择符,尽量使用子选择符。原因:子元素匹配符的概率要大于后代元素匹配符。后代选择符;#tp p{} 子选择符:#tp>p{}避免使用通配符- js的下载和执行会阻塞Dom树的构建 
js数组
| 
 | 
 | 
js模块加载
 commonjs:nodejs应用最多,它的require是同步的,运行时确定模块依赖关系,先加载整个模块,直接生产对象1
 再从对象上读取方法
 amd:requirejs就实现了amd规范,异步,运行时加载
 es6:编译时确定依赖关系,导出任意值