# JS语言历史及基本特性介绍

# JS历史

  1. 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。
    网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。
    评:初始设计目标。
  2. 1995年5月,网景公司做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。
    评:划重点 “非专业也能很快上手”。
  3. 1995年5月,Brendan Eich 花10天设计了Javascript。
    评:天生劣势。
  4. 1996年8月,JScript随IE3.0发布。
    浏览器大战。
    评:标准化动机。
  5. 1996年11月,网景公司将JavaScript提交给欧洲计算机制造商协会进行标准化。
    ECMA-262的第一个版本于1997年6月被ECMA组织采纳。
  6. 2007年10月,ECMAScript 4.0版草案发布,各方对于是否通过这个标准,发生了严重分歧。
    4.0 流产,小改动发布为3.1,后改名为ECMAScript 5
    评:我们接触JS的开端;产商撕逼。
  7. 2008 年谷歌发布v8引擎。
    评:性能飞跃;WEB最强盟友出现。
  8. 2009年Nodejs发布。
    评:JS突破次元(参考1)
  9. 2014年 6to5 发布,2015年改名为Babel。
    评:社区的力量。

JS设计目标是为了在浏览器中运行,推荐阅读浏览器大战 (opens new window)相关资料,了解ECMAScript (opens new window)标准化的幕后故事。

Javascript诞生记 (opens new window)
JavaScript深入浅出 (opens new window)
巴别塔 (Babel) (opens new window)

# JS语言基础(如何学习一门编程语言)

# 保留关键字、符号、语法

  1. JavaScript 保留关键字 (opens new window)
  2. 符号:{}、[]、()、+ - * /、~ ! & |、&& ||、?:
  3. 基本语法:变量定义(const、let、var),函数定义(function、箭头函数),条件分支(if、switch),循环(for、while)

# 数据结构、标准库

# 原始数据类型:字面量

  1. String: 'hello world'
  2. Number: 42
  3. Boolean: true
  4. BigInt: 42n
  5. null
  6. undefined
  7. Symbol

注意区别

const a = '111'; 
const b = new String('111'); 
console.log(a === b)

# 复杂数据类型及常用方法

  1. 简单Object Object.assign, Object.keys, Object.values, Object.entries, Object.fromEntries, Object.freeze, Object.defineProperty, Object.create
  2. Array map, filter, reduce, slice, concat, flat, flatMap, join
    pop, push, shift, unshift, splice, sort, fill
    some, every, includes
    find, findIndex, indexOf
    forEach
  3. Map get, set, has, delete, keys, values
  4. Set add, delete, has, values
  5. WeakMap WeakSet WeakMap的key、WeakSet中的元素是弱引用,即它们引用的对象不会被垃圾回收机制额外增加计数

熟练使用自带方法,写出更加简洁优雅的代码

[1, 2, 3, 2, 1].reduce((s, p) => s.includes(p) ? s : s.concat(p), [])

社区默认的标准库:Lodash (opens new window)
JavaScript 标准内置对象 (opens new window)

# 代码调试

  1. Chrome devtools (opens new window)
  2. Nodejs inspect (opens new window)
  3. VSCode Debugging (opens new window)

# 模块化、包管理(项目代码组织必要能力)

# 模块化

# 包管理

# IO、并发/异步(通用能力)

# Nodejs

# 浏览器

# 并发/异步

# 值得关注的未来


# 讲稿

### 本次分享

主要内容包括介绍JS的历史,然后汇总JS基础涉及的知识

## 内容

### 第一节

1. **历史1、2项**,我个人认为,JS语言天生的优缺点都可以归结到这两个原因上
2. 预期一个月的任务你一个星期做完了,有两种可能:你牛逼;你偷懒了。就这个案例来说,布兰登·艾奇应该是牛逼并且偷懒了。  
3. 关于标准化的意义我没什么要说的
4. 我们最开始基本上都是学习使用ES5的,其实早在07年就发布了;**在座的有没有一开始就学习ES6的?**  
5. ES5是妥协的产物,妥协原因就是背后厂商的利益诉求不同,这种现象会一直持续下去
6. V8的性能飞跃创造了很多可能性,没有V8可能Nodejs就不会出现
7. **为什么说谷歌是WEB最强盟友?** 
8. Nodejs对前端的意义不言而喻,其实它最开始主要应用于前端工程化。以前广泛应用的谷歌 提供的closure-compiler 是用java写的,就是用来混淆压缩js源码的那个工具
9. Babel象征社区的力量参与标准制定。
10. 大家看这个历史过程,都是环环相扣的

下面是一些参考链接,有兴趣的同学可以深入了解

### 第二节

这些基础知识大家应该都比较熟悉了(除了保留字)

我尝试从“如何学习一门编程语言”这个视角来介绍JS语言基础,大家可以了解一下通用编程语言(对应DSL)的一些相通之处

根据我个人经验,汇总一下几个方面了解一门编程语言:

1. 保留关键字、符号、语法,数据结构、操作数据结构的标准库,然后再学习一下调试方法基本可以写代码了
2. 如果要用来写项目,就需要用到模块化、包管理知识,项目代码组织的必要能力
3. 加减乘除 单纯的计算逻辑,肯定不能满足常规需求,不论实现项目功能还是自己写脚本工具,IO、并发/异步这些通用能力都是必不可少的。

这部分的内容基本都是一些资料的合集,我们快速过一下,大家有感兴趣的点可以随时提出来

---

JS的保留字超级多,有些还没用到,即使十年经验,绝大部分都背不出来

这里只提一个有意思的点,ES6有一个for...of的语法,of看起来类似in,但不是保留字,也就是说可以用来命名变量,但最好不要这么做k

js的符号比较神奇,我提一个问题,**圆括号有几个应用场景?**(函数参数、函数调用、表达式求值)

这其实是一个不好的地方,虽然我们已经习惯,初学者需要下意识区分的

另举一个对我们有影响的例子:花括号既用来做对象的字面量,有用来定义代码块,所以简写的箭头函数返回对象的时候会有一些麻烦。`({...})`

---

基本数据类型,只提一个点 ,注意原始类型跟对象的区别

**有人有其他疑问么?**

---

复杂数据类型及常用方法 太多了,就不逐个介绍了。

熟练使用这些这些方法,你会发现“我靠,JS还可以这样写”。

看下面这个例子,**这行代码返回什么?**

当熟练使用lodash/fp之后,你又会重复前面那句话。

先挖个坑,以后再深入介绍JS数据处理。

---

代码调试,基础功能应该很容易上手,深入一点点的话Chrome devtools可以单独做一次分享,**有人报名么?**

---

原始时代,JS没有模块化、包管理,随着前端项目复杂度增加,出现了一系列模块化方案,底层都是通过函数作用域来隔离模块

然后终于标准规范ES Module让JS 语言终于有了原生的模块支持

---

IO、并发/异步(通用能力)的资料都在这里,我讲不动了

自由讨论。。。

---

值得关注的未来,大家有新提议么。。

我学不动了。。
💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

从 React 看前端 UI 代码范式革命

alt text 前言 本来打算写的主题是“我为什么讨厌 React Hooks API”,展开聊聊“小甜甜”是如何变成“牛夫人”的,没想到越写越严肃:) React 是两次前端范式革命的引领者,至今仍有繁荣的社区和旺盛的创造力; React 多次天才又激进的创新,一些想法被借鉴改良、一些引发广泛质疑,大部分是被认同和接受的; ...

一句话总结:TS 何时选择 interface 或 type

用 interface 描述类型的结构,用 type 描述类型关系。 有点编程基础中数据结构与算法的味道。 结构即是类型的属性集合 // 如 Point3D 的属性集合: x, y, z。 interface Poi ...

JS 定时器时长控制细节

背景 JS 最常使用 setTimeout、setInterval 来延迟或定时循环执行函数,通常会传递第二个参数来控制延迟或间隔执行的时间。 但开发者必须意识到函数执行时间并非精确地符合预期,在以下场景中它会超出你的预期 CPU 繁忙(主线程被长时间占用),JS 无法按开发者设定的预期时间延迟函数 定时器过于频繁地执行(第二个参数 < 4),达到一定 ...

JS 多线程并发

[[toc]] 为什么需要并发 我们常听说 JS 是单线程模型,即所有代码都在主线程中执行的。 如果某些任务计算量较大,将阻塞主线程,UI 界面轻则掉帧、重则卡死。 // 提示:本文所有代理均可复制到浏览器控制台中执行,验证效果 // ...

系统化学习 TS 类型系统

目的:快速、系统性的入门 TS 类型系统 [[toc]] 前言 TS 是什么? TS 是 JS 的超集, TS = JS + 类型系统 为了描述如此复杂(由于 JS 语言的灵活性/复杂性)的类型信息,类型系统表现出非常明显的编程语言特性。 以学习编程语言的方式,来学习 TS 类型系统 关键字/符号 类型: boolean, number, stri ...

跨域(Options)请求介绍及解决方法

介绍 OPTIONS请求指method为OPTIONS的http请求。 通俗来说:它的作用是用于WEB服务器是否支持某些 header,也可以叫做预检请求(顾名思义:预先检测)。 程序员:跨域发送 http get { headers { xxx: abc } } 浏览器:等等,你这个请求有点奇怪,我去跟服务器确认下 浏览器:发送 http options ...

单测(Unit Test)技巧

前言 本文目的是提高编写单测的效率,适合于有一定单测编写经验,但被单测困扰的同学。 后文的示例都在 unit-test-examples 仓库中。 单测的意义与价值 单测本质:将测试行为及结果固化下来,自动检查被测试代码的运行结果是否符合期望。 单测是一 ...

compilerOptions字段详解

{ "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT' "module": ...

JS 正则表达式基础

前言 个人经验,正则是一个前期少量投入,回报超高的技能点。 其适用范围非常广泛,如批量文本处理、源码替换、程序中逻辑判断等等。 本文只介绍常用的基础知识、技巧,让初学者快速掌握大部分日常所需的正则知识。目标是 5 分钟内可逐字读完,10 分钟内可把例子都动手实践一 ...

JS优缺点

回顾上两期 优点(简单) 对象 链(原型链 & 作用域链) 一切都是对象(包括函数),构建世界的原料,越少越简单、灵活。 jimu 观察者模式,例: class Observer { constructor() { this.subscribe ...