JavaScript是基于原型、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(e.g:函数式编程)
应用:
服务端开发:Node
命令行工具:Node
桌面程序:Electron
App:Cordova
控制硬件-物联网:Ruff
游戏开发:Cocos2d-js
Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。
比如说 polyfill 可以让 IE7 使用 Silverlight 插件来模拟 HTML Canvas 元素的功能,或模拟 CSS 实现 rem 单位的支持,或 text-shadow,或其他任何你想要的功能。
使用某个语法时候考虑环境
基础
JavaScript与ASP:
JavaScript是一种客户端语言,因此不需要web服务器的协助就可以执行
ASP是服务端语言,所以比JavaScript慢
JavaScript与XML
JavaScript是编程语言,有很强的逻辑和行为能力,是主动的
XML(包括HTML)是标记语言,不向计算机发出指令,常用于格式化和链接。是用来被读取的,是被动的。
首先学习一门语言,笔者认为可以从基础的数据类型出发
创建名称-声明、创建实体、绑定-给名称赋值
JavaScript是一门动态类型语言,名称和实体是独立存在的,上述每一步都需要手动完成
JavaScript数据类型、引用类型、操作符、语句
整理进制转换、手写flat、递归实现深拷贝
判断JavaScript中的数据类型
typeof、instanceof、 constructor、 prototype
js实现封装私有变量的思考,symbol、weakMap,我目前的想法就是,采用其他语法,不是常规的访问语法,外人不知道,且for-in遍历不了,所以实现私有javaScrpt访问属性:点语法or中括号、条件访问、利用key唯一性去重
JavaScript正则表达式
?怎么解释?弱映射与弱集合及其私有、垃圾回收方面应用私有变量这里不太懂map是通过建立对象和value的映射关系来实现归属的,这个建立的位置需要一个闭包来限定
迭代器维护着对迭代对象的引用,会影响其回收javaScript的迭代模式:迭代器与生成器
?crossorigin 属性怎么用?是在type==module时候用?还是后端接口开启CORS时候
script元素、加载时阻塞问题
有空实例看看全局变量冲突、函数命名冲突、依赖关系处理等,模块化刻不容缓JavaScript模块 commonJS、AMD、UMD、ES6
待补充和仔细研究JavaScript错误处理机制
js函数相关
JavaScript是基于词法(静态)作用域的语言,即在函数定义的时候就确定好了作用域。
注意和变量搜索不同,this的值是在执行上下文中获取,而不会在作用域链中搜索。
JavaScript是一门脚本语言,了解它的执行机制,它的原理
重点关注 异步服务端调用JavaScript作用域、执行上下文、闭包及其应用
内含 定义一个函数的过程JavaScript内存相关初了解:堆栈、引擎、闭包隐患
js中的内存分堆栈,栈内存是存储原始数据类型和提供js代码执行环境,堆存储引用数据类型,包括函数块和键值对两种。 函数块和键值对里面的原始数据类型的变量(即成员变量)是存储在堆内存里面,调用时候又进上下文栈
函数的调用:作为函数调用、作为方法调用、作为构造器调用、call/apply调用,注意这几种情况下的不同的this取值
创造函数:对象字面量、构造器、ES5中Object.create(原型)、ES6引入class关键字
参数扩展、函数声明与表达式的区别、call/apply、特权方法可以联系对象中继承来理解JavaScript函数相关知识:this、caller、new.target、callee、箭头函数、IIFE
闭包相关
jQuery和zepto中添加插件的模板语法
作用域中this
函数赋值即复制,new 构造器的返回值给变量,是return的结果包装手写bind函数:this、返回一个函数
函数防抖和节流的代码
js对象相关
将Map引入JavaScript语言之前,Object是创建键/值对数据结构的主要方式。而Map与常规对象有什么区别
JavaScript对类的基础了解
声明与表达式,函数声明可以提升,但是类定义都不能提升。
new 一个对象的过程javascript对象编程
有关prototype和__proto__
在理解语法中,时刻区别类和函数。类相当于一个人,函数是一只胳膊。
API
JavaScript API待补充和仔细研究
Axios
jQuery梳理总结相比原生JavaScript,jQuery等库在DOM操作上的性能一定是有所下降的。元编程,独创的链式语法和隐式迭代语义
JavaScript事件
简单归纳一下web浏览器中的事件
- 浏览器窗口事件load、beforeunload、unload、focus、blur、error页面上有脚本报错、resize、contextmenu弹出右键菜单。
- 鼠标事件
- 键盘事件
- 表单事件 focus、blur、change、input、select、submit
- 拖放事件
移动端事件
- 触摸事件touchstart、touchmove、touchend、touchcancel 事件对象event下有一个touches对象数组,每个对象维护一次触碰都有对应实时坐标和target触碰的DOM节点
- 手势事件,实质是对触碰的高级封装 。事件类型:gesturestart、gesturechange、gestureend。
- 传感器事件
DOM元素尺寸:offsetWidth、clientWidth、scrollWidth
http请求阶段(DNS解析、TCP协议的三次握手和四次挥手、HTTPS和HTTP的区别(HTTP2))
http响应阶段HTTP状态码、304缓存、HTTP报文
浏览器渲染阶段:浏览器在内存条中开辟出一块栈内存,用来给代码的执行提供环境。
DOM树渲染——> CSSDOM树渲染 ——>生成Render Tree(渲染树)——>Layout(回流)——>Painting(重绘)——>Display(GPU展现在页面)
回流(Layout):(宽高、大小、位置)根据生成的渲染树,计算它们在设备视口(viewport)内的确切位置和大小。重绘(Painting):根据渲染树已经回流得到几何信息,得到节点的绝对像素。
避免table布局和使用css的JavaScript表达式
动画效果应用到postion属性为absolute或fixed的元素上(脱离文档流)
开启css3硬件加速(GPU加速),能用transform做的就不要用其他的,因为transform可以开启硬件加速,而硬件加速可以规避回流。
现代浏览器都有渲染队列的机制,多次写存入队列,每一次读会直接渲染。分离读写,样式集中改变,缓存布局信息。
重点坐标、iframe、postMessage API 针对同步异步对话框,模拟用户点击对话框事件?JavaScript红宝书之BOM
想到了ajax的readyState
onreadystatechange 事件
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
readyState 属性存有 XMLHttpRequest 的状态信息。
status
200: “OK”
404: 未找到页面
JS中所有的函数都是Function的实例
window对象的document属性JavaScript红宝书之DOM基础、MutationObserver接口(H5)
JS事件委托考察重点、元素绑定onclick和addEventListener的区别、DOM事件模型:事件流+事件处理DOM0、IE、DOM2+事件对象
事件代理(事件委托):JavaScript中常用的绑定事件的方式,把原本需要绑定到子元素上的事件委托给父元素。原理:DOM的事件冒泡
好处:
减少事件数量,提升性能
预测未来元素,新添加的元素仍可以触发该事件(点击事件不生效?)
避免内存外泄,在低版本IE中,防止删除元素而没有移出事件造成的内存泄漏
重点关注关于IE、DOM2不同标准的适配,联系H5中MutationObserver方法(DOM3提出的一种事件)JavaScript用户事件
代理的回收问题JavaScript代理_ES6新增
js线程相关
注意执行器函数是同步执行的,关注异步函数的执行,后面再学习一下promise的应用
利用race、all可以控制多个期约并行执行,Node事件循环不一样单线程JavaScript的异步编程
requestAnimationFrame
学习API之后再看看单线程JavaScript的多线程方式:工作者线程
(最典型的是一个 Ajax 请求完成后紧接着另一个 Ajax 请求,容易陷入多层嵌套的函数调用中,“回调厄运”),由于无法控制执行和完成的顺序,所以就无法使用传统的过程式写法,函数式就会展现出其优势。