变量
JavaScript 中声明变量主要有三种方式:var
、let
和 const
。每种方式都有其特定的使用场景和特点。
1. var
- 特点:
- 可以重新声明和赋值。
- 函数作用域:
var
声明的变量在其所在函数内是可见的。
- 存在变量提升(Hoisting):声明会被提升到作用域顶部,但赋值不会。
- 例子:
2. let
- 特点:
- 可以重新赋值,但不能重新声明。
- 块级作用域:
let
声明的变量在其所在的代码块内是可见的。
- 没有变量提升,但会存在暂时性死区(Temporal Dead Zone,TDZ)。
- 例子:
3. const
- 特点:
- 不能重新赋值或重新声明。
- 必须在声明时初始化。
- 块级作用域。
- 常用于声明常量,但对于对象和数组,虽然不能重新赋值,但可以修改其内容。
数据类型
数据类型 | 描述 | 示例 |
---|
原始类型 | Primitive Types | |
String | 表示文本数据,用单引号或双引号包围的字符序列。 | "Hello, World!" |
Number | 表示数字,可以是整数或浮点数。 | 42 , 3.14 |
Boolean | 表示逻辑值,只有两个值:true 或 false 。 | true , false |
Undefined | 表示未定义的值,变量声明但未赋值时的默认值。 | let a; // a 是 undefined |
Null | 表示空值,表示变量没有值。 | let b = null; |
Symbol | 表示唯一的、不可变的数据类型,用于对象属性标识。 | let sym = Symbol('desc'); |
BigInt | 表示任意精度的整数,用于处理大整数。 | let bigInt = 12345678901234567890n; |
对象类型 | Object Types | |
Object | 集合键值对,所有复杂数据结构的基础。 | let obj = { name: 'John', age: 30 }; |
Array | 有序集合,元素可以是任何类型。 | let arr = [1, 'two', 3]; |
Function | 可执行的代码块,定义了特定任务。 | function greet() { return 'Hello'; } |
Date | 表示日期和时间。 | let date = new Date(); |
RegExp | 正则表达式,用于匹配字符串。 | let re = /ab+c/; |
其他类型 | Other Types | |
Null | 表示故意没有值的对象。 | let empty = null; |
1. String
2. Number
3. Boolean
4. Undefined
5. Null
6. Symbol
7. BigInt
8. Object
9. Array
10. Function
11. Date
12. RegExp
类型转换
在 JavaScript 中,类型转换是将一种数据类型转换为另一种数据类型的过程。类型转换可以分为两类:显式转换(Explicit Conversion)和隐式转换(Implicit Conversion)。
1. 显式类型转换
显式类型转换是通过调用函数或使用操作符来强制转换数据类型。
2. 隐式类型转换
隐式类型转换是 JavaScript 在需要时自动进行的类型转换,也称为类型强制(Type Coercion)。
-
字符串转换:当使用 +
运算符时,如果有一个操作数是字符串,另一个操作数会被转换为字符串。
-
数字转换:当使用算术运算符(-
、*
、/
)时,操作数会被转换为数字。
-
布尔转换:在逻辑运算中(&&
、||
、!
),操作数会被转换为布尔值。
3. 特殊值转换
一些特殊值的转换结果如下:
null
转换为数字:0
undefined
转换为数字:NaN
null
转换为布尔值:false
undefined
转换为布尔值:false
- 空字符串
""
转换为数字:0
- 非空字符串转换为数字:字符串内容解析为数字(如果可能),否则为
NaN
- 空字符串
""
转换为布尔值:false
- 非空字符串转换为布尔值:
true
字符串格式化
JavaScript字符串格式化可以通过多种方式实现,以下是几种常见的方法:
1. 使用模板字符串 (Template Literals)
这种方法是最简洁和现代的方式,适用于 ES6 及更高版本。
2. 使用 String.prototype.replace()
可以通过使用 replace()
方法结合正则表达式来实现简单的字符串替换。
3. 使用数组的 join()
方法
这种方法适用于简单的字符串拼接。
4. 自定义格式化函数
可以创建一个通用的格式化函数来处理更复杂的格式化需求。
5. 使用第三方库(如 sprintf-js
)
如果需要更多功能,可以使用第三方库。sprintf-js
是一个流行的库,类似于 C 语言中的 sprintf
函数。
首先需要安装该库:
然后可以这样使用:
6. 使用 String.prototype.concat()
这是一个简单的字符串拼接方法。
运算符
以下是 JavaScript 中常见的运算符及其说明和示例:
运算符类型 | 运算符 | 描述 | 示例 | 结果 |
---|
算术运算符 | + | 加法 | 5 + 2 | 7 |
| - | 减法 | 5 - 2 | 3 |
| * | 乘法 | 5 * 2 | 10 |
| / | 除法 | 5 / 2 | 2.5 |
| % | 取余 | 5 % 2 | 1 |
| ** | 幂运算 | 5 ** 2 | 25 |
| ++ | 自增 | let a = 5; a++ | 6 |
| -- | 自减 | let a = 5; a-- | 4 |
赋值运算符 | = | 赋值 | let a = 5 | a = 5 |
| += | 加法赋值 | let a = 5; a += 2 | a = 7 |
| -= | 减法赋值 | let a = 5; a -= 2 | a = 3 |
| *= | 乘法赋值 | let a = 5; a *= 2 | a = 10 |
| /= | 除法赋值 | let a = 5; a /= 2 | a = 2.5 |
| %= | 取余赋值 | let a = 5; a %= 2 | a = 1 |
| **= | 幂赋值 | let a = 5; a **= 2 | a = 25 |
比较运算符 | == | 等于 | 5 == '5' | true |
| === | 全等 | 5 === '5' | false |
| != | 不等于 | 5 != '5' | false |
| !== | 不全等 | 5 !== '5' | true |
| > | 大于 | 5 > 2 | true |
| < | 小于 | 5 < 2 | false |
| >= | 大于等于 | 5 >= 2 | true |
| <= | 小于等于 | 5 <= 2 | false |
逻辑运算符 | && | 逻辑与 | true && false | false |
| || | 逻辑或 | true || false | true |
| ! | 逻辑非 | !true | false |
位运算符 | & | 按位与 | 5 & 1 | 1 |
| | | 按位或 | 5 | 1 | 5 |
| ^ | 按位异或 | 5 ^ 1 | 4 |
| ~ | 按位非 | ~5 | -6 |
| << | 左移 | 5 << 1 | 10 |
| >> | 右移 | 5 >> 1 | 2 |
| >>> | 无符号右移 | 5 >>> 1 | 2 |
其他运算符 | typeof | 返回变量的数据类型 | typeof 5 | "number" |
| instanceof | 检查对象是否是某个类的实例 | obj instanceof Object | true |
| in | 检查对象中是否存在某个属性 | 'name' in obj | true |
| new | 创建一个对象实例 | let obj = new Object() | obj |
| this | 引用当前对象 | this.name | 当前对象的 name |
| void | 计算表达式但不返回值 | void(0) | undefined |
| , | 计算多个表达式并返回最后一个表达式的值 | (1, 2, 3) | 3 |
| ? : | 三元运算符(条件运算符) | let result = (a > b) ? 'a is greater' : 'b is greater'; | 取决于条件 |
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
其他运算符
控制结构
-
条件语句
-
循环
手动实现for..of
javascript的迭代器是一种具有 next() 方法的对象,每次调用该方法都会返回一个包含 value 和 done 属性的对象。
- 使用迭代器手动实现 for…of
- 使用生成器手动实现 for…of
自定义可迭代对象
函数
-
函数声明
-
函数表达式
-
箭头函数 (ES6)
-
默认参数函数 (ES6)
数组
- 声明和方法
对象
- 访问和修改属性
解构赋值 (ES6)
- 数组
- 对象
扩展运算符和剩余参数 (ES6)
-
扩展运算符
-
剩余参数
类 (ES6)
- 声明和继承
原型链
在 JavaScript 中,每个对象都有一个原型(prototype),对象可以通过原型继承属性和方法。原型链(prototype chain)是实现继承的一种方式,它是一系列对象的链接,这些对象通过原型属性相互连接。
基本概念
-
原型对象 (Prototype Object):
- 每个 JavaScript 对象(除了
null
)都有一个关联的对象,称为原型对象。
- 对象可以通过原型对象继承属性和方法。
-
__proto__
属性:
- 每个对象都有一个
__proto__
属性,指向其原型对象。
- 这个属性是访问内部
[[Prototype]]
的方法。
-
prototype
属性:
- 每个函数(包括构造函数)都有一个
prototype
属性,这个属性指向一个对象,即该构造函数创建的实例的原型。
示例代码
原型链的工作原理
当访问一个对象的属性或方法时,JavaScript 引擎会首先在该对象本身查找。如果找不到,它会沿着原型链向上查找,直到找到该属性或到达原型链的末尾(即 null
)。
模块 (ES6)
- 导出和导入
Promise (ES6)
异步函数 (ES8)