Skip to content

Latest commit

 

History

History
238 lines (181 loc) · 8.56 KB

JavaScript权威指南.md

File metadata and controls

238 lines (181 loc) · 8.56 KB

JavaScript权威指南

概念

  1. JavaScript是一门高级、动态、解释型语言
  2. JavaScript的变量是动态的
  3. JavaScript正式上应该叫ECMAScript,因为JavaScript是Oracle的商标,而这门语言的标准化交给了Ecma International故名ECMAScript
  4. 核心JavaScript语言定义了最小限度的api,可以操作数值、文本、数组、集合、映射等,但不包括输入、输出等功能,输入输出是JavaScript宿主环境的责任,浏览器是JavaScript最早的宿主,2010以后JavaScript又有了一个新宿主Node

版本

  1. 2010年几乎所有浏览器都支持ES5,所以兼容性比较好
  2. ES6是2015年发布的,更新了很多新特性,之后每年使用年份发布一个版本(ES2016,ES2017,ES2018,ES2019)
  3. ES5之前为了向后兼容,无论一个特性有多么严重也不能把它删除,但是在ES5及之后程序可以选择切换到严格模式,这时语法错误会被纠正

类型

  1. JavaScript中类型可以分为两类,一种是数值类型,一种是对象类型,除数值、字符串、布尔值、符号、null、undefined外都是对象类型
  2. JavaScript中的所有的数值都是浮点数
  3. JavaScript中类型在比较时还可以分为比较原始类型和比较引用类型
  4. 浮点数错误,这个是所有使用二进制浮点数编程语言的通病,一般需要进行特殊处理
  5. 字符串是不可修改的,所有看似修改的操作都是返回了一个新的字符串
  6. null一般为程序员手动返回,用于表示程序上的空值,而undefined表示系统上的空值是意料之外的
  7. JavaScript中function也是一个特殊的对象,所以可以有自己的属性

特性

  1. 在使用+时,优先字符串拼接,从左到右按顺序执行,部分类型不会影响整行执行方式
  2. 函数声明会提升
  3. 通过代码作用域的特性可以让一个函数返回一个函数,在方法体内声明变量使其成为私有变量,这称之为闭包

版本特性

ES5

2009年发布2010年几乎所有浏览器支持

  1. 出现了严格模式,文件开头添加"use script"启用
  2. 可以使用\进行字符串的换号,之前只能使用+号拼接

ES6

2015年发布,后续每年发布一个版本,按ES+年份作为版本号

  1. 添加了一系列数学方法
  2. 添加了反引号来表示字符串,可以在其中插入变量
  3. 添加了for/of用于循环所有可迭代对象,包括但不限于数组、集合、映射、字符串
  4. 添加了符号Symbol,同时也可以作为对象的属性名
  5. ES6之后在对象字面量语法中可以省略function
  6. 添加定型数组typed array相比普通数组有极高的性能
  7. 可以直接在函数的形参后面使用=表达式的方式设置默认值
  8. 出现了classsuper关键字
  9. 出现了生成器

ES2016

  1. 添加了幂**运算符

ES2017

  1. 添加async/await

ES2018

  1. 添加了for/await
  2. 对象解构可以使用...剩余形参的形式收集属性
  3. 拓展了正则表达式语法
  4. 添加promisefinally方法

ES2019

  1. 可以省略catch的()
  2. 添加flat函数用于打平数组

ES2020

  1. 定义了gloablThis作为任何环境下的上下文对象
  2. 添加了条件式属性访问?./?.[]
  3. 添加了条件式调用?.()
  4. 添加了??缺值合并操作符
  5. 添加了meatchAll方法

知识点

  1. 在设置默认值时如果使用||会判断是否为假值,如果值有可能为零或者空字符串就不能使用这种方式,需要使用??来判断是否为nullundefined
  2. JSON是JavaScript特有的JavaScriptObjectNotation(JavaScript对象表示法)
  3. toSting一般不能提供太多信息,需要自己在对象中定义
  4. valueOf一般只会返回对象本身,一般需要自己定义
  5. toJSON在使用JSON.stringify的时候会先从对象上寻找toJSON方法,并使用这个返回值
  6. 字符串也可以像数组一样操作,因为字符串类似一个只读数组
  7. 类内代码始终为严格模式
  8. esm模式的代码自动为严格模式
  9. esm模式下严格模式顶级代码中this也是undefined
  10. 类中函数声明不会提升
  11. 在类中添加static关键字后只能使用类名调用,不能使用实例调用,因为静态方法是类的属性,而不是原型的属性
  12. 在调用super之前不能使用this,必须保证父类先于子类初始化
  13. 如果子类定义了构造函数,那么必须调用super
  14. 面向对象应该遵守能组合则不继承的准则
  15. 在使用esm的时候,告诉打包工具入口文件一般会将入口文件以及静态文件汇总为一个大文件,然后将import()动态导入的拆分为多个小文件,实现按需加载
  16. 在查询方面Set的has比数组的includes要快很多
  17. Set没有索引,但是会记住元素插入的顺序
  18. Map和Set一样按插入顺序迭代
  19. 在使用promise的时候应该尽可能的添加catch,因为如果不添加异步的错误一般会默默发生,导致难以调试

ES6模块

// import
import a from './a.js'

import { one } from './b.js'

import { one as another } from './c.js'

import * as d from './d.js'

// export
export default const e = 'easy~';

export { f } from 'f.js'

export { g as great }

export { h } from './h.js'

文件模块

目录信息

  • 当前执行文件目录process.cwd()
  • 当前文件的绝对路径__filename
  • 当前文件文件夹的绝对路径__dirname
  • 用户的主目录os.homedir()
  • 系统目录分隔符path.sep

文件操作

每个方法都有相对应的同步和异步还有promise实现

  • 读取文件fs.read()
  • 写入文件fs.writeFile()
  • 添加内容fs.appendFile()
  • 打开文件fs.open()
  • 截掉内容fs.truncate()
  • 复制文件fs.copyFile()
  • 重命名/移动fs.rename()
  • 获取文件或目录的元信息fs.stat()
  • 设置文件权限fs.chmod()
  • 设置目录权限fs.chown
  • 创建目录fs.mkdir()
  • 删除目录fs.rmdir()
  • 列出目录fs.readdir()
  • 流式列出目录fs.opendir()

纠正

  1. 逻辑与或非并不是返回布尔值,而是返回(真/假)值本身,并非单纯的true/false
  2. 使用多个await时如果不依赖于其他的异步值,那么他们不必按照顺序执行,而且同时执
  3. 同一个JavaScript文件加载到HTML文档中多次只会运行一次

问答

  • 2.1JavaScript是否严格区分大小写
  • 2.3什么是字面量?
  • 2.4什么是标识符?
  • 2.4JavaScript的Unicode支持如何,在编程时应该尽量使用ASCII字母和数字
  • 2.6可选的分号?
  • 3.1JavaScript按类型可以分那两种类型
  • 3.1除什么之外都是对象?
  • 3.2.4为什么会出现0.1+0.2的浮点数错误,如何解决
  • 3.3JavaScript字符串使用的是多少位无符号不可修改的有序序列
  • 3.4JavaScript所有变量都可以转化为布尔值吗?分别称之为?
  • 3.5JavaScript种的特殊值null和undefined通常表示什么意思,区别是什么?
  • 3.6ES6新增的Symbol类型如何创建?如何使用相同的字符串获取同一个Symbol?
  • 3.7浏览器和Node中的全局对象是什么?全局对象标准是什么?
  • 3.8原始值可以修改吗?
  • 3.9.2如何进行显示转换?
  • 3.9.3对象如何向原始数值转换?偏字符串算法和偏数值算法
  • 3.10.1不同作用域是否可以重复声明变量
  • 3.10.2为什么使用let而不是var?是因为作用域、变量提升、重复声明无错误的原因吗?
  • 3.10.3解构赋值的两种形式和其用武之地
  • 4.4.1条件式访问符如何使用,触发条件和返回结果是什么
  • 4.8.1加号什么时候进行数值计算什么时候进行字符拼接
  • 4.9.3in操作符的用法与作用
  • 4.10&&、||、??的区别和返回值
  • 4.13.6void操作符如何使用,什么作用
  • 5.4JavaScript中有那些循环语句,区别是什么
  • 6.2创建对象的三种方式
  • 6.3.1为什么JavaScript对象是关联数组
  • 6.4delete的右边要写一个什么表达式?
  • 6.5如何判断对象中是否存在一个属性?
  • 7.1.1[,,]的length是多少
  • 7.4数组的length的多少取决于什么
  • 10.3什么情况下自动应用严格模式

API

array

  1. push
  2. pop
  3. shift
  4. unshift
  5. fill
  6. map
  7. flatMap
  8. flitter
  9. some
  10. every
  11. find
  12. findIndex
  13. reduce
  14. reduceRight
  15. includes
  16. indexOf
  17. lastIndexOf
  18. concat
  19. forEach
  20. entries
  21. sort
  22. reverse
  23. slice
  24. splice
  25. copyWithin
  26. flat
  27. join
  28. Array.of
  29. Array.from
  30. Array.isArray