<h1 align="center">
<br>
<a href="https://github.com/stephentian/33-js-concepts"><img src="33_js_concepts.jpg" alt="每位 JS 开发应该懂的 33 个概念" width=200"></a>
<br>
<br>
JavaScript开发者应懂的33个概念
<br>
</h1>
## 简介
这个项目是为了帮助开发者掌握 JavaScript 概念而创立的。它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南。
> 本篇文章是参照 @leonardomso 创立,英文版项目地址在[这里](https://github.com/leonardomso/33-js-concepts)。
> 由于原版资源都要翻墙,所以本人创立一个中文版,附上关于这些概念在国内的一些文章和视频。
> 若有觉得更好的文章或者视频,可以贡献出来,觉得有误的,请联系我删除。
## 更新
若有觉得更好的文章或者视频,可以贡献出来,觉得有误的,请联系我删除。
- 文章的排序优化,前面的文章是介绍概念,后面的文章是深入解读。
- 将原文的 "高阶函数" 和 "map, reduce, filter" 合并为 "map, reduce, filter 等高阶函数"
- 增加 "promise" 概念(替换删除的 "高阶函数")
---
## 目录
1. **[调用堆栈](#1-调用堆栈)**
2. **[原始类型](#2-原始类型)**
3. **[值类型和引用类型](#3-值类型和引用类型)**
4. **[隐式, 显式, 名义和鸭子类型](#4-隐式-显式-名义和鸭子类型)**
5. **[== 与 ===, typeof 与 instanceof](#5--vs--typeof-vs-instanceof)**
6. **[this, call, apply 和 bind](#6-this-call-apply-和-bind)**
7. **[函数作用域, 块级作用域和词法作用域](#7-函数作用域-块级作用域和词法作用域)**
8. **[闭包](#8-闭包)**
9. **[map, reduce, filter 等高阶函数](#9-map-reduce-filter-等高阶函数)**
10. **[表达式和语句](#10-表达式和语句)**
11. **[变量提升](#11-变量提升)**
12. **[Promise](#12-promise)**
13. **[立即执行函数, 模块化, 命名空间](#13-立即执行函数-模块化-命名空间)**
14. **[递归](#14-递归)**
15. **[算法](#15-算法)**
16. **[数据结构](#16-数据结构)**
17. **[消息队列和事件循环](#17-消息队列和事件循环)**
18. **[setTimeout, setInterval 和 requestAnimationFrame](#18-settimeout-setinterval-和-requestanimationframe)**
19. **[继承, 多态和代码复用](#19-继承-多态和代码复用)**
20. **[按位操作符, 类数组对象和类型化数组](#20-按位操作符-类数组对象和类型化数组)**
21. **[DOM 树和渲染过程](#21-dom-树和渲染过程)**
22. **[new 与构造函数, instanceof 与实例](#22-new-与构造函数-instanceof-与实例)**
23. **[原型继承与原型链](#23-原型继承与原型链)**
24. **[Object.create 和 Object.assign](#24-objectcreate-和-objectassign)**
25. **[工厂函数和类](#25-工厂函数和类)**
26. **[设计模式](#26-设计模式)**
27. **[Memoization](#27-memoization)**
28. **[纯函数, 函数副作用和状态变化](#28-纯函数-函数副作用和状态变化)**
29. **[耗性能操作和时间复杂度](#29-耗性能操作和时间复杂度)**
30. **[JavaScript 引擎](#30-javascript-引擎)**
31. **[二进制, 十进制, 十六进制, 科学记数法](#31-二进制-十六进制-十进制-科学记数法)**
32. **[偏函数, 柯里化, Compose 和 Pipe](#32-偏函数-柯里化-compose-和-pipe)**
33. **[代码整洁之道](#33-代码整洁之道)**
---
## 1. 调用堆栈
### 文章
- :book: [Call Stack — MDN](https://developer.mozilla.org/en-US/docs/Glossary/Call_stack)
- :book: [[译] JavaScript 如何工作:对引擎、运行时、调用堆栈的概述 —— 掘金](https://juejin.im/post/5a05b4576fb9a04519690d42#comment)
- :book: [[译] 理解 JavaScript 中的执行上下文和执行栈 —— 掘金](https://juejin.im/post/5ba32171f265da0ab719a6d7)
- :book: [这一次,彻底弄懂 JavaScript 执行机制 —— 掘金](https://juejin.im/post/59e85eebf265da430d571f89)
- :book: [解读 JavaScript 之引擎、运行时和堆栈调用 —— 开源中国](https://www.oschina.net/translate/how-does-javascript-actually-work-part-1)
- :book: [Tasks, microtasks, queues and schedules —— Jake Archibald](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/)
### 视频
- :tv: [What is the event loop anyway? —— 腾讯视频(英文字幕)](https://v.qq.com/x/page/h0372bld8re.html?ptag=qqbrowser)
- :tv: [Understanding The JavaScript Call Stack, Event Queue, Event Table, & Event Loop —— Bilibili](https://www.bilibili.com/video/av33824933/)
- :tv: [JS 中的变量提升、堆栈内存及闭包详解 —— Acfun](http://www.acfun.cn/v/ac4495641)
- :tv: [事件循环模型 —— PHP 中文网](http://www.php.cn/code/21194.html)
**[:arrow_up: 返回目录](#目录)**
---
## 2. 原始类型
### 文章
- :book: [原始数据 —— MDN](https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive)
- :book: [ECMAScript 原始类型 —— W3school](http://www.w3school.com.cn/js/pro_js_primitivetypes.asp)
- :book: [How numbers are encoded in JavaScript —— Dr. Axe](http://2ality.com/2012/04/number-encoding.html)
- :book: [每一个 JavaScript 开发者应该了解的浮点知识 —— 颜海镜](https://yanhaijing.com/javascript/2014/03/14/what-every-javascript-developer-should-know-about-floating-points/)
- :book: [JavaScript 标准参考教程(基本语法之数值) —— 阮一峰](https://wangdoc.com/javascript/types/number.html)
- :book: [The Secret Life of JavaScript Primitives —— Angus Croll](https://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/)
### 视频
- :tv: [javascript 六种数据类型 —— 慕课网](https://www.imooc.com/video/5674)
- :tv: [javascript 视频教程(数据类型) —— PHP 中文网](http://www.php.cn/code/5808.html)
**[:arrow_up: 返回目录](#目录)**
---
## 3. 值类型和引用类型
### 文章
- :book: [ECMAScript 引用类型 —— W3school](http://www.w3school.com.cn/js/pro_js_referencetypes.asp)
- :book: [js 中的值类型和引用类型的区别 —— 博客园](https://www.cnblogs.com/leiting/p/8081413.html)
- :book: [JavaScript 的值传递和引用传递 —— FunDebug](https://blog.fundebug.com/2017/08/09/explain_value_reference_in_js/)
- :book: [Primitive Types & Reference Types in JavaScript —— Bran van der Meer](https://docstore.mik.ua/orelly/webprog/jscript/ch04_04.htm)
- :book: [JavaScript: Passing by Value or by Reference —— CSDN](https://blog.csdn.net/xiaojia_boke/article/details/54906509)
- :book: [js 值引用和值复制 —— SegmentFault](https://segmentfault.com/a/1190000015411195)
- :book: [js- 引用和复制(传值和传址) —— CSDN](https://blog.csdn.net/zzzaquarius/article/details/4902235)
**[:arrow_up: 返回目录](#目录)**
---
## 4. 隐式, 显式, 名义和鸭子类型
### 文章
- :book: [ECMAScript 类型转换 —— W3school](http://www.w3school.com.cn/js/pro_js_typeconversion.asp)
- :book: [JavaScript 的怪癖 1:隐式类型转换 —— justjavac](http://justjavac.com/javascript/2013/04/08/javascript-quirk-1-implicit-conversion-of-values.html)
- :book: [JavaScript 运算符规则与隐式类型转换详解 —— 掘金](https://juejin.im/post/59ad2585f265da246a20e026)
- :book: [聊一聊 JS 中的隐式类型转换 —— SegmentFault](https://segmentfault.com/a/1190000004482388)
- :book: [有趣的 JavaScript 隐式类型转换 —— 博客园](https://www.cnblogs.com/yugege/p/5277883.html)
- :book: [JavaScript 显式类型转换与隐式类型转换 —— CSDN](https://blog.csdn.net/yangjvn/article/details/48284163)
- :book: [你不知道的 JavaScript(中卷)强制类型转换 —— 简书](https://www.jianshu.com/p/777a89b4ed9a)
- :book: [你懂 JavaScript 嗎?#8 強制轉型 —— cythilya](https://ithelp.ithome.com.tw/articles/10201512)
- :book: [动态类型语言和鸭子类型 —— 曾探](http://book.51cto.com/art/201505/475153.htm)
- :book: [Nominal & Structu