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:
jsconst person = { name: "John", age: 30 };
Array:
jsconst fruits = ["apple", "banana", "cherry"];
Function:
jsfunction greet() { console.log("Hello, World!"); }
等等: 如 RegExp, Map, Set, Error, Promise, ArrayBuffer, Date 等。
2. 变量
// var, let, const 用于声明变量
var name = "John"; // 函数作用域
let age = 30; // 块作用域
const pi = 3.14; // 常量,块作用域
3. 函数
// 函数是一段可重复使用的代码块,可以接受参数,返回结果
function greet(name) {
return "Hello, " + name + "!";
}
const greetArrow = (name) => `Hello, ${name}!`; // 箭头函数,不绑定 this
4. 对象
// 对象用于存储和管理键值对
var person = {
name: "John",
age: 30,
greet: function () {
return "Hello, " + this.name + "!";
},
};
5. 事件
<!-- 事件用于处理用户交互和其他的浏览器行为 -->
<button id="myButton">Click me</button>
<script>
document.getElementById("myButton").addEventListener("click", function () {
alert("Button Clicked!");
});
</script>
6. 错误处理
// try...catch 用于处理运行时错误
try {
/*可能出错的代码*/
} catch (error) {
console.error(error);
}
7. 异步编程
// 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
字面量:
let bigIntLiteral = 9007199254740993n; // 直接在数字后面加 'n'
使用 BigInt
函数:
let bigIntConstructed = BigInt("9007199254740993"); // 使用字符串参数
// 或者
let bigIntConstructed2 = BigInt(9007199254740993); // 使用数字参数,但只在不会丢失精度的情况下
BigInt 示例
下面是一个简单的例子,初始化了一个超过 Number.MAX_SAFE_INTEGER
的 BigInt
:
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
类型的值转换为字符串。例如:
let bigInt = 1234567890123456789012345678901234567890n;
let str = bigInt.toString(); // "1234567890123456789012345678901234567890"
但是,如果你试图将一个非常大的 BigInt
值转换为 Number
类型的值,再将其转换为字符串,可能会导致精度丢失。因为 Number
类型只能安全地表示到 2^53 - 1
(即 Number.MAX_SAFE_INTEGER
)的整数值。超出这个范围的值在转换过程中会丢失精度。
let bigInt = 1234567890123456789012345678901234567890n;
let num = Number(bigInt); // 不安全的转换,会导致精度丢失
let str = num.toString(); // 得到的字符串不会与原始的 BigInt 值匹配
如果你遇到 BigInt
转字符串不正确的问题,可能是因为在转换过程中涉及了不安全的类型转换。在处理超出 Number.MAX_SAFE_INTEGER
范围的大整数时,应该直接使用 BigInt
的 toString()
方法,避免不必要的类型转换。
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
类型的值,如下所示:
let bigIntLiteral = 9007199254740993n; // 使用 BigInt 字面量
let bigIntConstructed = BigInt("9007199254740993"); // 使用 BigInt 函数
console.log(bigIntLiteral + bigIntConstructed); // 输出: 18014398509481986n
在 Node.js 中,您可以用 BigInt
处理大于 2^53 - 1
(Number.MAX_SAFE_INTEGER
)的整数值,避免精度丢失问题。
5. Symbol 类型怎么使用
创建 Symbol
要创建 Symbol,你可以使用 Symbol()
函数。可以选择传递一个字符串作为 Symbol 的描述,这个描述可以帮助你在调试时识别 Symbol。
let sym1 = Symbol("description");
let sym2 = Symbol("description"); // 即便描述相同,sym1 和 sym2 也是不同的 Symbol。
使用 Symbol 作为对象属性
一旦你创建了一个 Symbol,你可以将它用作对象属性的键:
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 属性:
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。
let sym1 = Symbol.for("shared");
let sym2 = Symbol.for("shared");
console.log(sym1 === sym2); // 输出 true
Symbol.keyFor
方法返回一个已登记的 Symbol 类型值的 key。
let sym = Symbol.for("shared");
console.log(Symbol.keyFor(sym)); // 输出 'shared'
这些都是在 JavaScript 中使用 Symbol
类型的基本方式,可以帮助你更灵活地处理对象的属性。