标识符
变量、函数、属性或函数参数的名称。
标识符规则
- 首字符必须是 字母、下划线 或 $
- 其他字符可以是 字母、下划线、$ 或 数字
- 区分大小写
- 关键字保留字不能作为标识符
- 标识符采用驼峰写法,第一个字母小写,剩下的每个单词的首字母大写
严格模式 use strict
一种不同的 JS 解析和执行模型。
- 不规范的写法会被处理
- 不安全的会抛出错误
整个 js 文件启用严格模式,在开头加上
1 |
单独指定一个函数严格模式
1 | function doSomething () { |
变量
变量是松散类型,可以保存任何类型的数据
声明变量
var
let
const
不初始化默认保存 undefined
var
- 变量提升(把变量声明放到作用域的顶部,初始化操作留在原处执行)
- 可以重复声明(变量提升会合为一个声明)
- 函数作用域(成为包含它的函数的局部变量)
- 全局变量会成为 window 对象的属性(可能会覆盖全局属性)
1 | // 变量提升 |
let
- 块作用域(函数内部或 {} 之间的区域)
- 同一个作用域禁止重复声明(作用域中已经存在某个标识符,再使用 let 声明会报错)
- 临时死区(在声明变量之前使用)
- 全局作用域中声明的变量不会成为 window 对象的属性
- for 循环中的行为不一样(每次迭代时都会创建新的绑定)
块作用域:只在当前代码块内有效,执行到代码块外会立即销毁。
临时死区(Temporal Dead Zone):与 var 不同,let 和 const 不会发生变量提升,如果在声明前访问这些变量,即使是 type of 也会触发引用错误。JS 引擎发现变量声明时,要么提升至作用域顶部(var),要么将声明放到 TDZ 中(let、const)。访问 TDZ 中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从 TDZ 中移出,方可正常访问。
1 | // 块作用域 |
const
const 基本与 let 相同。区别如下
- 声明时必须初始化(赋值)
- 不能修改变量引用(可以修改对象内部属性)
- 在 for-in 或 for-of 循环中使用时与 let 一致
最佳实践
- 不使用 var
- const 优先 let 次之(知道未来会修改变量时,再使用let。)
数据类型
ssb nnu o
- String
- Symbol
- Boolean
- Null
- Number
- Undefined
- Object
type of
typoe of 会返回下列字符串
- string
- symbol
- boolean
- number
- function
- undefined
- object 对象 或 null
Undefined
var 或 let 声明了但没有初始化就相当于给变量赋值 undefined
不要显式初始化 undefined
typeof 未声明和未初始化的变量都返回 undefined
建议声明变量的同时进行初始化,这样当 type of 返回 undefined 时,就只当是变量尚未声明。
undefined 的意义就是区分空对象指针 null 和未初始化变量的区别。
Null
空对象指针
声明要保存对象的变量时,建议使用 null 初始化,这样检测是不是 null 就可以知道是否后来被重新赋值了
undefined 由 null 派生而来 null == undefined // true
Boolean
true false
Boolean() 可以转换任意数据类型,返回一个 boolean 值 if()
转换为 false 的值
false、’’、0、NaN、null、undefined
Number
类型转换
- Number()
- parseInt()
- parseFloat() 只解析十进制值
Number() 是转型函数,可用于任何数据类型
后两个函数主要用于将字符串转换为数值。
Number()
- 布尔值 => 1, 0
- 数值直接返回
- null => 0
- undefined => NaN
- ‘’ => 0
- 有效数字字符串返回数字,其他为 NaN
parseInt(, 10)
- ‘’ => NaN
String
字符串是不可变的,一旦创建值就不能修改。
要修改某个变量中的字符串值,必须先销毁原始字符串,然后将包含新值的另一个字符串保存到该变量。
转换为字符串
age.toString()
基本引用类型
构造函数就是用来创造新对象的函数
new 其实就是创建一个对象
new Date()
Date
UTC 时间 保存 1970-01-01 至今所经过的毫秒数
RegExp
原始值包装类型
- Boolean
- Number
- String
包装对象
- JavaScript 中一切皆对象
- 方便原始类型的值调用某些方法或属性
只有引用类型(对象)才有属性和方法,原始类型是没有属性和方法的。
在JavaScript中,“一切皆对象”,包括三种原始类型的值(数值、字符串、布尔值),在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。
包装对象是特殊的引用类型。每当读取数字、字符串和布尔值的属性或方法时,创建的临时对象称做包装对象.
1
2
3
4
5
6
7
8
9// 通过 new 调用 返回的是个对象 type object
const n = new Number(123)
const b = new Boolean(true)
const s = new String('123')
// 直接调用 将任意类型的值,转为原始类型的值。
const n = Number(123)
const b = Boolean(true)
const s = String('123')
包装对象销毁
1 | const str = 'hello'; |