js 基础


一、变量与作用域

1. 变量声明详解

// let 和 const(块级作用域)
{
  let a = 10;
  const b = 20;
  // a 可修改,b 不可修改
  a = 30; // ✅
  // b = 40; ❌ 报错
}
// console.log(a); ❌ 超出作用域

// var(函数作用域,存在变量提升)
function testVar() {
  console.log(x); // undefined(变量提升)
  var x = 5;
}
testVar();

// 变量提升示例
console.log(y); // ❌ 报错(let/const 不会提升)
let y = 10;

2. 数据类型深入

// 类型检测
console.log(typeof "Hello");    // "string"
console.log(typeof null);      // "object"(历史遗留问题)
console.log(Array.isArray([]));// true

// 类型转换
let numStr = "123";
console.log(Number(numStr));   // 123(显式转换)
console.log(+"456");          // 456(隐式转换)

// 引用类型陷阱
let arr1 = [1, 2];
let arr2 = arr1;
arr2.push(3);
console.log(arr1); // [1, 2, 3](共享内存地址)

二、运算符与表达式

1. 特殊运算符

// 三元运算符
let price = 100;
let discount = price > 80 ? 0.9 : 1;
console.log(discount); // 0.9

// 空值合并运算符(??)
let input = null;
let value = input ?? "default"; // "default"

// 可选链(?.)
const user = { address: { city: "Beijing" } };
console.log(user?.address?.city); // "Beijing"
console.log(user?.phone?.number); // undefined(不报错)

2. 逻辑运算的短路特性

// && 短路:左侧为假时直接返回左侧
console.log(0 && "Hello"); // 0
// || 短路:左侧为真时直接返回左侧
console.log("Hi" || "Fallback"); // "Hi"

三、流程控制进阶

1. 循环的更多用法

// for...of 遍历数组
const fruits = ["apple", "banana"];
for (const fruit of fruits) {
  console.log(fruit); // apple, banana
}

// for...in 遍历对象属性
const obj = { a: 1, b: 2 };
for (const key in obj) {
  console.log(key, obj[key]); // a 1, b 2
}

// break 和 continue
for (let i = 0; i < 10; i++) {
  if (i === 5) break;    // 退出循环
  if (i % 2 === 0) continue; // 跳过本次循环
  console.log(i); // 输出 1, 3
}

2. 错误处理(try...catch)

try {
  let result = x / 0; // 假设 x 未定义
} catch (error) {
  console.log("错误信息:", error.message); // x is not defined
} finally {
  console.log("无论如何都会执行");
}

四、函数深入

1. 函数作用域与闭包

function outer() {
  let count = 0;
  return function inner() {
    count++;
    console.log(count);
  };
}
const counter = outer();
counter(); // 1
counter(); // 2(闭包保留 count 的状态)

2. 参数传递机制

// 基本类型按值传递
let num = 10;
function changeNum(n) { n = 20; }
changeNum(num);
console.log(num); // 10(未改变)

// 引用类型按引用传递
let arr = [1, 2];
function changeArr(a) { a.push(3); }
changeArr(arr);
console.log(arr); // [1, 2, 3]

五、对象与数组高级操作

1. 对象方法

const person = {
  name: "Alice",
  greet: function() { console.log(`Hello, ${this.name}`); }
};

// 简写方法
const calculator = {
  add(a, b) { return a + b; } // ES6 语法
};

2. 数组高阶函数

const numbers = [1, 2, 3, 4];

// filter
const even = numbers.filter(n => n % 2 === 0); // [2, 4]

// reduce
const sum = numbers.reduce((acc, curr) => acc + curr, 0); // 10

// 解构赋值
const [first, second] = numbers;
console.log(first); // 1

六、DOM 操作实战

1. 动态操作元素

<ul id="list"></ul>
const list = document.getElementById("list");

// 创建并添加元素
const li = document.createElement("li");
li.textContent = "新项目";
li.className = "item";
list.appendChild(li);

// 事件委托(动态元素监听)
list.addEventListener("click", (e) => {
  if (e.target.tagName === "LI") {
    e.target.style.textDecoration = "line-through";
  }
});

2. 表单处理

<input type="text" id="username">
<button id="submitBtn">提交</button>
document.getElementById("submitBtn").addEventListener("click", () => {
  const input = document.getElementById("username");
  console.log("输入的值:", input.value); // 获取输入内容
  input.value = ""; // 清空输入框
});

七、异步编程核心

1. Promise 链式调用

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve("数据加载成功"), 1000);
  });
}

fetchData()
  .then(data => {
    console.log(data); // "数据加载成功"
    return "下一步处理";
  })
  .then(result => console.log(result))
  .catch(error => console.error(error));

2. async/await

async function getUser() {
  try {
    const response = await fetch('https://api.example.com/user');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.log("请求失败:", error);
  }
}
getUser();

八、常见陷阱与最佳实践

1. 避免的常见错误

// 循环中的 var 陷阱
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // 输出 3, 3, 3(改用 let 解决)
}

// 比较 NaN
console.log(NaN === NaN); // false(正确方法:Number.isNaN(NaN))

2. 代码规范建议

  • 使用 === 替代 ==
  • 优先使用 const,其次 let,避免 var
  • 使用模板字符串(
  • 启用严格模式:在文件顶部添加 'use strict';

Read more

rust 模块

一、模块系统的基础 1. 模块的定义 模块是 Rust 中组织代码的基本单元。通过模块,你可以将代码划分为逻辑单元,控制可见性,避免命名冲突。 * 定义模块: mod my_module { // 模块内容 } * 模块的作用域: 模块内的项(函数、结构体、枚举等)默认是私有的,只能在模块内部访问。使用 pub 关键字可以公开这些项。 2. 模块的可见性 * 私有(默认):只能在模块内部访问。 * 公开(pub):可以在模块外部访问。 * 受限公开: * pub(crate):在整个 crate 内可见。 * pub(super):在父模块中可见。 * pub(in path):在指定路径下可见。 示例: mod outer

By amm

MongoDB

1. 安装 MongoDB 1.1 在 Windows 上安装 1. 下载 MongoDB: * 访问 MongoDB 官方网站 下载适合 Windows 的安装包。 2. 安装 MongoDB: * 运行下载的安装程序,按照提示完成安装。 3. 设置环境变量: * 将 MongoDB 的 bin 目录添加到系统的环境变量中,以便在命令行中使用 mongo 和 mongod 命令。 4. 创建数据目录: * 默认情况下,MongoDB 会在 C:\data\db 目录下存储数据。你可以手动创建这个目录,或者在启动 MongoDB 时指定其他目录。 1.2 在

By amm

© 2025 路不易All rights reserved.

备案号:黔ICP备2025043243号-1 | 公安备案图标 贵公网安备52052402000220号