好多年前写的笔记移动到博客上

jS基础

关于基础

  • 工程师的自我修养 - 基础
  • 扎实的基础会让你高效学习新技术

关于面试

  • 看到面试题首先想到的是什么 -> 考点
  • 如何看待网上永远看不完的面试题 -> 以不变应万变
  • 如何对待接下来遇到的面试题

题目考察知识点

  • JS变量类型
  • 强制类型转换
  • 浏览器渲染过程
  • 作用域
  • JS模块化
  • JS基础算法

JS变量类型 变量计算

  • 值类型(在内存中有多份)
    • undefined,string,number,boolean
  • 引用类型(在内存中只有一份指针)
    • 对象(object), 数组(array),函数(function),null

typeof 运算符可以得出的类型共6种

- undefined
- string
- boolean
- object
- number
- function(typeof引用类型中唯一能区分出来的)

变量计算 - 强制类型转换

- 字符串拼接
- == 运算符
- if 语句(变量)
- 逻辑运算符

何时使用=== 何时使用==

1
2
3
4
5
6
7
8
9
10
// 除了以下情况都用===
// 看一个对象里是否存在某个属性的时候用
if (bja.a == null) {
// jqury 里就这么写
}
function (a,b) {
if (a == null) {
return
}
}

JS中的内置函数

- object
- array
- boolean
- number
- string
- function
- Date
- RegExp
- Error

原型 原型链

构造函数(其实就是为了补充引用对象共同使用一个指向的问题)

  • new关键字 的运行过程
  • 创建一个新对象
  • this 属性赋值
  • return this(当前对象)

构造函数- 扩展

  • var a = {} 其实是 var a = new Object 的语法糖
  • var a = [] 其实是 var a = new Array 的语法糖
  • function Fn(a.b){} 其实是 var Fn = new Function 的语法糖
  • 使用 instanceof 判断一个函数是否是一个变量的构造函数

原型规则和示例

5条原型规则
1. 所有的引用类型(数组, 对象, 函数) ,都具有对象的特性,即可自由扩展属性(除了 ‘null’ 以外)
2. 所有的引用类型(数组, 对象, 函数) ,都有一个 __proto__(隐式原型) 属性 ,属性值是一个普通对象
3. 所有的 **函数** 都有一个 prototype(显式原型) 属性,属性值也是一个普通对象
4. 所有的引用类型(数组, 对象, 函数), __proto__ 属性值指向它的构造函数的 prototype 属性值
5. 当试图得到一个(引用类型)对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的 __proto (即它的构造函数的 prototype ) 中去寻找

原型链

proto.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 原型链例子
function Fn() {
this.getElement = function (el) {
return document.querySelector(el)
}
}
function Fn2() {
this.getElementAll = function (el) {
return document.querySelectorAll(el)
}
}

Fn.prototype = new Fn2()

let getElement = new Fn()


arr, Obj , fn instanceof Array, Object, Function

作用域 闭包

变量提升

- 执行上下文 (把函数和变量先拿出来)
  1. 范围 :一段script 或者一个函数
  2. 全局: 变量定义 函数声明
  3. 函数 : 变量定义函数声明 this, arguments 

this

- this 要在执行时才能确认值, 定义时无法确认

this的执行

- 作为构造函数执行
- 作为对象属性执行
- 作为普通函数执行
- call bind apply 执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function name(age) {
alert(age)
console.log(this)
}
name.call({x:100}, 12)
// this = {x:100}
name.apply({x:100}, [12])

let fn = function name2(age) {
alert(age)
console.log(this)
}.bind({x:100})
// this = {x:100} bind 返回一个新的函数
name2(11)

作用域

- JS没有快级作用域
- 只有函数和全局作用域(函数内的变量外部无法访问无法修改)

作用域链

- 由内向外 外层称为自由变量
- 函数只需要关心在哪里定义 无需关心在哪里执行 函数在定义的时候作用域链就定义了 除非后续的bind call等函数修改作用域

闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 函数作为返回值
// 函数作为参数传递
function F1() {
let a = 100
return function () {
console.log(a)
}
}

let f1 = F1()
let a = 200
f1()

// 闭包的常用实例(保存变量等)
for (let i = 0;i < 9; i++) {

( function(i){
var a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click', function () {alert(i)})
document.body.appendChild(a)
} )(i)
}

异步 单线程

什么是异步(对比同步)

- 异步不会阻塞后续代码执行
- 同步会阻塞后续代码执行

前端使用异步的场景

- 在可能发生等待的情况
- 定时任务 
- 网络请求 ajax请求 动态img 加载
- 事件绑定

异步和单线程

- 含有异步的代码会先单独放一边 等待执行
- 单线程一次只能干一个活 干一件事

其他知识

日期

- Date.now() //获取当前毫秒数
- dt.getTime // 获取毫秒数
- dt.getFullYear() // 年
- dt.getMonth() // 月
- dt.getDate() // 日
- dt.getHours() // 小事
- dt.getMinutes() // 分钟
- dt.getSeconds() //秒

Math

- Math.random() // 随机数

数组API

- forEach // 遍历
- every // 判断所有元素是否都符合条件
- some //至少一个元素符合条件
- sort 排序
- map 对元素重新组装,生成新数组
- filter 过滤符合条件的元素

对象API

- for in 遍历

Js-WEB-API

- 全面考虑 JS 内置对象有哪些?
- 之前的 Ecma262 标准的内置函数 Object Array String Boolean Number Regexp  Date Error
- 内置对象  Math JSON  等
- 浏览器对象 window  文档对象 document
- 还有 全局变量 navigator

DOM操作

DOM 的本质

- dom 把html字符串结构化成js和浏览器能识别和操作的文档模型而已
- DOM 是树 的数据结构

DOM 节点操作

- document.getElementById() // 获取节点
- property  是操作js对象 
- attribute 是操作html文档对象

DOM 结构操作

- 新增节点
    - appendChild (已有节点就是移动) 
    - crateElment 新增
- 获取父元 素
    - elemnt.parentElement
- 获取子元素
    - elemnt.childNodes
- 删除节点
    - removeChild()
- nodetype 是节点类型
    - 1 是元素节点 3是文字节点
- nodeName 是元素名
    - 大写的英文字母

BOM 操作

- 检查浏览器类型
    - navigator
        - userAgent 浏览器信息
    - screen  屏幕特性
        -  width 
    - location
        - href
        - protocol
        - pathname
        - search
        - hash
    - history (浏览器前进后退)
        - back 
        - forwart 
- 解析 URL 各部分

AJAX

- new XMLHttpRequest
    
1
2
3
4
5
6
7
8
9
let xhr = new XMLHttpRequest
xhr.open('GET', "/api",false)
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200) {
// .......
}
}
xhr.send(null)
// POST 数据放在send里边
- 状态码说明 - 0 还没调用send方法 - 1 正在发送请求 - 2 send方法执行完成 以接收到响应内容 - 3 正在解析响应内容 - 4 响应内容解析完成 可以调用 - status - 2xx 表示成功处理请求 - 3xx 需要重定向,浏览器直接跳转 - 4xx 客户端请求错误, 如404 请求不存在 - 5xx 服务的错误 - 跨域 - 什么是跨域 - 浏览器有同源策略 不允许ajax访问其他域接口 - JSONP - callback(data) - 服务端设置 http header - 跨域条件: 协议,域名,端口,有一个不同就算跨域 - 可跨域的标签 - img - 用于打点统计 - script - CDN - JSONP - link - CDN - 跨域注意事项 - 所有跨域请求都必须经过信息提供方允许 - 如未经过允许即可获取,那就是浏览器同源策略出现漏洞

事件绑定

通用事件绑定

事件冒泡

- 冒泡往上层冒
- e.stopPropatation 阻止冒泡

代理

- 绑定事件在父级元素上

存储

- 描述 cookie, sessionStorage和 localStorage的区别
- cookie 限制4kb大小 localStorage 可以存5m
- cookie
    - 本身用于客户端和服务的通信
    - 但是它有本地存储功能于是就被借用
    - 使用 document.cookie = ... 获取和修改
- cookie所有 http 请求都带着 会影响获取资源效率
- sessionStorage和 localStorage
    - html5专门为存储而设计 
    - API 简答易用
    - localStorage.setItem(key, value)
    - localStorage.getItem(key)

JS开发环境

IDE

- webstorm
- sublime
- vscode
- atom
- 插件

GIT 代码版本管理

- 正式项目都需要代码版本管理
- 大型项目需要多人协作开发
- git 和 linux是一个作者
- 网络git服务器 如coding.net github.com
- 一般公司代码非开源,都有自己的 git 服务器
- 搭建 git 服务器 无需了解太多

git 基本操作

- git add
- git status //查看哪些改动
- git diff // 查看文件有哪些修改
- git checkout xxx // 还原
- git commit -m 'xxx'  // 提交
- git push origin master // 提交到主分支
- git pull origin master // 下载到本地
    - git branch // 分支
    - git checkout -b xxx / git checkout xxx //切换分支
    - git merge xxx // 合并分支

JS 模块化

不使用模块化

- 全局变量污染
- 必须按顺序引入

使用模块化

- 用什么就直接暴露出什么
- 没有引入问题
- 没有全局变量污染的问题

AMD (requirejs)

- 全局 define 函数
- 全局 require 函数
- 依赖 js 自动 异步加载

CMD

- nodejs 模块化方案
- 从 npm 获取开发依赖和库
- 构建工具自动化 使得npm 成本非常低
- CommonJS 不会异步加载js,而是同步一次性加载出来
- 需要构建工具支持
- 和 npm 一起使用

AMD 和 CMD 的使用场景

- 需要异步加载 JS 使用AMD
- 使用 npm 之后 使用CMD

打包工具

- webpack

上线回滚

- 不会有具体的问题, 交流询问的方式

基本流程

- 是非常重要的开发环节
- 各个公司的具体流程不同
- 由专门的工具或者系统完成

上线要点

- 把测试完成的代码提交到GIT 版本库的master分支
- 把当前服务器的代码全部打包并记录版本号,备份
- 把 master 分支代码提交覆盖到线上服务器 生成新版本号

回滚流程要点

- 把当前服务器代码打包并记录版本号,备份
- 把备份的上个版本解压,覆盖到线上服务器,生成新的版本号

linux 基本命令

- mkdir // 创建文件夹
- ls 查看文件夹名字
- ll 查看详细信息
- cd 切换文件夹
- rm -rf 删除文件夹
- cp 复制 源文件 拷贝目录名
- mv 移动 源文件 移动目录名
- rm fileName 删除文件
- cat fileName 查看文件 head -n 第几行 fileName 前 tail 后
- grep '内容' fileName 内容搜索

vim 操作命令

- vim fileName
- i 写入
- esc 退出写入环境
- esc :w 保存
- esc :q 退出
- :wq 保存退出

运行环境

- 浏览器 

页面加载过程

- 加载资源形式
    - 输入 url 加载 html
    - 加载静态资源 图片 音频视频 样式 js 
- 加载一个资源过程
    - 浏览器根据 DNS 服务器得到域名的 IP地址
    - 向这个 IP 的服务器发送 http 请求
    - 服务器收到, 处理并 返回 http请求
    - 浏览器得到返回内容
- 浏览器渲染页面过程
    - 根据 html 结构生成 DOM Tree(树)
    - 根据 css 生成 CSSOM 
    - 将 DOM 和 CSSOM 整合成 RenderTree
    - 根据 RenderTree 开始渲染和展示
    - 遇到 script 时, 会执行并阻塞渲染

为什么把 CSS 放在 head 中

- 渲染的时候已经知道 css 样式
- 放在最后会出现默认情况 再改成 css 样式
- 用户体验好
- 性能好

为什么把 JS 放在 body 最后

- 不会阻塞 html 内容渲染
- 

从输入 URL 到得到HTML 的详细过程

- 浏览器根据 DNS 服务器得到域名的 IP地址
- 向这个 IP 的服务器发送 http 请求
- 服务器收到, 处理并 返回 http请求
- 浏览器得到返回内容

window.onload 和 DOMContentLoaded 的区别

- window.onload 是把所有资源加载完才会执行,包括图片,视频等
- DOMContentLoaded 是 DOM 渲染完即可执行,此时的图片, 视频可能还没有加载完

性能优化

优化策略

- 多使用内存, 缓存或者其他方法
- 减少 CPU 计算, 减少网络 

入手

- 加载页面和静态资源
    - 静态资源合并压缩
    - 静态资源缓存
    - 使用 CDN 让资源加载更快
    - 使用 SSR 后端渲染, 数据直接输出到 HTML 中
    
- 页面渲染
    - css 放head
    - js 放 body 最后
    - 懒加载 (图片懒加载, 下拉加载更多)
    - 减少 DOM 查询, 对 DOM 查询做缓存
    - 减少 DOM 操作, 多个操作尽量合并在一起执行
    - 事件节流
    - 尽早执行操作 (如DOMContentLoaded)
    

前端安全性

安全性 XSS 攻击

- 写一篇文章同时插入一段 script 
- 攻击代码中, 获取 cookie 发送到自己服务器

预防 替换 <> 进行转义

XSRF 跨站请求伪造

- 以登入购物网站,正在浏览商品
- 付费接口 是 xxx/api?id=100 但是没有任何验证
- 然后收到一封邮件 隐藏着 IMG src指向这个接口 
- 你查看邮件的时候 已经偷偷付费购买了

预防 增加验证流程 指纹 密码 短信等

面试技巧 注意事项

简历怎么写

- 简介明了, 重点突出项目经验和解决方案
- 把个人博客放在简历中, 并且定期维护更新博客
- 把个人的开源项目 放在简历中, 并维护开源项目
- 简历千万不要造假, 要保持能力和经历上的真实性

过程中

- 如何看待加班? 加班就像借钱, 救急不救穷
- 千万不可挑战面试官, 不要反考面试官
- 学会给面试官惊喜 但不要太多
- 遇到不会回答的问题, 说出你知道的也可以
- 谈谈你的缺点--说一下你最近学什么就可以了

基础工程师 - 基础知识

高级工程师 - 项目经验

架构师 - 解决方案

读源码

  • zepto

高级前端

高级基础

ES6 常用语法

原型高级应用

异步全面讲解

框架原理

虚拟 DOM

MVVM vue

组件化 React

混合开发

hybrid

bybrid VS H5

前端客户端通讯

框架原理

APP混合开发

热爱编程

读书 博客

开源