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:编译时确定依赖关系,导出任意值