JavaScript 学习总结

一、基础语法

1. 变量声明

  • var:ES5 中用于声明变量,有函数作用域和变量提升现象。变量提升意味着变量可以在声明之前使用,但其值为 undefined
console.log(a); // 输出: undefined
var a = 10;
  • let:ES6 引入,具有块级作用域。在块级作用域内声明的 let 变量,只在该块级作用域内有效。
{let b = 20;console.log(b); // 输出: 20
}
console.log(b); // 报错: b is not defined
  • const:同样是 ES6 引入,用于声明常量。一旦声明,其值不能被重新赋值,且也具有块级作用域。
const PI = 3.14159;
PI = 3.14; // 报错: Assignment to constant variable.

2. 注释

  • 单行注释:使用 // 开头,注释本行后面的内容。
// 这是一个单行注释
let num = 10;
  • 多行注释:使用 /* */ 包裹注释内容,可以跨越多行。
/* 
这是一个
多行注释
*/
function add(a, b) {return a + b;
}

3. 语句与 运算符

  • 条件语句

    • ifelseelse if

    • switch:多分支选择。

  • 循环语句

    • forfor (let i = 0; i < 5; i++) {}

    • whilewhile (condition) {}

    • do...whiledo {} while (condition)

    • for...of:遍历可迭代对象(如数组)。

    • for...in:遍历对象的可枚举属性。

for (let i = 0; i < 5; i++) {console.log(i);
}const obj = { a: 1, b: 2 };
for (let key in obj) {console.log(key, obj[key]);
}
  • 算术运算符+-*/%**(幂运算)。

  • 比较运算符==(值相等)、===(值和类型相等)、!=!==><>=<=

  • 逻辑运算符&&(与)、||(或)、!(非)。

  • 赋值运算符=+=-=*=/=

  • 三元运算符condition ? expr1 : expr2

let a = 10;
let b = 5;
console.log(a > b && a !== 10); // false

 

二、数据类型

1. 基本数据类型

  • undefined:表示变量已声明但未赋值。
let var1;
console.log(var1); // 输出: undefined
  • null:表示一个空值,通常用于表示有意的空值。
let var2 = null;
console.log(var2); // 输出: null
  • boolean:有两个值 true 和 false,用于逻辑判断。
let isDone = true;
if (isDone) {console.log('任务完成');
}
  • number:表示整数和浮点数。
let num1 = 10;
let num2 = 3.14;
  • string:用于表示文本数据,可使用单引号、双引号或反引号(模板字面量)。
let str1 = 'Hello';
let str2 = "World";
let str3 = `Hello, ${str2}`; // 模板字面量,可以嵌入表达式
console.log(str3); // 输出: Hello, World
  • symbol:ES6 新增,是一种唯一的、不可变的数据类型,常用于对象属性键,以避免属性名冲突。
let sym1 = Symbol('unique');
let sym2 = Symbol('unique');
console.log(sym1 === sym2); // 输出: false
  • bigint:ES2020 新增,用于表示任意精度的整数,解决了 number 类型的安全整数范围限制问题。
let big1 = BigInt(9007199254740991);
let big2 = BigInt('9007199254740991');

2. 引用数据类型

  • Object:是一种无序的键值对集合,可以存储各种类型的数据。对象,如 {}[]function
let person = {name: 'John',age: 30,address: {city: 'New York',country: 'USA'},hobbies: ['reading', 'traveling']
};
console.log(person.name); // 输出: John
  • Array:是一种有序的、可变的列表,可以存储不同类型的数据。
let numbers = [1, 2, 3, 4, 5];
numbers.push(6); // 在数组末尾添加元素
console.log(numbers[2]); // 输出: 3
  • Function:是一种特殊的对象,用于封装可重用的代码块。函数可以作为值传递、存储在变量中、作为参数传递给其他函数等。
function add(a, b) {return a + b;
}
let sum = add(3, 5);
console.log(sum); // 输出: 8

 

三、函数

1. 函数定义

  • 函数声明:使用 function 关键字定义函数,具有函数提升特性。
function multiply(a, b) {return a * b;
}
let result1 = multiply(4, 5);
console.log(result1); // 输出: 20
  • 函数表达式:将函数赋值给一个变量,没有函数提升特性。
let divide = function (a, b) {return a / b;
};
let result2 = divide(10, 2);
console.log(result2); // 输出: 5
  • 箭头函数:ES6 引入的简洁函数定义方式,没有自己的 thisargumentssuper 和 new.target
let square = (x) => x * x;
let result3 = square(3);
console.log(result3); // 输出: 9// 多个参数
let addNumbers = (a, b) => a + b;// 无参数
let greet = () => console.log('Hello');

2. 函数参数

  • 默认参数:在函数定义时可以为参数指定默认值。
function greet(name = 'Guest') {console.log(`Hello, ${name}`);
}
greet(); // 输出: Hello, Guest
greet('John'); // 输出: Hello, John
  • 剩余参数:使用 ... 语法将多个参数收集到一个数组中。
function sumAll(...numbers) {let total = 0;for (let num of numbers) {total += num;}return total;
}
let sumResult = sumAll(1, 2, 3, 4, 5);
console.log(sumResult); // 输出: 15

3. 函数作用域和闭包

  • 函数作用域:函数内部可以访问外部作用域的变量,而外部作用域不能访问函数内部的变量。
let outerVar = 10;
function outerFunction() {let innerVar = 20;console.log(outerVar); // 可以访问外部变量console.log(innerVar); // 可以访问内部变量
}
outerFunction();
console.log(innerVar); // 报错: innerVar is not defined
  • 闭包:函数可以记住并访问其所在的词法作用域,即使在函数执行完毕后。闭包常用于创建私有变量和模拟面向对象的封装。
function outer() {let count = 0;return function inner() {count++;console.log(count);};
}const counter = outer();
counter(); // 1
counter(); // 2

 

四、对象和数组

1. 对象创建

  • 对象字面量:最常用的创建对象的方式,使用花括号 {} 定义对象的属性和方法。
let car = {brand: 'Toyota',model: 'Corolla',year: 2020,start: function () {console.log('The car has started.');}
};
  • new Object():使用 Object 构造函数创建对象,然后逐个添加属性。
let person = new Object();
person.name = 'Alice';
person.age = 30;

2. 属性访问

  • 点表示法:使用点号 . 访问对象的属性。
console.log(car.brand); // 输出: Toyota
  • 方括号表示法:使用方括号 [] 访问对象的属性,适用于属性名是变量或包含特殊字符的情况。
let propName ='model';
console.log(car[propName]); // 输出: Corolla

3. 继承

  • 传统原型链继承:通过构造函数和原型链实现继承。
function Animal(name) {this.name = name;
}
Animal.prototype.speak = function () {console.log(this.name +'makes a sound.');
};
function Dog(name, breed) {Animal.call(this, name);this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
let myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 输出: Buddy makes a sound.
  • ES6 class 继承:使用 class 和 extends 关键字实现继承,语法更简洁。
class Animal {constructor(name) {this.name = name;}speak() {console.log(this.name +'makes a sound.');}
}
class Dog extends Animal {constructor(name, breed) {super(name);this.breed = breed;}
}
let myDog2 = new Dog('Charlie', 'Labrador');
myDog2.speak(); // 输出: Charlie makes a sound.

4. 数组

  • 定义const arr = [1, 2, 3]

  • 常用方法

    • push()pop()shift()unshift()

    • map()filter()reduce()

    • slice()splice()

const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]

五、异步编程

1 回调函数

  • 异步操作完成后执行的函数。

setTimeout(function () {console.log('First timeout');setTimeout(function () {console.log('Second timeout');}, 1000);
}, 1000);
  • 回调地狱:当多个异步操作嵌套时,代码会变得难以阅读和维护,形成回调地狱。

2. Promise

  • 基本概念Promise 是一个表示异步操作最终完成(或失败)及其结果值的对象。它有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。
  • 方法:then()catch()finally()

let promise = new Promise((resolve, reject) => {setTimeout(() => {resolve('Success!');}, 1000);
});
promise.then(value => {console.log(value);
}).catch(error => {console.error(error);
});
  • 链式调用:通过 .then() 方法可以将多个 Promise 操作链接起来,解决回调地狱问题。
const promise = new Promise((resolve, reject) => {setTimeout(() => resolve("Success"), 1000);
});promise.then((result) => console.log(result));

3. async/await

  • 基本概念async 函数是一种异步函数,它返回一个 Promise 对象。await 只能在 async 函数内部使用,用于暂停异步函数的执行,直到 Promise 被解决(fulfilled)或被拒绝(rejected)。
  • 基于 Promise 的语法糖,使异步代码看起来像同步代码。

async function fetchData() {const response = await fetch("https://api.example.com/data");const data = await response.json();console.log(data);
}

六、DOM 操作

1 选择元素

  • document.getElementById()

  • document.querySelector()

  • document.querySelectorAll()

const element = document.querySelector("#myElement");

2 修改元素

  • 修改内容:element.textContentelement.innerHTML

  • 修改样式:element.style.property = value

  • 修改属性:element.setAttribute()

element.textContent = "Hello, World!";
element.style.color = "red";

3 事件处理

  • 添加事件监听器:element.addEventListener()

let button = document.getElementById('myButton');
button.addEventListener('click', function () {console.log('Button clicked!');
});

4.常见事件类型

  • 鼠标事件:如 click(点击)、dblclick(双击)、mouseover(鼠标悬停)、mouseout(鼠标离开)、mousedown(鼠标按下)、mouseup(鼠标释放)等。
  • 键盘事件:如 keydown(键盘按下)、keyup(键盘释放)、keypress(键盘按下并产生字符)等。
  • 表单事件:如 submit(表单提交)、input(输入框内容改变)、change(表单元素值改变)等。
let form = document.getElementById('myForm');
form.addEventListener('submit', function (event) {event.preventDefault(); // 阻止表单默认提交行为console.log('Form submitted');
});

七、ES6+ 新特性

1 解构赋值

  • 从数组或对象中提取值。

const [a, b] = [1, 2];
const { name, age } = { name: "Alice", age: 25 };

2 模板字符串

  • 使用反引号(``)定义字符串,支持多行和嵌入表达式。

const name = "Alice";
console.log(`Hello, ${name}!`);

3 模块化

  • 使用 import 和 export 导入和导出模块。

// math.js
export const add = (a, b) => a + b;// main.js
import { add } from "./math.js";
console.log(add(2, 3)); // 5

八、 常用 API__内置函数方法

1 数组方法

数组是 JavaScript 中最常用的数据结构之一,以下是一些常用的数组方法:

map():对数组中的每个元素执行函数,并返回新数组。

const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]

filter():过滤数组,返回满足条件的元素组成的新数组。

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

reduce():将数组元素累积为一个值。

const sum = numbers.reduce((acc, n) => acc + n, 0); // 6

find():返回数组中第一个满足条件的元素。

const firstEven = numbers.find((n) => n % 2 === 0); // 2

 some():检查数组中是否有元素满足条件。

const hasEven = numbers.some((n) => n % 2 === 0); // true

 every():检查数组中的所有元素是否都满足条件。

const allEven = numbers.every((n) => n % 2 === 0); // false

2.字符串 API

字符串是 JavaScript 中的基本数据类型之一,以下是一些常用的字符串方法:

split():将字符串按指定分隔符拆分为数组。

const str = "hello,world";
const arr = str.split(","); // ["hello", "world"]

join():将数组元素按指定分隔符拼接为字符串。

const newStr = arr.join("-"); // "hello-world"

substring():提取字符串的子串。

const sub = str.substring(0, 5); // "hello"

replace():替换字符串中的内容。

const newStr = str.replace("world", "JavaScript"); // "hello,JavaScript"

 toUpperCase():将字符串转换为大写。

const upper = str.toUpperCase(); // "HELLO,WORLD"

toLowerCase():将字符串转换为小写。

const lower = str.toLowerCase(); // "hello,world"

3. 对象 API

对象是 JavaScript 中的核心数据结构,以下是一些常用的对象方法:

Object.keys():返回对象的所有键组成的数组。

const obj = { a: 1, b: 2 };
const keys = Object.keys(obj); // ["a", "b"]

Object.values():返回对象的所有值组成的数组。

const values = Object.values(obj); // [1, 2]

Object.entries():返回对象的键值对组成的数组。

const entries = Object.entries(obj); // [["a", 1], ["b", 2]]

 Object.assign():将一个或多个对象的属性复制到目标对象。

const target = { a: 1 };
const source = { b: 2 };
const result = Object.assign(target, source); // { a: 1, b: 2 }

4. 日期 API

JavaScript 提供了 Date 对象来处理日期和时间。

 new Date():创建日期对象。

const now = new Date(); // 当前时间

getFullYear():获取年份。

const year = now.getFullYear(); // 2025

 getMonth():获取月份(0-11)。

const month = now.getMonth(); // 1 (表示 2 月)

getDate():获取日期(1-31)。

const date = now.getDate(); // 12

getHours():获取小时(0-23)。

const hours = now.getHours(); // 14

5.网络请求 API

JavaScript 提供了 fetch API 用于发送网络请求。

fetch():发送 HTTP 请求并获取响应。

fetch("https://api.example.com/data").then((response) => response.json()).then((data) => console.log(data)).catch((error) => console.error(error));

6. 浏览器环境 API

JavaScript 可以通过浏览器提供的 API 操作 DOM 和浏览器环境。

 document.querySelector():选择 DOM 元素。

const element = document.querySelector("#myElement");

 element.addEventListener():为 DOM 元素添加事件监听器。

element.addEventListener("click", () => {console.log("Element clicked");
});

localStorage:在浏览器中存储数据。

localStorage.setItem("name", "Alice");
const name = localStorage.getItem("name"); // "Alice"

 sessionStorage:在浏览器会话中存储数据。

sessionStorage.setItem("token", "12345");
const token = sessionStorage.getItem("token"); // "12345"

7. 数学 API

JavaScript 提供了 Math 对象来处理数学运算。

Math.random():生成 0 到 1 之间的随机数。

const random = Math.random(); // 0.123456789

 Math.floor():向下取整。

const num = Math.floor(3.7); // 3

 Math.ceil():向上取整。

const num = Math.ceil(3.2); // 4

 Math.round():四舍五入。

const num = Math.round(3.5); // 4

九、最佳实践

1 代码风格

  • 使用 const 和 let 代替 var

  • 使用箭头函数简化代码。

  • 使用模板字符串代替字符串拼接。

2 错误处理

  • 使用 try...catch 捕获异常。

try {// 可能出错的代码
} catch (error) {console.error(error);
}

3 性能优化

  • 避免全局变量。

  • 使用事件委托减少事件监听器数量。

  • 使用 requestAnimationFrame 优化动画。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

OA项目登录

导入依赖,下面的依赖是在这次OA登录中用到的 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.sprin…

YangQG 面试题汇总

一、交叉链表 问题&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解题思想&#xff1a; 双指针 备注&#xff1a;不是快慢指针&#xff0c;如果两个长度相…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

WEB前端-3.2

目录 css 【例】飙升榜 【源码】 css 【例】飙升榜 【源码】 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

qml SpringAnimation详解

1. 概述 SpringAnimation 是 Qt Quick 中用于模拟弹簧效果的动画类。它通过模拟物体在弹簧力作用下的反应&#xff0c;产生一种振荡的动画效果&#xff0c;常用于模拟具有自然回弹、弹性和振动的动态行为。这种动画效果在 UI 中广泛应用&#xff0c;特别是在拖动、拉伸、回弹等…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)

目录 一、第一个 Python 程序1.1 命令行模式、Python 交互模式1.2 Python的执行方式1.3 SyntaxError 语法错误1.4 输入和输出 二、Python 基础2.1 Python 语法2.2 数据类型1&#xff09;Number 数字2&#xff09;String 字符串3&#xff09;List 列表4&#xff09;Tuple 元组5&…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…

【excel】VBA简介(Visual Basic for Applications)

文章目录 一、基本概念二、语法2.1 数据类型2.11 基本数据类型2.12 常量2.13 数组 2.2 控制语句2.21 条件语句2.22 循环语句2.23 错误处理&#xff1a;On Error2.24 逻辑运算 2.3 其它语句2.31 注释2.32 with语句 2.4 表达式2.41 常见表达式类型2.42 表达式的优先级 2.5 VBA 的…

回溯算法汇总

1.回溯算法 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以加一些剪枝的操作&#xff0c;但也改不了回溯法就是穷举的本质。 回溯…

【黑马程序员三国疫情折线图——json+pyechart=数据可视化】

json数据在文末 将海量的数据处理成我们肉眼可以进行分析的形式&#xff0c;数据的可视化&#xff0c;可以分为两个步骤&#xff1a; 数据处理&#xff1a;利用三方网站厘清json层次格式化&#xff0c;再对文件的读取、检查是否符合JSON规范以及规范化、JSON格式的转化&#…

Node.js——fs(文件系统)模块

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

注册中心如何选型?Eureka、Zookeeper、Nacos怎么选

这是小卷对分布式系统架构学习的第9篇文章&#xff0c;第8篇时只回答了注册中心的工作原理的内容&#xff0c;面试官的第二个问题还没回答&#xff0c;今天再来讲讲各个注册中心的原理&#xff0c;以及区别&#xff0c;最后如何进行选型 上一篇文章&#xff1a;如何设计一个注册…

XS5037C一款应用于专业安防摄像机的图像信号处理芯片,支持MIPI和 DVP 接口,内置高性能ISP处理器,支持3D降噪和数字宽动态

XS5037C是一款应用于专业安防摄像机的图像信号处理芯片&#xff0c;支持MIPI和 DVP 接口&#xff0c;最 大支持 5M sensor接入。内置高性能ISP处理器&#xff0c;支持3D降噪和数字宽动态。标清模拟输出支 持960H&#xff0c;高清模拟输出支持HDCCTV 720P/1080P/4M/5M。高度集成…

【2024年华为OD机试】 (A卷,100分)- 租车骑绿岛(Java JS PythonC/C++)

一、问题描述 题目描述 部门组织绿岛骑行团建活动。租用公共双人自行车&#xff0c;每辆自行车最多坐两人&#xff0c;最大载重 M。 给出部门每个人的体重&#xff0c;请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m、n&#xff0c;分别代表自行车限重&#…

网络安全-kail linux 网络配置(基础篇)

一、网络配置 1.查看网络IP地址&#xff0c; 我的kail&#xff1a;192.168.15.128 使用ifconfig查看kail网络连接情况&#xff0c;ip地址情况 又复制了一台kail计算机的IP地址。 再看一下windows本机&#xff1a;使用ipconfig进行查看&#xff1a; 再看一下虚拟机上的win7I…

shell基础使用及vim的常用快捷键

一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell&#xff0c;不同的shell具备不同的功能&#xff0c;shell还决定了脚本中函数的语法&#xff0c;Linux中默认的shell是 / b in/ b a s h &#xff0c;流行的shell…

【LeetCode】:删除回文子数组【困难】

class Solution { public:// 思考:能否用滚动数组进行优化int minimumMoves(vector<int>& arr) {// 定义状态dp[i][j]为i-j的最小步数int n arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 7));// 可以把这 1 次理解为一种 最小操作单…

极大似然估计笔记

一、原理 我们拿到样本数据需要进行有参估计时&#xff0c;需要假设样本的服从某一分布&#xff0c;因此通过给定某种样本的分布&#xff0c;利用样本来拟合分布参数的过程就是极大似然法。给定一个概率分布 D&#xff0c;假定概率密度函数为 f &#xff0c;以及一个分布参数 θ…