永不止步
我爱学习,学习使我快乐。
Web 开发较复杂,因为涉及的面比较多且分散,但大部分都是一句话能说完的事。
希望可以刀刀见血,招招致命。
语义化标签,识别性更高、利于 SEO 和开发过程;
新能力:Video、Audio、Canvas...
clear
属性: left、right、bothoverflow:hidden
overflow: hidden
为什么能清除浮动overflow:hidden
本意是溢出隐藏,但浏览器需要知道该显示多少才能隐藏剩下的,默认高度又是 auto,所以浮动的元素都会被计算为父元素的高度,顺带就实现了清除浮动的目的。
副作用:脱离文档流的元素,超出部分可能会被隐藏。
content-box
和 border-box
的区别content-box
默认值,W3C 标准盒模型,不包含边框和内边距border-box
原 IE 模型,包含边框和内边距默认 content-box
,可通过 box-sizing
指定。
垃圾标记
垃圾回收
Cache-Control
指定过期时间、缓存状态、选项,优先级高于 ExpiresExpires
1.0 协议中的头,指定缓存过期时间Last-modified
服务端资源最后变更时间,若资源未变更会返回 304If-Modified-Since
向服务端请求本地资源和远程资源的一致性(判断修改时间)If-None-Match
向服务端请求本地资源和远程资源的一致性(判断 hash 值)ETag
标识资源状态的随机串Last-modified
标注的修改时间只能精确到秒级,是以时间为单位,一秒内修改多次的话就无法判断了Last-modified
字段而频繁被更新Last-modified
的时间会受生产环境(服务器、代理服务器)影响,不是百分百准确真实生产中推荐使用 ETag
,同时也可以与 Last-modified
一同使用,浏览器会优先验证 ETag
,才会继续比对 Last-Modified
,最后才决定是否返回 304。
Content-Type
var
let
const
的区别var
作用域声明置顶,只有全局、函数两种作用域let
不置顶,大括号为作用域、块级作用域const
声明必须赋值,指针不可变,引用数据可变引用类型的数据被重新引用时不会复制数据,而是将指针指向之前的数据地址。
如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。 相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
undefined
与 null
的区别基本同义,但不完全同义。
由于运算中的隐式转换会导致,null
被转为 0,无法捕获错误节点,于是诞生了 undefined
。
null
原始类型 Null
的唯一值,表示:空数据,转为数字时为 NaN
undefined
原始类型 Undefined
的唯一值,派生自 Null
类型,表示:缺少值(与预期不符),转为数字时为 0Math
这样的C#
里的东西本质上,闭包是将函数内部和函数外部连接起来的一座桥梁。
缺陷:
尽头应该指向全局 window global,作用域的本质是就近原则,即访问作用路链最近的数据。
当前执行上下文环境。
var cloneObj = function (obj) {
var str,
newobj = obj.constructor === Array ? [] : {};
if (typeof obj !== "object") {
return;
} else if (window.JSON) {
(str = JSON.stringify(obj)), //系列化对象
(newobj = JSON.parse(str)); //还原
} else {
for (var i in obj) {
newobj[i] = typeof obj[i] === "object" ? cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
^
匹配开头$
匹配结尾*
匹配前面元字符 0 次或多次+
匹配前面元字符 1 次或多次?
匹配前面元字符 0 次或 1 次(x)
匹配 x 保存 x 在名为$1...$9 的变量中x|y
匹配 x 或 y{n}
精确匹配 n 次{n,}
匹配 n 次以上{n,m}
匹配 n-m 次[xyz]
字符集(character set),匹配这个集合中的任一一个字符(或元字符)[^xyz]
不匹配这个集合中的任何一个字符stopPropagation
停止事件传播,preventDefault
阻止默认事件。
addEventListener
第三参数用于指定事件传播过程,true
表示使用捕获机制,false
为冒泡机制。
事件委托一句话:普遍节点事件委托给父节点,节省内存、便于管理。
__proto__
和 prototype
的区别和关系本质没有关系。
__proto__
原型链,指向对象的构造函数原型/类
prototype
原型属性(只有 function 具有),指向函数对象对应的原型/类(的可继承属性对象)
共同目的:为了实现属性/方法的继承和共享。
两者区别:prototype
实现了属性/方法数据的共享,__proto__
实现了属性的多级继承。
唯一关系:就近原则,找实例的方法会读取 prototype,没有的话就会延原型链向上查找。
本质上没有区别,细节上有区别。
将子类构造函数的原型设置为父类构造函数的实例。
示例:
function Super() {}
function Sub() {}
Sub.prototype = new Super();
Sub.prototype.constructor = Sub;
const sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.prototype.__proto__ == Super.prototype; // ⑦ true
缺陷:无法私有化属性/方法,会污染原型属性,可能需要组合继承进行优化。
形式上:使用 class
中的 extends
关键字进行继承,通过 constructor
定义构造函数,用 super
调用父类的属性方法;
本质上:依旧使用原型 + 原型链实现继承。
不同点:两条继承链:一条实现构造函数的继承,一条实现原型的继承。
class Super {}
class Sub extends Super {}
const sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.__proto__ === Super; // ⑥ true
Sub.prototype.__proto__ === Super.prototype; // ⑦ true
规范 | 来源 | 实现 | 特征 |
---|---|---|---|
CommonJS | CommonJS | Node.js | 文件为单位、局部作用域、可缓存、同步、按顺序加载 |
AMD | RequireJS | require.js、curl.js | 异步加载、依赖前置、提前执行、API 一夫多用 |
CMD | SeaJS | sea.js | 异步加载、依赖就近、延迟执行、API 职责单一 |
UMD | 通用规范 | 通用 | 跨平台、判断环境来输出不同模块 |
</body>
后async
加载和渲染并行执行、异步、会乱序;适合 DOM 无关、无依赖的脚本defer
并行加载、当 DOM 渲染后 DOMContentLoaded 执行前执行、异步、不会乱序navigator.onLine
(只能测试本机是否连接局域网)onerror
多态和重载的区别在于编译器何时去寻找所要调用的具体方法; 对于重载,在方法调用之前,编译器就已经确定了所要调用的方法,这称为 “早绑定” 或 “静态绑定”; 对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为 “晚绑定” 或 “动态绑定”。
在 JavaScript 中继承和重载都是模拟多态的表现形式。
都是 DOM 树的抽象,共同特征有:
其实还有一些其他的节点类型:
本质是使用 ES6 中的 Object.defineProperty
方法实现,该方法定义对对象的描述;从而用它可以实现一个类似读写拦截器的机制;
同时使用观察者模式维护一个订阅者列表,当数据发生对应变化时,则执行订阅者对应的方法,如:操作 DOM。
Vue1 和 Vue2 的最大区别是使用了 virtual DOM。
angular.js 1.x 中使用脏检查,脏检查:封装所有可封装的事件,每次发生任何事件,进行大检查,不超过 10 次,不低于 2 次。
也有纯粹使用观察者模式的,像:backbone.js。
定位:
React、Vue 本身是 UI 框架,更多功能都需要扩展来实现,都可以实现从小到大的各类应用,也能支持各种模板语言或 TS 这样的编程语言开发,也都支持完备的测试机制。
Angular 更倾向于一个 platform 开发框架,具有自身完备的路由、数据、平台兼容等各模块。
实现:
All in js
所以模板用 jsx
,Vue 使用 webpack
对应的解析器支持了 HTML 作为组件模板,更容易上手,且和 Web components
很像,真正用到 Web components
的是 Angular 的 ViewEncapsulation.Native
shouldComponentUpdate
来避免不需要的 re-render共同点:
目前三者的社区热度都很火热,生态链也很完善,都是相对成熟的技术栈。越来越趋于同质化,在 Web components
真正成熟之前,各种框架都在探索一种类似的组件抽象机制;
同时都期望框架不单单是实现 Web 端的应用开发,Angular 可以和 nativescript 开发原生客户端应用,Vue 有 Weex 解决方案,React 更有火遍全地球的 react-native 框架;
Angular 本身支持 SSR,React 有 Next.js,Vue 有 Nuxt.js。
本质:
框架本身只是工具,只是为了我们更快搭建应用诞生的,没有谁最好谁不好,选择适合的最好,为了追新而实践是一定一定要避免的。
Grunt、Gulp 应该可以称之为自动化工具,他可以自动化地帮我们处理对特定资源/事件的处理,其实在这两者出现之前,很多有条件的团队一直在实践一些基于 Python、Java、PHP 的工具来完成这些事。
Webpack 是一个基于 Node.js 的资源处理工具,更像一个平台或中介者,我们可以基于它配置各种插件扩展用于处理不同的文件资源,并做出相应输出,可能是编译、分包、压缩、Lint...
非要比喻的话:Grunt / Gulp 像两条流水线组;Webpack 则像一个工厂,不仅有流水线,还有自己的仓储、销售、生产管理等各个部门。
核心是对 http 模块的封装。
postmessage
/ onmessage
window.name
主要做的事:将 HTML 标签解析为转义符,或将转移符解析为标签。
localstorge 另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件。
RESTful
是啥?GET
和 POST
的本质区别一句话:URL 仅代表资源,HTTP 请求类型来描述行为。
本质上,GET
就是请求,且 URL 的长度有限制,一般在 2k 之内;
POST
就是发送数据,以 body
为数据宿主,常见类型有:application/json
xml
text
formData
等;
PUT
用于全量修改,PATCH
用于单量修改,DELETE
按照标准是不支持 body
的,但大部分浏览器和服务端都兼容实现了,但在代理情况下,数据可能会丢失。
Web Components 是一个抽象概念,按照 MDN 的解释(Web Components),包含下面 4 个技术体系:
类似:几乎所有框架的组件机制
即,模板片段,HTML <template>
元素是一种保存客户端内容的机制,在加载页面时不会呈现,但可能随后在运行时使用 JavaScript 实例化。
内容区隔离
可以通过 HTML link 导入 Html
算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。
一般称之为:时间复杂度和空间复杂度。
如:
浏览器 DNS 缓存 > 本机 DNS 缓存 > LDNS(NS) > RDNS(GTLD) > NS(IP) > IP
简单说:将数据进行对称/非对称加密后进行传输。
SSL (Secure Sockets Layer) 由网景公司开发,3.0 后被 ISOC 接管升级为 TLS。
本质上压根没关系。
多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息,在 HTTP1.1 中「浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞」。
HTTP2 在 应用层(HTTP/2)和传输层(TCP / UDP)之间增加一个二进制分帧层。
在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码,其中 HTTP1.x 的首部信息会被封装到 header frame,而相应的 Request Body 则封装到 data frame 里面。
使用 HPACK 算法将重复的、多余的、正常的头部信息进行压缩处理。
简单说:当一个客户端请求资源 X,而服务器知道它很可能也需要资源 Z 的情况下,服务器可以在客户端发送请求前,主动将资源 Z 推送给客户端。
负责均衡的具体就是让每一层在访问自己的上游层时做到计算单元分配最大均匀化。
负责均衡有多个层面:
相关: 一分钟了解负载均衡的一切
根据大致目录简历思维大导图,构建知识图谱,主要靠文档,然后实践。
掘金、V 站、开源中国,必须了解、及时学习、按需实践,绝不为了实践而实践,也不过于被动保守避免重构升级。
因为三个连续的正整数中必有一个能被 3 整除,还有一个能被 2 整除.所以必能被 6 整除。
未完
这里说反了吧,border-box 是包含 border 和 padding 才对。
回复:
MDN box-sizing 你说得对,我改。
👏
发现一个小问题你的站点在MacBook Pro下谷歌浏览器打开发热有点严重,浏览器切换成手机模式发热现象就没有了。我的猜测应该是pc版首页的背景循环的问题👍👍
回复:
猜测正确😃,但背景动画用的是 particles.js ,没有太大优化空间,我可能在后期增加一个关闭动画的功能