Web前端基础:JavaScript
1.JS核心语法
1.1 JS引入方式
- 第一种方式:内部脚本,将JS代码定义在HTML页面中
- JavaScript代码必须位于
<script></script>
标签之间 - 在HTML文档中,可以在任意地方,放置任意数量的
<script></script>
- 一般会把脚本置于元素的底部,可改善显示速度
- 例子:
- JavaScript代码必须位于
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS 引入方式</title>
</head>
<body><script>alert('Hello JS')</script>
</body>
</html>
- 第二种方式:外部脚本, 将JS代码定义在外部 JS文件中,然后引入到 HTML页面中
- 外部JS文件中,只包含JS代码,不包含
<script>
标签 - 引入外部js的
<script>
标签,必须是双标签 - 例子:
- 在js目录下,定义一个js文件demo.js,在文件中编写js代码,如下:
- 外部JS文件中,只包含JS代码,不包含
alert('Hello JS')
在html文件中,通过引入js文件demo.js,如下:
<script src="js/demo.js"></script>
- 注意1:demo.js中只有js代码,没有
<script>
标签 - 注意2:通过
<script></script>
标签引入外部JS文件时,标签不能自闭合,如:<script src="js/demo.js" />
- JS书写规范:
- 结束符:每行js代码,结尾以分号结尾,而结尾的分号可有可无。(建议在一个项目中保持一致,要么全部都加,要么全部都不加)
- 注释:单行注释,多行注解的写法, 与java中一致。
1.2JS基础语法
1.2.1输出语句
<script>//方式一: 写入浏览器的body区域document.write("Hello JS (document.write)");//方式二: 弹出框window.alert("Hello JS (window.alert)");//方式三: 控制台console.log("Hello JS (console.log)")</script>
1.2.2变量
- JS中主要通过 let 关键字来声明变量的。
- JS是一门弱类型语言,变量是可以存放不同类型的值的。
- 变量名需要遵循如下规则:
- 组成字符可以是任何字母、数字、下划线(_)或美元符号($),且数字不能开头
- 变量名严格区分大小写,如:name和Name是不同的变量
- 不能使用关键字作为变量名,如:let、if、for等
<script>//变量let a = 20;a = "Hello";alert(a);
</script>
上述的示例中,大家会看到变量a既可以存数字,又可以存字符串。 因为JS是弱类型语言。
2.2.2常量
在JS中,如果声明一个场景,需要使用const关键字。一旦声明,常量的值就不能改变 (不可以重新赋值)。
1.2.3数据类型
使用typeof 关键字可以返回变量的数据类型,接下来我们需要通过书写代码来演示js中的数据类型。代码如下:
<script>//原始数据类型alert(typeof 3); //numberalert(typeof 3.14); //numberalert(typeof "A"); //stringalert(typeof 'Hello');//stringalert(typeof true); //booleanalert(typeof false);//booleanalert(typeof null); //object var a ;alert(typeof a); //undefined</script>
对于字符串类型的数据,除了可以使用双引号(“…”)、单引号(‘…’)以外,还可以使用反引号 (``)。 而使用反引号引起来的字符串,也称为 模板字符串。
- 模板字符串的使用场景:拼接字符串和变量。
- 模板字符串的语法:
...
:反引号 (英文输入模式下键盘 tab 键上方波浪线 ~ 那个键)- 内容拼接时,使用 ${ } 来引用变量
具体示例如下:
<script>let name = 'Tom';let age = 18;console.log('大家好, 我是新入职的' + name + ', 今年' + age + '岁了, 请多多关照'); //原始方式 , 手动拼接字符串console.log(`大家好, 我是新入职的${name}, 今年${age}岁了, 请多多关照`); //使用模板字符串方式拼接字符串</script>
1.2.4函数
函数(function)是被设计用来执行特定任务的代码块,方便程序的封装复用。 那我们学习函数,主要就是学习JS中函数的定义及调用的语法。
1.2.4.1方式一
function 函数名(参数1,参数2..){要执行的代码
}
因为JavaScript是弱数据类型的语言,所以有如下几点需要注意:
- 形参不需要声明类型,并且JS中不管什么类型都是let去声明,加上也没有意义。
- 返回值也不需要声明类型,直接return即可
示例 :
function add(a, b){return a + b;
}
如果要调用上述的函数add,可以使用:函数名称(实际参数列表)
let result = add(10,20);
alert(result);
我们在调用add函数时,再添加2个参数,修改代码如下:
var result = add(10,20,30,40);
alert(result);
浏览器打开,发现没有错误,并且依然弹出30,这是为什么呢?
因为在JavaScript中,函数的调用只需要名称正确即可,参数列表不管的。如上述案例,10传递给了变量a,20传递给了变量b,而30和40没有变量接受,但是不影响函数的正常调用。
注意:由于JS是弱类型语言,形参、返回值都不需要指定类型。在调用函数时,实参个数与形参个数可以不一致,但是建议一致。
1.2.4.2方式二
刚才我们定义函数,是为函数指定了一个名字。 那我们也可以不为函数指定名字,那这一类的函数,我们称之为匿名函数。那接下来,方式二,就来介绍一下匿名函数的定义和调用。
匿名函数:是指一种没有名称的函数,由于它们没有名称,因此无法直接通过函数名来调用,而是通过变量或表达式来调用。
匿名函数定义可以通过两种方式:函数表达式 和 箭头函数。
- 示例一(函数表达式):
var add = function (a,b){return a + b;
}
- 示例二(箭头函数):
var add = (a,b) => {return a + b;
}
上述匿名函数声明好了之后,是将这个函数赋值给了add变量。 那我们就可以直接通过add函数直接调用,调用代码如下:
let result = add(10,20);
alert(result);
而箭头函数这种形式,在现在的前端开发中用的会更多一些。
1.2.4.3自定义对象
在 JavaScript 中自定义对象特别简单,其语法格式如下:
let 对象名 = {属性名1: 属性值1,属性名2: 属性值2,属性名3: 属性值3,方法名称: function(形参列表){}
};
我们可以通过如下语法调用属性:
对象名.属性名
通过如下语法调用函数:
对象名.方法名()
代码演示:
<script>//自定义对象let user = {name: "Tom",age: 10,gender: "男",sing: function(){console.log("悠悠的唱着最炫的民族风~");}}console.log(user.name);user.eat();
<script>
浏览器控制台结果如下:
其中,上述函数定义的语法可以简化成如下格式:
<script>//自定义对象let user = {name: "Tom",age: 10,gender: "男",sing(){console.log("悠悠的唱着最炫的民族风~");}}console.log(user.name);user.eat();
<script>
1.2.4.4 JSON
JSON对象:JavaScript Object Notation,JavaScript对象标记法。JSON是通过JavaScript标记法书写的文本。其格式如下:
{"key":value,"key":value,"key":value
}
其中,key必须使用引号并且是双引号标记,value可以是任意数据类型。
而由于语法简单,层级结构鲜明,现多用于作为数据载体,在网络中进行数据传输。
代码演示:
//3. JSON - JS对象标记法
let person = {name: 'itcast',age: 18,gender: '男'
}
alert(JSON.stringify(person)); //js对象 --> json字符串let personJson = '{"name": "heima", "age": 18}';
alert(JSON.parse(personJson).name);
API说明:
JSON.stringify(…):作用就是将js对象,转换为json格式的字符串。
JSON.parse(…):作用就是将json格式的字符串,转为js对象。
1.2.5流程控制
在JS中,当然也存在对应的流程控制语句。常见的流程控制语句如下:
- if … else if … else …
- switch
- for
- while
- do … while
而JS中的流程控制语句与JAVA中的流程控制语句的作用,执行机制都是一样的。这个呢,我们现在就不再一个一个的如研究了,后面用到的时候,我们再做说明。
1.2.6 JS DOM
1.2.6.1 DOM介绍
DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。
DOM 其实我们并不陌生,之前在学习 XML 就接触过,只不过 XML 文档中的标签需要我们写代码解析,而 HTML 文档是浏览器解析。封装的对象分为
- Document:整个文档对象
- Element:元素对象
- Attribute:属性对象
- Text:文本对象
- Comment:注释对象
如下图,左边是 HTML 文档内容,右边是 DOM 树
那么我们学习DOM技术有什么用呢?主要作用如下:
- 改变 HTML 元素的内容
- 改变 HTML 元素的样式(CSS)
- 对 HTML DOM 事件作出反应
- 添加和删除 HTML 元素
1.2.6.2DOM操作
-
DOM的核心思想:将网页的内容当做对象来处理,标签的所有属性在该对象上都可以找到,并且修改这个对象的属性,就会自动映射到标签身上。
-
document对象
- 网页中所有内容都封装在document对象中
- 它提供的属性和方法都是用来访问和操作网页内容的,如:document.write(…)
-
DOM操作步骤:
- 获取DOM元素对象
- 操作DOM对象的属性或方法 (查阅文档)
-
我们可以通过如下两种方式来获取DOM元素。
- 根据CSS选择器来获取DOM元素,获取到匹配到的第一个元素:
document.querySelector('CSS选择器');
- 根据CSS选择器来获取DOM元素,获取匹配到的所有元素:
document.querySelectorAll('CSS选择器');
注意:获取到的所有元素,会封装到一个NodeList节点集合中,是一个伪数组(有长度、有索引的数组,但没有push、pop等数组方法)
- 根据CSS选择器来获取DOM元素,获取到匹配到的第一个元素:
代码演示:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-DOM</title>
</head>
<body><h1 id="title1">11111</h1><h1>22222</h1><h1>33333</h1><script>//1. 修改第一个h1标签中的文本内容//1.1 获取DOM对象// let h1 = document.querySelector('#title1');//let h1 = document.querySelector('h1'); // 获取第一个h1标签let hs = document.querySelectorAll('h1');//1.2 调用DOM对象中属性或方法hs[0].innerHTML = '修改后的文本内容';</script>
</body>
</html>
2.JS事件监听
2.1事件介绍
什么是事件呢?HTML事件是发生在HTML元素上的 “事情”,例如:
- 按钮被点击
- 鼠标移到元素上
- 输入框失去焦点
- 按下键盘按键
- …
而我们可以给这些事件绑定函数,当事件触发时,可以自动的完成对应的功能,这就是事件监听。
例如:对于我们所说的百度注册页面,我们给用户名输入框的失去焦点事件绑定函数,当我们用户输入完内容,在标签外点击了鼠标,对于用户名输入框来说,失去焦点,然后执行绑定的函数,函数进行用户名内容的校验等操作。
JS事件是JS非常重要的一部分,接下来我们进行事件的学习。那么我们对于JavaScript事件需要学习哪些内容呢?我们得知道有哪些常用事件,然后我们得学会如何给事件绑定函数。
所以主要围绕2点来学习:①. 事件监听、②. 常用事件
2.2事件监听语法
JS事件监听的语法:
事件源.addEventListener('事件类型', 要执行的函数);
在上述的语法中包含三个要素:
- 事件源: 哪个dom元素触发了事件, 要获取dom元素
- 事件类型: 用什么方式触发, 比如: 鼠标单击 click, 鼠标经过 mouseover
- 要执行的函数: 要做什么事
演示:
<body><input type="button" id="btn1" value="点我一下试试1"><input type="button" id="btn2" value="点我一下试试2"><script>document.querySelector("#btn1").addEventListener('click', ()=>{alert("按钮1被点击了...");})</script>
</body>
2.3隔行换色案例
需求:实现鼠标移入数据行时,背景色改为#f2e2e2,鼠标移出时,再将背景色改为白色。
<script>//点击列表中每一条记录后面的删除按钮,弹出一个提示框,提示:您是否要删除这条记录? 如果确定,则移出这条记录const deleteButtons = document.querySelectorAll('.delete');for (let i = 0; i < deleteButtons.length; i++) {deleteButtons[i].addEventListener('click', function () {if (confirm('您是否要删除这条记录?')) {//点击确定按钮,删除当前记录this.parentNode.parentNode.remove();}});}//通过js实现鼠标移入移出效果,鼠标移入,背景色为 #f2e2e2,鼠标移出,背景色为 白色。const trs = document.querySelectorAll('tr');for (let i = 1; i < trs.length; i++) {trs[i].addEventListener('mouseenter', function () {this.style.backgroundColor = '#f2e2e2';});trs[i].addEventListener('mouseleave', function () {this.style.backgroundColor = '#fff';});}</script>
2.4常见事件
上面案例中使用到了事件 click、mouseenter、mouseleave,那都有哪些事件类型供我们使用呢?下面就给大家列举一些比较常用的事件属性:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-事件-常见事件</title>
</head><body><form action="" style="text-align: center;"><input type="text" name="username" id="username"><input type="text" name="age" id="age"><input id="b1" type="submit" value="提交"><input id="b2" type="button" value="单击事件"></form><br><br><br><table width="800px" border="1" cellspacing="0" align="center"><tr><th>学号</th><th>姓名</th><th>分数</th><th>评语</th></tr><tr align="center"><td>001</td><td>张三</td><td>90</td><td>很优秀</td></tr><tr align="center" id="last"><td>002</td><td>李四</td><td>92</td><td>优秀</td></tr></table><script>//click: 鼠标点击事件document.querySelector('#b2').addEventListener('click', () => {console.log("我被点击了...");})//mouseenter: 鼠标移入document.querySelector('#last').addEventListener('mouseenter', () => {console.log("鼠标移入了...");})//mouseleave: 鼠标移出document.querySelector('#last').addEventListener('mouseleave', () => {console.log("鼠标移出了...");})//keydown: 某个键盘的键被按下document.querySelector('#username').addEventListener('keydown', () => {console.log("键盘被按下了...");})//keydown: 某个键盘的键被抬起document.querySelector('#username').addEventListener('keyup', () => {console.log("键盘被抬起了...");})//blur: 失去焦点事件document.querySelector('#age').addEventListener('blur', () => {console.log("失去焦点...");})//focus: 元素获得焦点document.querySelector('#age').addEventListener('focus', () => {console.log("获得焦点...");})//input: 用户输入时触发document.querySelector('#age').addEventListener('input', () => {console.log("用户输入时触发...");})//submit: 提交表单事件document.querySelector('form').addEventListener('submit', () => {alert("表单被提交了...");})</script>
</body></html>
我们已经学习了前端网页开发的三剑客:HTML、CSS、JS。那通过这三种技术呢,我们就可以开发出一个网页程序了,但是如果我们使用原生的JS来处理界面的交互行为,开发效率呢,是比较低的。而在现在的企业项目开发中,一般会借助于Vue这样的js框架来简化操作、提高开发效率。 那么我们今天接下来呢,就来学习Vue这个框架。
相关文章:

Web前端基础:JavaScript
1.JS核心语法 1.1 JS引入方式 第一种方式:内部脚本,将JS代码定义在HTML页面中 JavaScript代码必须位于<script></script>标签之间在HTML文档中,可以在任意地方,放置任意数量的<script></script>一般会把…...
基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案
以下基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案: 基于对比学习的带钢表面缺陷分类研究 ——SimCLR与YOLOv8算法融合应用 #mermaid-svg-VqDPIOfR5WJcGtD7 {font-family:"trebuchet ms",verdana,ar…...

基于AWS Serverless架构:零运维构建自动化SEO内容生成系统
作者:[Allen] 技术专栏 | 深度解析云原生SEO自动化 在流量为王的时代,持续产出高质量SEO内容成为技术运营的核心痛点。传统方案面临开发成本高、扩展性差、关键词响应滞后三大难题。本文将分享如何用AWS Serverless技术栈,构建一套零服务器运…...
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
类文件 public static class WGS84ToGCJ02Helper {// 定义一些常量private const double PI 3.14159265358979324;private const double A 6378245.0;private const double EE 0.00669342162296594323;// 判断坐标是否在中国范围内(不在国内则不进行转换&#x…...
Linux操作系统故障应急场景及对应排查方法
001:系统CPU负载高并触发监控报警 005 查看系统CPU使用情况,,确认CPU数量,确认系统负载,确认CPU高对系统的影响 006 定位占用CPU资源最多的进程,根据进程判断是应用进程还是系统进程还是第三方工具进程。 014 查看…...

电镀机的阳极是什么材质?
知识星球(星球名:芯片制造与封测技术社区,点击加入)里的学员问:电镀的阳极有什么讲究?什么是可溶性阳极和非可溶性阳极? 什么是可溶性阳极与非可溶性阳极? 可溶性阳极 阳极本身就是…...

vscode调试deepspeed的方法之一(无需调整脚本)
现在deepspeed的脚本文件是: # 因为使用 RTX 4000 系列显卡时,不支持通过 P2P 或 IB 实现更快的通信宽带,需要设置以下两个环境变量 # 禁用 NCCL 的 P2P 通信,以避免可能出现的兼容性问题 export NCCL_P2P_DISABLE"1" …...
神经网络-Day44
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt# 设置中文字体支持 plt.rcParams["font.family"] ["SimHei"…...
创客匠人:如何通过精准定位实现创始人IP打造与知识变现
在当今知识经济时代,越来越多的专业人士希望通过个人品牌实现知识变现,但许多人面临一个共同困境:明明很努力,却收效甚微。创客匠人作为深耕知识付费赛道9年的专业机构,揭示了这一现象背后的关键原因——90%的IP失败源…...

Codeforces Round 509 (Div. 2) C. Coffee Break
题目大意: 给你n、m、d n为元素个数,m为数列长度,d为每个元素之间的最短间隔 问最少需要多少个数列可以使得元素都能装进数列,并且满足每个元素之间的间隔大于等于d 核心思想 使用贪心的思想,将元素的大小进行排序,问题出在必…...

榕壹云健身预约系统:多门店管理的数字化解决方案(ThinkPHP+MySQL+UniApp实现)
随着全民健身热潮的兴起,传统健身房在会员管理、课程预约、多门店运营等方面面临诸多挑战。针对这一需求,我们开发了一款基于ThinkPHPMySQLUniApp的榕壹云健身预约系统,为中小型健身机构及连锁品牌提供高效、灵活的数字化管理工具。本文将详细…...

QUIC——UDP实现可靠性传输
首先我们要知道TCP存在什么样的痛点问题 TCP的升级很困难TCP建立连接的延迟网络迁移需要重新建立连接TCP存在队头阻塞问题 QUIC就是为了解决以上的问题而诞生了, 下面我会介绍QUIC的一些特性和原理 QUIC对比TCP优势: 握手建连更快 QUIC内部包含了TLS, 它在自己的帧会携带TL…...
提高Python编程效率的工具推荐
在 Python 开发中,选择合适的工具可以显著提升编程效率。以下是一些经过精心挑选的工具,涵盖代码编辑、调试、数据分析等多个方面,希望能帮助你在 Python 开发中事半功倍。 一、集成开发环境(IDE) 1. PyCharm PyCha…...
React Native图片预加载:让你的应用图片预览像德芙一样丝滑
写在前面:一张图片引发的性能血案 你有没有遇到过这种情况?——用户疯狂滑动你的React Native图片列表,结果图片加载慢得像蜗牛,甚至出现空白闪烁?等到图片终于加载出来,用户早就失去耐心,愤然退出…… 但你知道吗?这个问题只需要几行代码就能解决! 比如,使用reac…...

快速上手shell脚本运行流程控制
一、条件运行流程控制 1.if单分支结构 #!/bin/bash if [ 条件 ] then动作1动作2... fi 2.if双分支结构 #!/bin/bash if [ 条件 ] then动作1动作2... else动作1动作2... fi 3.if多分支结构 二、循环运行流程控制 1.无判定for循环 给网卡一键添加5个IP 2.判断循环 while…...

10.Linux进程信号
1. 理解信号 信号VS信号量 老婆:老婆饼-》没有任何关系!信号:闹钟,上课铃声,脸色...人-》进程;信号中断人正在做的事,是一种事件的异步通知机制; 我们自习一会,等张三回…...
Python 函数全攻略:函数基础
函数(Functions)基础 什么是函数? 一个命名的代码块,代指一大堆代码。 定义: def function_name(): (使用def关键字,英文括号,冒号,缩进代码块)。 执行/调用: function…...

机器学习基础(四) 决策树
决策树简介 决策树结构: 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树构建过程(三要素): 特征选择 选…...
DDPM优化目标公式推导
DDPM优化目标公式推导 DDPM优化目标公式推导**1. 问题定义****2. 优化目标:最大化对数似然****3. 变分下界的分解****4. 关键步骤:简化 KL 散度项****(a) 后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) q(xt…...

CentOS 7如何编译安装升级gcc至7.5版本?
CentOS 7如何编译安装升级gcc版本? 由于配置CentOS-SCLo-scl.repo与CentOS-SCLo-scl-rh.repo后执行yum install -y devtoolset-7安装总是异常,遂决定编译安装gcc7.5 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc…...

为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)
文章目录 1. **帮助 React 识别列表项的变化**2. **性能优化**3. **避免组件状态混乱**4. **为什么使用 rpid 作为 key**5. **不好的做法示例**6. **✅ 正确的做法** 在 React 中添加 key{item.rpid} 是非常重要的,主要有以下几个原因: 1. 帮助 React 识…...
Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
引言 在Web应用复杂度指数级增长的今天,传统自动化测试工具面临动态渲染适配难、多浏览器兼容差、测试稳定性低三大挑战。微软开源的Playwright凭借跨浏览器支持、自动等待机制和原生异步架构,成为新一代自动化测试的事实标…...

飞牛云一键设置动态域名+ipv6内网直通访问内网的ssh服务-家庭云计算专家
IPv6访问SSH的难点与优势并存。难点主要体现在网络环境支持不足:部分ISP未完全适配IPv6协议,导致客户端无法直接连通;老旧设备或工具(如Docker、GitHub)需额外配置才能兼容IPv6,技术门槛较高;若…...
虚实共生时代的情感重构:AI 恋爱陪伴的崛起、困局与明日图景
一、虚拟恋人:从技术幻想到情感刚需的跨越 在 5G 网络编织的数字浪潮里,AI 驱动的虚拟恋人正打破次元界限。深度学习算法剖析 3000 万段真实对话语料库,搭配 VR 设备带来的多维度交互体验,如今的虚拟对象已能精准模拟瞳孔微表情&…...
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
一、C有几种传值方式之间的区别 一、值传递(Pass by Value) 机制:创建参数的副本,函数内操作不影响原始数据语法:void func(int x)特点: 数据安全:原始数据不受影响性能开销:需要复…...
C++动态规划-线性DP
这是一套C线性DP题目的答案。如果需要题目,请私信我,我将会更新题干 P1:单子序列最大和 #include <bits/stdc.h> using namespace std; int n,A,B,C; int a[200005]; int s[200005]; int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…...

Java高级 | 【实验七】Springboot 过滤器和拦截器
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
es地理信息索引的类型以及geo_point和geo_hash的关系
Elasticsearch中地理信息索引的主要数据类型有两种: geo_point:用于存储单个地理点坐标(如纬度/经度),支持精确位置查询和基于距离的搜索操作。geo_shape:用于存储复杂的地理形状(如点、线、多…...

深入理解 Spring IOC:从概念到实践
目录 一、引言 二、什么是 IOC? 2.1 控制反转的本质 2.2 类比理解 三、Spring IOC 的核心组件 3.1 IOC 容器的分类 3.2 Bean 的生命周期 四、依赖注入(DI)的三种方式 4.1 构造器注入 4.2 Setter 方法注入 4.3 注解注入(…...
Vue解决开发环境 Ajax 跨域问题
一、前言 在使用 Vue 进行前后端分离开发时,前端通常运行在本地开发服务器(如 http://localhost:8080),而后端接口可能部署在其他域名或端口下(如 http://api.example.com:3000)。这时就可能出现 跨域&…...