首页 > 编程语言 >JavaScript 学习教程:从入门到精通

JavaScript 学习教程:从入门到精通

时间:2024-07-02 14:31:01浏览次数:3  
标签:输出 教程 console 入门 JavaScript name let log

JavaScript 学习教程:从入门到精通

JavaScript 是网页开发过程中不可或缺的一部分,无论你是初学者还是有一定基础的开发者,这篇教程将帮助你更深入地理解和运用 JavaScript。本文将分为多个章节,涵盖 JavaScript 的基本概念、高级技术、常用库和框架,以及实际项目案例。

目录

  1. JavaScript 简介
  2. 基本语法
  3. 数据类型和变量
  4. 运算符和表达式
  5. 控制流语句
  6. 函数
  7. 对象和数组
  8. DOM 操作
  9. 事件处理
  10. 异步编程
  11. ES6+ 新特性
  12. 常用库和框架
  13. 实际项目案例
  14. 总结

JavaScript 简介

JavaScript 是一种高级、解释型编程语言,主要用于创建动态和交互性的网页。与 HTML 和 CSS 一起,JavaScript 被认为是万维网的三大核心技术之一。HTML 用于结构化内容,CSS 用于样式化内容,而 JavaScript 则用于实现网页的动态行为。

历史背景

JavaScript 由 Brendan Eich 于 1995 年在 Netscape 公司开发。最初,JavaScript 被称为 Mocha,然后改名为 LiveScript,最后在与 Java 语言合作推广时改名为 JavaScript。尽管名称相似,Java 和 JavaScript 是两种完全不同的编程语言。

JavaScript 的特点

  • 跨平台:JavaScript 可以在各种操作系统和设备上运行。
  • 解释型语言:不需要编译,直接由浏览器解释执行。
  • 动态类型:变量的类型在运行时确定。
  • 面向对象:支持基于原型的面向对象编程。

基本语法

在开始编写 JavaScript 代码之前,我们需要了解 JavaScript 的基本语法。以下是一些基本语法规则:

注释

JavaScript 支持单行注释和多行注释:

// 这是单行注释

/*
这是多行注释
可以跨越多行
*/

变量声明

在 JavaScript 中,可以使用 varletconst 来声明变量:

var x = 10; // 使用 var 声明变量(不推荐)
let y = 20; // 使用 let 声明变量(推荐)
const z = 30; // 使用 const 声明常量

数据类型

JavaScript 中有以下几种基本数据类型:

  • Number:数字类型,如 1233.14
  • String:字符串类型,如 "hello"'world'
  • Boolean:布尔类型,值为 truefalse
  • Null:表示空值
  • Undefined:表示未定义
  • Object:对象类型
  • Symbol:符号类型(ES6 新增)

示例代码

let name = "Alice"; // 字符串
let age = 25; // 数字
let isStudent = true; // 布尔值
let address = null; // 空值
let phoneNumber; // 未定义

console.log(name); // 输出: Alice
console.log(age); // 输出: 25
console.log(isStudent); // 输出: true
console.log(address); // 输出: null
console.log(phoneNumber); // 输出: undefined

数据类型和变量

数字类型

JavaScript 中的数字类型包括整数和浮点数。可以使用基本的数学运算符(如 +-*/%)进行运算。

let a = 10;
let b = 3.14;
let sum = a + b;
console.log(sum); // 输出: 13.14

字符串类型

字符串可以使用双引号(")或单引号(')包围。字符串具有多种方法,可以进行字符串操作。

let firstName = "John";
let lastName = 'Doe';
let fullName = firstName + " " + lastName;
console.log(fullName); // 输出: John Doe

let message = "Hello, world!";
console.log(message.length); // 输出: 13
console.log(message.toUpperCase()); // 输出: HELLO, WORLD!

布尔类型

布尔类型只有两个值:truefalse。布尔值常用于条件判断。

let isLoggedIn = true;
let hasPaid = false;

if (isLoggedIn) {
  console.log("User is logged in");
}

if (!hasPaid) {
  console.log("User has not paid");
}

Null 和 Undefined

null 表示空值,通常用于显式赋值。undefined 表示变量未定义,通常在变量未初始化时出现。

let emptyValue = null;
let notInitialized;

console.log(emptyValue); // 输出: null
console.log(notInitialized); // 输出: undefined

对象类型

对象是键值对的集合,可以用于存储复杂的数据结构。

let person = {
  name: "Alice",
  age: 30,
  isStudent: false
};

console.log(person.name); // 输出: Alice
console.log(person["age"]); // 输出: 30

数组类型

数组是一种特殊的对象,用于存储有序的值列表。

let fruits = ["apple", "banana", "cherry"];
console.log(fruits[0]); // 输出: apple
console.log(fruits.length); // 输出: 3

fruits.push("date");
console.log(fruits); // 输出: ["apple", "banana", "cherry", "date"]

运算符和表达式

JavaScript 中有多种运算符和表达式,用于执行各种操作。

算术运算符

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模
let x = 10;
let y = 3;
console.log(x + y); // 输出: 13
console.log(x - y); // 输出: 7
console.log(x * y); // 输出: 30
console.log(x / y); // 输出: 3.3333333333333335
console.log(x % y); // 输出: 1

比较运算符

  • ==:相等
  • ===:严格相等
  • !=:不等
  • !==:严格不等
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于
let a = 5;
let b = "5";

console.log(a == b); // 输出: true
console.log(a === b); // 输出: false
console.log(a != b); // 输出: false
console.log(a !== b); // 输出: true
console.log(a > 3); // 输出: true
console.log(a < 3); // 输出: false

逻辑运算符

  • &&:与
  • ||:或
  • !:非
let isAdult = true;
let isStudent = false;

console.log(isAdult && isStudent); // 输出: false
console.log(isAdult || isStudent); // 输出: true
console.log(!isAdult); // 输出: false

赋值运算符

  • =:赋值
  • +=:加赋值
  • -=:减赋值
  • *=:乘赋值
  • /=:除赋值
  • %=:取模赋值
let num = 10;

num += 5;
console.log(num); // 输出: 15

num -= 3;
console.log(num); // 输出: 12

num *= 2;
console.log(num); // 输出: 24

num /= 4;
console.log(num); // 输出: 6

num %= 3;
console.log(num); // 输出: 0

控制流语句

控制流语句用于控制代码的执行顺序。常见的控制流语句包括条件语句和循环语句。

条件语句

if 语句
let age = 18;

if (age >= 18) {
  console.log("You are an adult.");
} else {
  console.log("You are a minor.");
}
if…else if…else 语句
let score = 85;

if (score

 >= 90) {
  console.log("Grade: A");
} else if (score >= 80) {
  console.log("Grade: B");
} else if (score >= 70) {
  console.log("Grade: C");
} else if (score >= 60) {
  console.log("Grade: D");
} else {
  console.log("Grade: F");
}
switch 语句
let day = 3;
let dayName;

switch (day) {
  case 1:
    dayName = "Monday";
    break;
  case 2:
    dayName = "Tuesday";
    break;
  case 3:
    dayName = "Wednesday";
    break;
  case 4:
    dayName = "Thursday";
    break;
  case 5:
    dayName = "Friday";
    break;
  case 6:
    dayName = "Saturday";
    break;
  case 7:
    dayName = "Sunday";
    break;
  default:
    dayName = "Invalid day";
}

console.log(dayName); // 输出: Wednesday

循环语句

for 循环
for (let i = 0; i < 5; i++) {
  console.log(i);
}
while 循环
let i = 0;

while (i < 5) {
  console.log(i);
  i++;
}
do…while 循环
let j = 0;

do {
  console.log(j);
  j++;
} while (j < 5);
for…in 循环
let person = {
  name: "Alice",
  age: 30,
  isStudent: false
};

for (let key in person) {
  console.log(key + ": " + person[key]);
}
for…of 循环
let fruits = ["apple", "banana", "cherry"];

for (let fruit of fruits) {
  console.log(fruit);
}

函数

函数是可重复使用的代码块,用于执行特定任务。

函数声明

function greet(name) {
  console.log("Hello, " + name + "!");
}

greet("Alice"); // 输出: Hello, Alice!

函数表达式

let greet = function(name) {
  console.log("Hello, " + name + "!");
};

greet("Bob"); // 输出: Hello, Bob!

箭头函数

箭头函数是 ES6 中引入的一种简洁的函数定义方式。

let greet = (name) => {
  console.log("Hello, " + name + "!");
};

greet("Charlie"); // 输出: Hello, Charlie!

函数参数

函数可以有默认参数、剩余参数和参数解构。

// 默认参数
function greet(name = "Guest") {
  console.log("Hello, " + name + "!");
}

greet(); // 输出: Hello, Guest!

// 剩余参数
function sum(...numbers) {
  let total = 0;
  for (let num of numbers) {
    total += num;
  }
  return total;
}

console.log(sum(1, 2, 3)); // 输出: 6

// 参数解构
function display({ name, age }) {
  console.log("Name: " + name);
  console.log("Age: " + age);
}

let person = { name: "David", age: 35 };
display(person); // 输出: Name: David, Age: 35

递归函数

递归函数是指函数在其定义中调用自身。

function factorial(n) {
  if (n === 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

console.log(factorial(5)); // 输出: 120

对象和数组

创建对象

对象是键值对的集合,用于存储和组织数据。

let person = {
  name: "Alice",
  age: 30,
  isStudent: false,
  greet: function() {
    console.log("Hello, " + this.name + "!");
  }
};

console.log(person.name); // 输出: Alice
person.greet(); // 输出: Hello, Alice!

对象方法

对象方法是定义在对象上的函数。

let person = {
  name: "Bob",
  greet: function() {
    console.log("Hello, " + this.name + "!");
  }
};

person.greet(); // 输出: Hello, Bob!

数组操作

数组是一种特殊的对象,用于存储有序的值列表。

let fruits = ["apple", "banana", "cherry"];

console.log(fruits[0]); // 输出: apple
console.log(fruits.length); // 输出: 3

fruits.push("date");
console.log(fruits); // 输出: ["apple", "banana", "cherry", "date"]

fruits.pop();
console.log(fruits); // 输出: ["apple", "banana", "cherry"]

fruits.shift();
console.log(fruits); // 输出: ["banana", "cherry"]

fruits.unshift("apricot");
console.log(fruits); // 输出: ["apricot", "banana", "cherry"]

数组方法

数组具有多种方法,可以进行数组操作。

let numbers = [1, 2, 3, 4, 5];

let doubled = numbers.map(num => num * 2);
console.log(doubled); // 输出: [2, 4, 6, 8, 10]

let evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // 输出: [2, 4]

let sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // 输出: 15

numbers.forEach(num => console.log(num));
// 输出:
// 1
// 2
// 3
// 4
// 5

DOM 操作

文档对象模型(DOM)是 HTML 和 XML 文档的编程接口。它表示文档的结构,并允许修改文档的内容和样式。

选择元素

可以使用 getElementByIdgetElementsByClassNamegetElementsByTagNamequerySelectorquerySelectorAll 方法选择元素。

<!DOCTYPE html>
<html>
<head>
  <title>DOM 操作示例</title>
</head>
<body>
  <div id="content">
    <p class="text">Hello, world!</p>
    <p class="text">JavaScript is awesome!</p>
  </div>
</body>
</html>
let content = document.getElementById("content");
console.log(content); // 输出: <div id="content">...</div>

let texts = document.getElementsByClassName("text");
console.log(texts); // 输出: HTMLCollection [ <p class="text">...</p>, <p class="text">...</p> ]

let paragraphs = document.getElementsByTagName("p");
console.log(paragraphs); // 输出: HTMLCollection [ <p class="text">...</p>, <p class="text">...</p> ]

let firstText = document.querySelector(".text");
console.log(firstText); // 输出: <p class="text">Hello, world!</p>

let allTexts = document.querySelectorAll(".text");
console.log(allTexts); // 输出: NodeList [ <p class="text">...</p>, <p class="text">...</p> ]

修改元素内容和属性

可以使用 textContentinnerHTMLsetAttributegetAttribute 方法修改元素内容和属性。

let firstText = document.querySelector(".text");
firstText.textContent = "Hello, JavaScript!";
console.log(firstText.textContent); // 输出: Hello, JavaScript!

let content = document.getElementById("content");
content.innerHTML = '<p class="text">New content!</p>';
console.log(content.innerHTML); // 输出: <p class="text">New content!</p>

let firstText = document.querySelector(".text");
firstText.setAttribute("id", "newId");
console.log(firstText.getAttribute("id")); // 输出: newId

创建和删除元素

可以使用 createElementappendChildremoveChildreplaceChild 方法创建和删除元素。

let newParagraph = document.createElement("p");
newParagraph.textContent = "This is a new paragraph.";
document.body.appendChild(newParagraph);

let oldParagraph = document.querySelector(".text");
document.body.removeChild(oldParagraph);

let anotherParagraph = document.createElement("p");
anotherParagraph.textContent = "This is another new paragraph.";
document.body.replaceChild(anotherParagraph, newParagraph);

事件处理

事件是用户与网页交互时发生的动作,如点击按钮、提交表单、加载页面等。

添加事件监听器

可以使用 addEventListener 方法添加事件监听器。

<!DOCTYPE html>
<html>
<head>
  <title>事件处理示例</title>
</head>
<body>
  <button id="myButton">Click me</

button>
</body>
</html>
let button = document.getElementById("myButton");

button.addEventListener("click", function() {
  alert("Button clicked!");
});

常见事件类型

  • 鼠标事件clickdblclickmouseovermouseoutmousemove
  • 键盘事件keydownkeyupkeypress
  • 表单事件submitchangefocusblur
  • 窗口事件loadresizescroll

事件对象

事件对象包含有关事件的信息,如事件的类型、目标元素、鼠标坐标、按键等。

let button = document.getElementById("myButton");

button.addEventListener("click", function(event) {
  console.log("Event type: " + event.type);
  console.log("Target element: " + event.target);
  console.log("Mouse coordinates: (" + event.clientX + ", " + event.clientY + ")");
});

事件传播

事件传播包括捕获阶段、目标阶段和冒泡阶段。可以使用 stopPropagation 方法阻止事件传播。

<!DOCTYPE html>
<html>
<head>
  <title>事件传播示例</title>
</head>
<body>
  <div id="outer">
    <div id="inner">
      <button id="myButton">Click me</button>
    </div>
  </div>
</body>
</html>
let outer = document.getElementById("outer");
let inner = document.getElementById("inner");
let button = document.getElementById("myButton");

outer.addEventListener("click", function() {
  console.log("Outer div clicked");
});

inner.addEventListener("click", function() {
  console.log("Inner div clicked");
});

button.addEventListener("click", function(event) {
  console.log("Button clicked");
  event.stopPropagation();
});

异步编程

JavaScript 是单线程语言,通过异步编程实现并发操作。常见的异步编程技术包括回调函数、Promise 和 async/await。

回调函数

回调函数是作为参数传递给另一个函数,并在合适的时间被调用。

function loadData(callback) {
  setTimeout(() => {
    let data = "Hello, world!";
    callback(data);
  }, 1000);
}

loadData(function(data) {
  console.log(data); // 输出: Hello, world!
});

Promise

Promise 是 ES6 引入的一种用于处理异步操作的对象。

function loadData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let data = "Hello, world!";
      resolve(data);
    }, 1000);
  });
}

loadData().then(data => {
  console.log(data); // 输出: Hello, world!
}).catch(error => {
  console.error(error);
});

async/await

async/await 是 ES8 引入的一种用于处理异步操作的语法糖,使代码更简洁。

function loadData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let data = "Hello, world!";
      resolve(data);
    }, 1000);
  });
}

async function fetchData() {
  try {
    let data = await loadData();
    console.log(data); // 输出: Hello, world!
  } catch (error) {
    console.error(error);
  }
}

fetchData();

ES6+ 新特性

ES6(ECMAScript 2015)及其后的版本引入了许多新特性,以下是一些常见的新特性。

let 和 const

letconst 用于声明块级作用域的变量和常量。

let x = 10;
const y = 20;

x = 15; // 可以重新赋值
// y = 25; // 报错,常量不能重新赋值

箭头函数

箭头函数提供了一种简洁的函数定义方式,并且不绑定 this

let greet = name => {
  console.log("Hello, " + name + "!");
};

greet("Alice"); // 输出: Hello, Alice!

模板字符串

模板字符串使用反引号(``)包围,可以嵌入表达式和多行字符串。

let name = "Bob";
let message = `Hello, ${name}!`;
console.log(message); // 输出: Hello, Bob!

let multiline = `This is
a multiline
string.`;
console.log(multiline);

解构赋值

解构赋值可以从数组和对象中提取值,并赋给变量。

let [a, b] = [1, 2];
console.log(a); // 输出: 1
console.log(b); // 输出: 2

let person = { name: "Charlie", age: 25 };
let { name, age } = person;
console.log(name); // 输出: Charlie
console.log(age); // 输出: 25

扩展运算符

扩展运算符用于展开数组或对象。

let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
console.log(arr2); // 输出: [1, 2, 3, 4, 5]

let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1, c: 3 };
console.log(obj2); // 输出: { a: 1, b: 2, c: 3 }

ES6 引入了类语法,用于定义和继承类。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log("Hello, " + this.name + "!");
  }
}

let alice = new Person("Alice", 30);
alice.greet(); // 输出: Hello, Alice!

模块

ES6 引入了模块化语法,用于导入和导出模块。

// 导出模块
export const PI = 3.14;

export function add(a, b) {
  return a + b;
}

// 导入模块
import { PI, add } from './math.js';

console.log(PI); // 输出: 3.14
console.log(add(2, 3)); // 输出: 5

常用库和框架

JavaScript 生态系统中有许多常用的库和框架,以下是一些常见的库和框架。

jQuery

jQuery 是一个快速、小巧且功能丰富的 JavaScript 库,简化了 HTML 文档遍历和操作、事件处理、动画以及 Ajax 交互。

<!DOCTYPE html>
<html>
<head>
  <title>jQuery 示例</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
  <button id="myButton">Click me</button>
  <script>
    $(document).ready(function() {
      $("#myButton").click(function() {
        alert("Button clicked!");
      });
    });
  </script>
</body>
</html>

React

React 是一个用于构建用户界面的 JavaScript 库,特别适用于构建单页应用程序。

import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component {
  render() {
    return <h1>Hello, React!</h1>;
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

Angular

Angular 是一个由 Google 维护的前端框架,用于构建动态的 Web 应用程序。

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: '<h1>Hello, Angular!</h1>',
})
export class AppComponent {}

Vue

Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。

import Vue from 'vue';

new Vue({
  el: '#app',
  data: {
    message: 'Hello, Vue!'
  }
});

实际项目案例

计数器应用

我们将创建一个简单的计数器应用,用户可以通过点击按钮增加或减少计数值。

<!DOCTYPE html>
<html>
<head>
  <title>计数器应用</title>
  <style>
    #counter {
      font-size: 2em;
      margin: 20px;
    }
    button {
      font-size: 1em;
      padding: 10px;
    }
  </style>
</head>
<body>
  <div id="counter">0</div>
  <button id="incrementButton">增加</button>
  <button id="decrementButton">减少</button>

  <script>
    let counter = 0;

    const counterElement = document.getElementById('counter');
    const incrementButton = document.getElementById('incrementButton');
    const decrementButton = document.getElementById('decrementButton

');

    incrementButton.addEventListener('click', () => {
      counter++;
      counterElement.textContent = counter;
    });

    decrementButton.addEventListener('click', () => {
      counter--;
      counterElement.textContent = counter;
    });
  </script>
</body>
</html>

这个例子展示了如何使用原生 JavaScript 创建一个简单的计数器应用,用户可以点击按钮增加或减少计数值。

总结

本文介绍了 JavaScript 的基础知识,包括数据类型、运算符、控制流、函数、对象和数组、DOM 操作、事件处理、异步编程、ES6+ 新特性、常用库和框架以及实际项目案例。JavaScript 是一门强大而灵活的语言,适用于 Web 开发、服务器端开发、移动应用程序开发等多种场景。希望本文能帮助你建立 JavaScript 的基础,并进一步探索其丰富的生态系统和应用场景。

标签:输出,教程,console,入门,JavaScript,name,let,log
From: https://blog.csdn.net/abments/article/details/140125427

相关文章

  • Meta平台新纪元 Facebook机器人源码/部署实战教程
    随着Meta平台的不断升级,Facebook机器人成为了连接品牌与用户的新桥梁。本文将为您提供一份详尽的Facebook机器人源码及部署实战教程,助您在新纪元中抢占先机,实现精准营销。一、了解Meta平台与Facebook机器人首先,深入了解Meta平台的最新动态及Facebook机器人的应用场景。明确机......
  • 使用中转API进行大模型调用的入门指南
    引言在AI技术的快速发展中,大模型(LLM)成为了许多应用的核心组件。然而,由于某些地域限制和网络原因,直接访问国际API可能会遇到障碍。因此,使用中转API(http://api.wlai.vip)来调用这些大模型成为一种实用的解决方案。本文将介绍如何使用中转API调用大模型,并提供相关的示例代码。......
  • 机器学习入门(吃瓜第四章 决策树)
    目录一、决策树的算法原理决策树算法步骤决策树的基本思想二、划分选择1.ID3决策树——信息增益划分准则2.C4.5决策树——以信息增益率为划分准则3.CART决策树——以基尼指数为划分准则三、剪枝处理1.预剪枝(prepruning)2.后剪枝(post-pruning)参考文献一、决......
  • 地理信息革命:从入门到精通,用ArcGIS Pro和Python重塑你的数据世界
    你还在为找不到合适的数据而苦恼吗?你还在面对大量数据束手无策,不知如何处理吗?对于从事生产和科研的人员来说,空间数据的采集与管理是地理信息系统(GIS)和空间分析领域的关键环节。通过准确高效地采集和管理空间数据,可以为后续的数据处理、分析和决策提供坚实的基础。本课程将详细......
  • 入门Salesforce:必须掌握的20+基础专业术语!
    Salesforce的发展令人印象深刻。在过去的20年中,Salesforce创建了一个由管理员、开发人员、顾问和用户组成的生态系统,不断颠覆创新CRM,促进平等和多样性。作为初学者,探索Salesforce领域就像学习一门新语言。Salesforce中有着大量术语,从潜在客户、自定义对象到仪表板、记录类型等等......
  • 【JavaScript脚本宇宙】打造完美用户体验:六大模态库全解析
    从美观到高效:六大模态库实战指南前言随着现代Web开发的不断进步和用户体验要求的提升,模态窗口(Modal)已成为网页设计中不可或缺的一部分。模态窗提供了一种直观而有效的方式来展示重要信息、提示用户操作或承载交互内容。本文将全面介绍六大流行的模态库,包括BootstrapModal......
  • 深入理解 C++11 多线程编程:从入门到实践
    C++多线程编程是指使用C++提供的多线程库来并行执行代码块,从而提高程序的性能和响应能力。C++11标准引入了多线程支持,使得在C++中进行多线程编程变得更加容易和直观。以下是C++多线程编程的基本知识,并附有例子代码。多线程的基本概念线程(Thread):线程是进程中的一个执......
  • ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
    ONNXRuntime简介ONNXRuntime是一个跨平台的推理和训练机器学习加速器。ONNX运行时推理可以实现更快的客户体验和更低的成本,支持来自深度学习框架(如PyTorch和TensorFlow/Keras)以及经典机器学习库(如scikit-learn、LightGBM、XGBoost等)的模型。ONNX运行时与不同的硬件、......
  • CH01_初识JavaScript
    第1章:初识JavaScript编程语言本章目标了解为什么要学习JavaScipt编程语言掌握JS的基本结构掌握JS的执行原理掌握JS的基本语法结构掌握JS的几种输出方式掌握JS的注释课程回顾什么是HTML?HTML的标签分为块级元素和行级元素,他们的区别是什么?HTML的表单元素有那些?HTML的列表......
  • ComfyUI入门到精通教程|新手小白也能极速上手!
    前言Part1ComfyUI的介绍ComfyUI功能最强大、模块化程度最高的稳定扩散图形用户界面和后台。#麦克多娜AiComfyUI是一个基于节点流程式的stablediffusionAI绘图工具WebUI,你可以把它想象成集成了stablediffusion功能的substancedesigner,通过将stablediffusion的......