JavaScript Fundamentals - part 1

67 阅读4分钟

JavaScript Fundamentals - part 1

JavaScript

JavaScript is a dynamic language with dynamic types. Variables in JavaScript are not directly associated with any particular value type, and any variable can be assigned (and re-assigned) values of all types:

 let foo = 42; // foo is now a number
 foo = "bar"; // foo is now a string
 foo = true; // foo is now a boolean

JavaScript is also a weakly typed language, which means it allows implicit type conversion when an operation involves mismatched types, instead of throwing type errors.

Data Types

除了 Object 以外,所有类型都定义了表示在语言最低层面的不可变值。我们将这些值称为原始值

除了 null,所有原始类型都可以使用 typeof 运算符进行测试。typeof null 返回 "object",因此必须使用 === null 来测试 null

The 7 Primitive Data Type:

类型typeof 返回值对象包装器
Null"object"不适用
Undefined"undefined"不适用
Boolean"boolean"Boolean
Number"number"Number
BigInt"bigint"BigInt
String"string"String
Symbol"symbol"Symbol

Null 类型

Null 类型只有一个值:null

Undefined 类型

Undefined 类型只有一个值:undefined

从概念上讲,undefined 表示的缺失,null 表示对象的缺失(这也可以说明 typeof null === "object" 的原因)。当某些东西没有值时,该语言通常默认为 undefined

  • 没有值(return;)的 return 语句,隐式返回 undefined
  • 访问不存在的对象属性(obj.iDontExist),返回 undefined
  • 变量声明时没有初始化(let x;),隐式初始化为 undefined
  • 许多像 Array.prototype.find()Map.prototype.get() 的方法,当没有找到元素时,返回 undefined

null 在核心语言中使用频率少得多。最重要的地方是原型链的末端,其次是与原型交互的方法,如 Object.getPrototypeOf()Object.create() 等,接受或返回 null 而不是 undefined

null 是一个关键字,但是 undefined 是一个普通的标识符,恰好是一个全局属性。在实践中,这两个差异很小,因为 undefined 不应该被重新定义或者遮蔽。

Boolean 类型

Boolean 类型表示一个逻辑实体并且包括两个值:truefalse

布尔值通常用于条件运算,包括三元运算符if...elsewhile 等。

Number 类型

Number 类型是一种基于 IEEE 754 标准的双精度 64 位二进制格式的值

它能够存储 210742^{-1074}Number.MIN_VALUE)和 210242^{1024}Number.MAX_VALUE)之间的正浮点数,以及 21074-2^{-1074}21024-2^{1024} 之间的负浮点数,但是它仅能安全地存储在 (2531)-(2^{53} − 1)Number.MIN_SAFE_INTEGER)到 25312^{53} − 1​(Number.MAX_SAFE_INTEGER)范围内的整数。超出这个范围,JavaScript 将不能安全地表示整数;相反,它们将由双精度浮点近似表示。你可以使用 Number.isSafeInteger() 检查一个数是否在安全的整数范围内。

NaN(“Not a Number”)是一个特殊种类的数值,当算术运算的结果不表示数值时,通常会遇到它。它也是 JavaScript 中唯一不等于自身的值。

BigInt 类型

BigInt 类型在 JavaScript 中是一个数字的原始值,它可以表示任意大小的整数。使用 BigInt,你可以安全地存储和操作巨大的整数,甚至超过 Number 的安全整数限制(Number.MAX_SAFE_INTEGER)。

 // BigInt
 const x = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
 x + 1n === x + 2n; // false,因为 9007199254740992n 和 9007199254740993n 不相等
 ​
 // Number
 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true,因为都等于 9007199254740992

String 类型

String 类型表示文本数据并编码为 UTF-16 码元的 16 位无符号整数值序列。字符串中的每个元素在字符串中占据一个位置。第一个元素的索引为 0,下一个是索引 1,依此类推。字符串的长度是它的元素的数量。字符串的长度是其中的 UTF-16 代码单元的数量,这可能与 Unicode 字符的实际数量不符;更多细节参见 String 参考页面。

JavaScript 字符串是不可变的。这意味着一旦字符串被创建,就不可能修改它。字符串方法基于当前字符串的内容创建一个新的字符串——例如:

  • 使用 substring() 获取原始的子字符串。
  • 使用串联运算符(+)或 concat() 将两个字符串串联。

Symbol 类型

Symbol唯一并且不可变的原始值并且可以用来作为对象属性的键(如下)。在某些程序语言当中,Symbol 也被称作“原子(atom)类型”。symbol 的目的是去创建一个唯一属性键,保证不会与其他代码中的键产生冲突。