JavaScript查漏补缺(1)—— 基础语法

124 阅读4分钟

依照《JavaScript高级程序设计》 第七版梳理

HTML中的JavaScript

script标签的属性

  • async:立即开始下载,不阻塞,只对外部脚本有效,不影响DOMContentLoaded事件,执行按照下载完成顺序而非页面顺序。
  • defer:立即开始后台下载,在渲染完成后执行,执行完毕后触发DomContentLoaded事件,执行时按页面顺序执行。
  • src:文件链接
  • type:module代表ES6模块

变量

  • 标识符:Unicode编码,第一字符不能是数字
  • 关键字:不能用作标识符
  • 保留字,用于未来的用途,同关键字

var/let/const

  • var在全局声明时会成为window的属性,而let不会
  • var有函数作用域,有变量提升,let为块作用域
  • 暂时性死区:在let声明前引用变量
  • for循环的每次循环都有单独的块级作用域
  • const必须设置初始值,不能用于循环中可变的变量声明,其余与let一致

数据类型

原始类型

  • undefined
  • null
  • Boolean
  • Number
  • String
  • Symbol
  • BigInt

一种引用类型:Object

typeof的输出(string):

  • undefined
  • boolean
  • string
  • number
  • object (非函数的对象,或者null)
  • function
  • symbol
  • bigint

Number

  • 用0x开头表示十六进制,如:0xA,0x1f (可能不区分大小写)
  • 用0o开头表示八进制
  • 浮点数计算会不准,因为使用了IEEE754数值
  • Number.MAX_VALUE > 0,Number.MIN_VALUE = 5e-234 > 0
  • x/0 === Infinity / -Infinity (x !== 0), 0/0 === NaN
  • Number规则:
    • null => 0
    • false => 0, true => 1
    • undefined => NaN
    • string
      • 尝试转换为十进制,忽略前导零
      • 尝试十六进制
      • 空字符串返回0
      • 匹配失败返回NaN
    • object
      • 调用valueOf(),若为NaN,调用toString()后按字符串解析。
  • parseInt:
    • 从非空字符开始转换,支持前导零
    • 出现非数字字符串立即返回当前解析结果(前缀有非数字字符就为null,后缀非数字字符会被忽略,空字符串返回NaN)
    • 第二个参数表示底,默认自动
  • parseFloat:
    • 基本同parseInt,但没有第二个参数,只支持十进制
    • 解析到第二个小数点时直接返回当前解析结果
  • toString方法可以接受一个参数表示要转换的进制

String

  • 字面量:
    • \xnn:以十六进制编码的字符编码
    • \unnnn:以十六进制编码的Unicode编码
    • 字符串模板标签函数:
      • 第一个参数是一个字符串数组,组内是模板被n个变量分隔的n+1个子串
      • 后n个参数是变量值
      • 标签函数允许自行组织字符串模板的编排方式
      • 第一个参为Array,有一个raw属性,表示原始字符串,格式与第一个参数相同

Symbol

  • 不能使用new
  • Symbol.for创建可重用符号,一个参数表示key,仅接受字符串,Symbol.keyFor用于获取一个symbol的key
  • Object.getOwnPropertyNames与getOwnPropertySymbols互斥,其余方法都同时返回两种属性
  • 内置符号:在Symbol的属性中定义,常用@@开头表示,如@@iterator表示Symbol.iterator。内置符号用于某些语言内置逻辑的控制,如@@iterator在for-of循环中,用于相关对象的循环判断。

Object

  • 每个object实例都有如下属性/方法
    • constructor:用于创建当前对象的函数
    • hasOwnProoerty(name):当前实例是否有属性,仅接受字符串属性
    • isPrototypeOf(object):是否是另一个对象的原型
    • propertyIsEnumerable():是否可枚举(for-in),仅接受字符串属性
    • toLocaleString()
    • toString()
    • valueOf()

操作符

位操作

  • ~:非
  • &:与
  • |:或
  • ^:异或
  • <<:左移
  • >>:有符号右移
  • >>>:无符号右移

类型转换

  • 加法中,有字符串则全转字符串,否则全转数字
  • 减法中,全转数字
  • 对象转字符串,toString()
  • 对象转数值,先尝试valueOf(),若返回不是原始值,则使用toString(),再转数值

等于和不等于

全等(===)

  • 类型不同则不等
  • NaN与任何值(包含本身)都不等
  • 都是null或都是undefined,相等
  • 都是数值且值相等,则相等,否则不等(+0和-0相等)
  • 都是字符串,且各位的编码值相等(如,'\x41' == 'A'),则相等,否则不等
  • 引用统一对象,则相等

相等(==)

  • 如果类型相同,按全等符号规则判断
  • 如果不同,按如下规则发起类型转换
    • null == undefined
    • 一个是number,一个是string,则都转换为number比较
    • boolean都转换为数值再比较
    • 一个值是对象,另一个值是number或string,先将对象转为number/string,再比较

语句

  • switch采用全等判断case
  • 标签语句(xxx:)配合continue/break后用空格连接标签名,实现复杂的流程控制,常用于跳出嵌套循环
  • for...in:循环对象的可枚举属性,包括继承的属性
  • for...of:遍历可迭代对象

函数

  • 函数不能以eval和arguments命名

作用域与内存

  • 两种类型,原始值保存在栈上,引用值保存在堆上
  • 所有函数都是传值
  • 上下文分为全局,函数,块三种,进入新的上下文,会创建作用域链
  • JS使用垃圾回收,基于标记清理