Skip to content

JavaScript 基础

1. 数据类型

a. 基本数据类型:

  • Number:

    js
    // 表示整数或浮点数
    let num = 1.5;
  • String:

    js
    // 表示文本
    let str = "Hello";
  • Boolean:

    js
    // 表示真或假
    let bool = true;
  • Undefined:

    js
    // 表示未定义的值
    let und;
  • Null:

    js
    // 表示空值
    let nullVar = null;
  • BigInt:

    js
    // 表示任意大的整数
    let bigIntLiteral = 9007199254740993n;
    let bigIntConstructed = BigInt("9007199254740993");
  • Symbol:

    js
    // 表示唯一的值,主要用作对象属性的键
    let sym = Symbol("description");
    let obj = { [sym]: "John" };

b. 复杂数据类型:

  • Object:

    js
    const person = { name: "John", age: 30 };
  • Array:

    js
    const fruits = ["apple", "banana", "cherry"];
  • Function:

    js
    function greet() {
      console.log("Hello, World!");
    }
  • 等等: 如 RegExp, Map, Set, Error, Promise, ArrayBuffer, Date 等。

2. 变量

js
// var, let, const 用于声明变量
var name = "John"; // 函数作用域
let age = 30; // 块作用域
const pi = 3.14; // 常量,块作用域

3. 函数

js
// 函数是一段可重复使用的代码块,可以接受参数,返回结果
function greet(name) {
  return "Hello, " + name + "!";
}
const greetArrow = (name) => `Hello, ${name}!`; // 箭头函数,不绑定 this

4. 对象

js
// 对象用于存储和管理键值对
var person = {
  name: "John",
  age: 30,
  greet: function () {
    return "Hello, " + this.name + "!";
  },
};

5. 事件

html
<!-- 事件用于处理用户交互和其他的浏览器行为 -->
<button id="myButton">Click me</button>
<script>
  document.getElementById("myButton").addEventListener("click", function () {
    alert("Button Clicked!");
  });
</script>

6. 错误处理

js
// try...catch 用于处理运行时错误
try {
  /*可能出错的代码*/
} catch (error) {
  console.error(error);
}

7. 异步编程

js
// async/await 和 Promises 用于异步编程
async function fetchData() {
  try {
    let response = await fetch("https://api.example.com/data");
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error("Error during fetching data:", error);
  }
}

常见问题

1. Symbol 类型怎么使用

Symbol 类型在 JavaScript 中是一种原始数据类型,用于创建唯一的标识符,主要用于对象的属性键。由于 Symbol 值是唯一的,所以可以防止属性名的冲突,特别是当你使用第三方库时,避免内部属性被覆盖。

使用 BigInt 字面量:

javascript
let bigIntLiteral = 9007199254740993n; // 直接在数字后面加 'n'

使用 BigInt 函数:

javascript
let bigIntConstructed = BigInt("9007199254740993"); // 使用字符串参数
// 或者
let bigIntConstructed2 = BigInt(9007199254740993); // 使用数字参数,但只在不会丢失精度的情况下

BigInt 示例

下面是一个简单的例子,初始化了一个超过 Number.MAX_SAFE_INTEGERBigInt

javascript
let maxSafeInteger = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(maxSafeInteger); // 输出: 9007199254740991

let bigIntNumber = BigInt(maxSafeInteger) + 2n;
console.log(bigIntNumber); // 输出: 9007199254740993n

当您使用超过 Number.MAX_SAFE_INTEGER 的数值时,建议始终使用 BigInt,以避免任何与数值精度有关的问题。

2. BigInt 可以转为字符串吗?为什么 我输入一个很长的数据转换成字符串不对了

BigInt 类型确实可以转为字符串。可以使用 toString() 方法将 BigInt 类型的值转换为字符串。例如:

javascript
let bigInt = 1234567890123456789012345678901234567890n;
let str = bigInt.toString(); // "1234567890123456789012345678901234567890"

但是,如果你试图将一个非常大的 BigInt 值转换为 Number 类型的值,再将其转换为字符串,可能会导致精度丢失。因为 Number 类型只能安全地表示到 2^53 - 1(即 Number.MAX_SAFE_INTEGER)的整数值。超出这个范围的值在转换过程中会丢失精度。

javascript
let bigInt = 1234567890123456789012345678901234567890n;
let num = Number(bigInt); // 不安全的转换,会导致精度丢失
let str = num.toString(); // 得到的字符串不会与原始的 BigInt 值匹配

如果你遇到 BigInt 转字符串不正确的问题,可能是因为在转换过程中涉及了不安全的类型转换。在处理超出 Number.MAX_SAFE_INTEGER 范围的大整数时,应该直接使用 BigInttoString() 方法,避免不必要的类型转换。

3. 我如何初始化一个超过 Number.MAX_SAFE_INTEGER 的数

要初始化一个超过 Number.MAX_SAFE_INTEGER 的数,您应该使用 BigInt。您可以直接在数字的后面加一个 n,以表示这是一个 BigInt 类型的字面量,或者使用 BigInt 函数。下面是一些例子:

4. Node.js 中可以使用 BigInt 吗

是的,在 Node.js 中也可以使用 BigInt,因为 Node.js 基于 JavaScript 的 V8 引擎,支持 ECMAScript 的规范,包括 BigInt。使用 BigInt 的方法与在浏览器中的 JavaScript 中使用 BigInt 的方法相同。

例如,您可以在 Node.js 中创建和操作 BigInt 类型的值,如下所示:

javascript
let bigIntLiteral = 9007199254740993n; // 使用 BigInt 字面量

let bigIntConstructed = BigInt("9007199254740993"); // 使用 BigInt 函数

console.log(bigIntLiteral + bigIntConstructed); // 输出: 18014398509481986n

在 Node.js 中,您可以用 BigInt 处理大于 2^53 - 1Number.MAX_SAFE_INTEGER)的整数值,避免精度丢失问题。

5. Symbol 类型怎么使用

创建 Symbol

要创建 Symbol,你可以使用 Symbol() 函数。可以选择传递一个字符串作为 Symbol 的描述,这个描述可以帮助你在调试时识别 Symbol。

javascript
let sym1 = Symbol("description");
let sym2 = Symbol("description"); // 即便描述相同,sym1 和 sym2 也是不同的 Symbol。

使用 Symbol 作为对象属性

一旦你创建了一个 Symbol,你可以将它用作对象属性的键:

javascript
let sym = Symbol("name");

let obj = {
  [sym]: "John",
};

console.log(obj[sym]); // 输出 "John"

注意,由于 Symbol 是唯一的,所以 obj[sym] 只能通过 sym 访问,无法通过字符串 'name' 访问。也就是说,obj['name']obj[sym] 是完全不同的属性。

使用 Object.getOwnPropertySymbols

Object.getOwnPropertySymbols 方法可以用于获取对象中的所有 Symbol 属性:

javascript
let sym = Symbol("name");
let obj = {
  [sym]: "John",
  age: 30,
};

let symbols = Object.getOwnPropertySymbols(obj); // 返回一个包含对象中的所有 Symbol 属性的数组
console.log(symbols); // 输出 [ Symbol(name) ]

Symbol.for 和 Symbol.keyFor

Symbol.for 方法接受一个字符串参数,并在全局 Symbol 注册表中搜索具有该描述的 Symbol。如果存在,则返回该 Symbol;否则,将创建一个新的 Symbol。

javascript
let sym1 = Symbol.for("shared");
let sym2 = Symbol.for("shared");

console.log(sym1 === sym2); // 输出 true

Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。

javascript
let sym = Symbol.for("shared");
console.log(Symbol.keyFor(sym)); // 输出 'shared'

这些都是在 JavaScript 中使用 Symbol 类型的基本方式,可以帮助你更灵活地处理对象的属性。