【编程指南】ES2016到ES2023新特性解析一网打尽

news2024/11/25 14:56:01

ES2016-ES2023.png

ES2016

Array.prototype.includes()

Array.prototype.includes 方法: 这个方法用于检查数组是否包含特定元素,如果包含则返回 true,否则返回 false

// 我有一个水果篮子
const fruitBasket = ['apple', 'banana', 'orange', 'grape'];

// 我要检查篮子里是否有橙子
const hasOrange = fruitBasket.includes('orange');
console.log(hasOrange); // 输出: true

// 我还想知道篮子里是否有葡萄
const hasGrape = fruitBasket.includes('grape');
console.log(hasGrape); // 输出: true

// 现在我要检查篮子里是否有西瓜
const hasWatermelon = fruitBasket.includes('watermelon');
console.log(hasWatermelon); // 输出: false

求幂运算符

求幂运算符: 这是一个新的算术运算符,用于计算一个数的幂

// 我要计算 2 的 3 次幂
const result = 2 ** 3;
console.log(result); // 输出: 8

ES2017

Object.values/Object.entries

Object.valuesObject.entries 方法:

  • Object.values:把字典里的值都拿出来,就像拿出一个个水果。
  • Object.entries:把字典里的值和对应的名字都拿出来,就像知道每个水果的名字和样子。
const person = {
  name: 'Alice',
  age: 25,
  city: 'New York'
};

const values = Object.values(person); // 得到:['Alice', 25, 'New York']
const entries = Object.entries(person); // 得到:[['name', 'Alice'], ['age', 25], ['city', 'New York']]

字符串补全

字符串补全是一种操作,可以在一个字符串的末尾添加一些额外的字符,使得字符串的长度达到特定的目标长度。

console.log('a'.padStart(5, '1')); // 1111a
console.log('a'.padEnd(5, '2')); // a2222

async/await

async/await 是 JavaScript 中处理异步操作的一种方式,它使得在代码中处理异步任务更加直观和易读。

function simulateFetchingData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data fetched');
    }, 1000);
  });
}

async function fetchData() {
  console.log('Fetching data...');
  const data = await simulateFetchingData();
  console.log(data); // 输出: 'Data fetched'
}

fetchData(); // 会在一秒后输出: 'Data fetched'

Object.getOwnPropertyDescriptors()

用于获取一个对象的所有属性的详细信息,包括属性的特性(例如可写、可枚举、可配置)以及属性的值。

const item = {
  name: 'Widget',
  color: 'Blue'
};

const descriptors = Object.getOwnPropertyDescriptors(item);
console.log(descriptors);

参数列表支持尾逗号

函数参数列表最后一个参数后面允许有一个逗号,这在以后添加更多参数时更方便。

function inviteFriends(friend1, friend2, friend3,) {
  console.log("Inviting:", friend1, friend2, friend3);
}

inviteFriends('Alice', 'Bob', 'Charlie',); // 输出: Inviting: Alice Bob Charlie

ES2018

for-await-of 异步迭代

异步迭代在 Node.js 中用的会多些,使用 for-await-of 遍历异步数据。例如使用 MongoDB 查询数据返回值默认为一个游标对象,避免了一次性把数据读入应用内存

想象你有一组需要分步完成的任务,比如读取多个文件,这些任务都是异步的。for-await-of 就像是一个一个完成这些任务,等一个任务完成后再进行下一个。

async function fetchUserData(userId) {
  // 模拟异步操作,比如从服务器获取用户数据
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`User data for ID ${userId}`);
    }, 1000);
  });
}

const userIds = [1, 2, 3];

(async () => {
  for await (const userData of userIds.map(fetchUserData)) {
    console.log(userData);
  }
})();

Promise.finally

Promise.finally 是在 Promise 结束(不管是成功还是失败)后,无论如何都会执行的代码块。

const fetchData = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    resolve('Data fetched');
  }, 1000);
});

fetchData
  .then(data => console.log(data))
  .catch(error => console.error(error))
  .finally(() => console.log('Promise finished'));

新的正则表达式功能

  • 正则命名组捕获
  • 正则表达式 Unicode 转义
  • 正则表达式dotAll模式
  • 正则 Lookbehind 断言

Rest/Spread 属性

这些属性让你可以更方便地处理函数参数和对象数组的拷贝。

想象你要组织一场聚会,需要把朋友们的名字一个一个列出来。Rest 属性就像是把这些名字都捡起来放进一个列表,而 Spread 属性就像是把这个列表里的名字一个一个散落出来。

// Rest 属性
function inviteFriends(host, ...guests) {
  console.log(`${host}邀请了${guests.join(', ')}参加聚会`);
}

inviteFriends('Alice', 'Bob', 'Charlie', 'David');

// Spread 属性
const oldFriends = ['John', 'Jane'];
const newFriends = ['Mike', 'Emily'];
const allFriends = [...oldFriends, ...newFriends];

console.log(allFriends); // 输出: ['John', 'Jane', 'Mike', 'Emily']

解除模版字符串限制

解析器会去查找有效的转义序列,例如 Unicode​ 字符以 "\u"​ 开头,例如 \u00A9​,以下 "\unicode"​ 是一个非法的 Unicode​ 字符,在之前就会得到一个 SyntaxError: malformed Unicode character escape sequence​ 错误。ES2018 中解除了这个限制,当遇到不合法的字符时也会正常执行,得到的是一个 undefined​,通过 raw 属性还是可以取到原始字符串。

function latex(strings, ...exps) {
  console.log(strings); // [ undefined ]
  console.log(strings.raw);  // [ 'latex \unicode' ]
 }
 
 latex`latex \unicode`;

ES2019

可选的 catch 参数

允许在 catch 块中省略异常参数,使得在不需要异常信息时代码更简洁。

try {
  // 一些可能会发生问题的代码
} catch {
  // 不需要异常参数
  console.log('出错了');
}

Symbol.prototype.description

这是一个新的方法,用于返回 Symbol 的可读描述,方便开发者理解 Symbol 的用途。

想象你有很多特殊的印章,每个印章代表不同的事情。description 就像是告诉你每个印章代表的是什么,让你能更好地理解这些印章。

const mySymbol = Symbol('这是一个特殊的标记');
console.log(mySymbol.description); // 输出: '这是一个特殊的标记'

函数的 toString() 方法

一个函数对象的方法,用于将函数的源代码转化成字符串。

function sayHello() {
  console.log('Hello!');
}

const functionString = sayHello.toString();
console.log(functionString); // 输出函数的源代码字符串

Object.fromEntries()

一个用于将键值对列表转换成对象的方法。

想象你有一些标签和对应的价值,现在你想把它们整理成一个清单。Object.fromEntries() 就像是帮你把这些标签和价值整理成一个清单。

const entries = [
  ['name', 'Alice'],
  ['age', 30]
];

const person = Object.fromEntries(entries);
console.log(person); // 输出: { name: 'Alice', age: 30 }

消除前后空格

一种字符串处理方法,用于去除字符串开头和结尾的空格。

const messyText = '   这里有很多空格   ';
const cleanText = messyText.trim();
console.log(cleanText); // 输出: '这里有很多空格'

数组 flat()、flatMap()

数组的两个方法,用于将多维数组拉平为一维数组,以及在拉平的同时对数组元素进行操作。Infinity是flat对数组深度展开,flatMap则只能展开一层。

想象你有一些叠在一起的盒子,里面还有更小的盒子。flat() 就像是把所有的盒子都打开,把里面的东西拿出来放在一起。而 flatMap() 就像是在拿出东西的同时,还可以对它们做些处理。

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

const flattenedArray = nestedArray.flat();
console.log(flattenedArray); // 输出: [1, 2, [3, [4]]]

const flattened = nestedArray.flat(Infinity);
console.log(flattenedArray); // 输出: [1, 2, 3, 4]

const doubledArray = nestedArray.flatMap(value => value * 2);
console.log(doubledArray); // 输出: [2, 4, 6, [4]]

JSON 超集

ES2019 之前 JSON 字符串中不支持 \u2028(行分隔符)、\u2029(段落分隔符) 字符,否则 JSON.parse() 会报错,现在给予了支持。

const json = '"\u2028"';
JSON.parse(json);

JSON.stringify() 加强格式转化

防止 JSON.stringify 返回格式错误的 Unicode 字符串

ES2020

matchAll 匹配所有

字符串的新方法,可以通过正则表达式来查找字符串中的所有匹配项。

想象你有一篇文章,想找出所有包含某个特定单词的地方。matchAll 就像是帮你在文章中找到所有这样的地方

const text = 'Hello world, hello universe';
const regex = /hello/gi;

for (const match of text.matchAll(regex)) {
  console.log(match);
}

模块新特性

  • import 动态导入
    动态导入意思是当你需要该模块时才会进行加载,返回的是一个 Promise​ 对象。只有在 ES Modules 模块规范下才支持。
// index-a.mjs
export default {
  hello () {
    console.log(`hello JavaScript`);
  }
}

// index-b.mjs
import('./index-a.mjs').then(module {
  module.default.hello(); // hello JavaScript
})
  • import.meta
    import.meta​ 指当前模块的元数据。一个广泛支持的属性是 import.meta.url,以字符串形式输出当前模块的文件路径。

Bigint

BigInt 是一种新的数据类型,用于表示大整数,超出了 JavaScript 中常见的数值范围。

想象你要表示一个非常大的数字,比如宇宙的年龄。BigInt 就像是一个特别大的数字框,可以容纳更多的数字。

const bigNumber = 1234567890123456789012345678901234567890n;
console.log(bigNumber);

Promise.allSettled

这是 Promise 的一个新方法,可以等待多个 Promise 都完成(无论成功还是失败)后再继续。

const promises = [
  Promise.resolve('Success!'),
  Promise.reject('Error!')
];

Promise.allSettled(promises)
  .then(results => console.log(results));

全局对象

JavaScript 可以运行在不同的环境,浏览器为 window、Node.js 为 global。为了能够统一全局环境变量,引入了 globalThis。

window === globalThis // 浏览器环境
global === globalThis // Node.js 环境

for-in 机制

这是对 for-in 循环的更新,用于更好地遍历对象的可枚举属性。
想象你要看一个箱子里有什么东西,但有些东西可能隐藏得很深。for-in 机制就像是帮你把箱子里所有东西都拿出来看一遍。

const obj = { a: 1, b: 2, c: 3 };

for (const key in obj) {
  console.log(key, obj[key]);
}

可选链

这是一个新的语法,用于在访问对象的属性时,避免因为属性不存在而导致错误。

const person = {
  name: 'Alice',
  contact: {
    phone: '123-456-7890'
  }
};

const phoneNumber = person?.contact?.phone;
console.log(phoneNumber); // 输出: '123-456-7890'

空值合并

这是一种新的语法,用于给变量赋值时,如果变量的值为 nullundefined,就使用默认值。

想象你要吃冰淇淋,但是不知道哪种口味有,所以你要确保有一种口味可以选。空值合并就像是在选择口味时,如果没有你喜欢的,就选择默认的口味。

const favoriteIceCream = null;
const iceCreamChoice = favoriteIceCream ?? 'Vanilla';
console.log(iceCreamChoice); // 输出: 'Vanilla'

ES2021

String.prototype.replaceAll

字符串的一个新方法,用于替换所有匹配的子字符串。

想象你在纸上写了一句话,但是有一些词你想换成其他词。replaceAll 就像是帮你把所有要换的词都换掉。

const originalText = 'Hello world, hello universe';
const newText = originalText.replaceAll('hello', 'hi');
console.log(newText); // 输出: 'Hi world, hi universe'

Promise.any

Promise.anyPromise 的一个新方法,用于在一组 Promise 中,只要有一个成功就返回,不必等待所有 Promise 都结束。

const promises = [
  Promise.reject('Error 1'),
  Promise.resolve('Success!'),
  Promise.reject('Error 2')
];

Promise.any(promises)
  .then(result => console.log(result))
  .catch(errors => console.error(errors));

数字分隔符

分隔符是一种在数字中插入下划线,以便更易读的语法。

const largeNumber = 1_000_000;
console.log(largeNumber); // 输出: 1000000

逻辑赋值运算符

结合了逻辑运算符 &&、||、??​ 和逻辑表达式 =。

// "Or Or Equals" (or, the Mallet operator :wink:)
a ||= b; // a || (a = b);

// "And And Equals"
a &&= b; // a && (a = b);

// "QQ Equals"
a ??= b; // a ?? (a = b);

WeakRefs

WeakRefs 是一种新的对象引用类型,用于创建对对象的弱引用,不会影响对象的垃圾回收。

想象你有一个备忘录,但是只在你需要的时候才能看到。WeakRefs 就像是对对象的一种轻量级引用,不会让对象被保持得太久。

const obj = { data: 'Some data' };
const weakRef = new WeakRef(obj);

// 只有当 obj 还存在时,weakRef 才能获取到它
const retrievedObj = weakRef.deref();
console.log(retrievedObj?.data); // 输出: 'Some data'

ES2022

类私有属性

这是 JavaScript 中类的一个新特性,允许在类内部声明私有属性,仅在类的内部可访问。

想象你有一本笔记本,里面有些笔记是只有你能看到的。类私有属性就像是在类里面写下一些只有类自己能看到的东西。

class Person {
  #name = 'Alice'; // 私有属性

  sayHello() {
    console.log(`Hello, my name is ${this.#name}`);
  }
}

const person = new Person();
person.sayHello(); // 输出: 'Hello, my name is Alice'
console.log(person.#name); // 无法访问私有属性

私有字段检查

一种新的访问控制,允许类的私有属性在外部被访问时触发特定的操作。

想象你的门上装有警报,如果有人试图进入你的房间,会发出声音。私有字段检查就像是在访问私有属性时触发警报。

class BankAccount {
  #balance = 1000; // 私有属性

  #checkAccess() {
    console.log('Access to balance checked');
  }

  get balance() {
    this.#checkAccess();
    return this.#balance;
  }
}

const account = new BankAccount();
console.log(account.balance); // 输出: 'Access to balance checked' 和账户余额

顶层 await

允许在模块顶层使用 await

想象你在工作,需要等一份文件完成才能继续。顶层 await 就像是你在等这份文件,但不需要停下其他的工作。

// 在模块顶层使用 await
const data = await fetchData();
console.log(data);

.at 方法返回指定索引的元素

想象你有一个大盒子,里面有很多东西。.at 方法就像是帮你从盒子中取出特定位置的东西。

const arr = [1, 2, 3, 4, 5];
console.log(arr.at(2)); // 输出: 3

const text = 'Hello';
console.log(text.at(1)); // 输出: 'e'

Object.hasOwn()

一个全局函数,用于检查对象是否具有指定的自有属性。

想象你有一张名单,上面写着一些名字。Object.hasOwn() 就像是帮你查看名单上是否有某个名字。

const person = { name: 'Alice' };
console.log(Object.hasOwn(person, 'name')); // 输出: true
console.log(Object.hasOwn(person, 'age')); // 输出: false

异常链

一种更好地处理异常信息的方式,允许你在异常中包含更多信息。

想象你有一串蛋糕,但其中一个蛋糕有问题。异常链就像是在蛋糕上贴上标签,告诉你哪个蛋糕有问题,以及为什么有问题。

try {
  // 一些可能出错的代码
} catch (error) {
  const detailedError = new Error('详细错误信息');
  detailedError.originalError = error;
  throw detailedError;
}

类静态块

类的一个新特性,允许在类内部定义一块在类被初始化时执行的代码。

想象你在搭建一个房子,房子刚建好时,你想做一些特定的准备工作。类静态块就像是在房子刚建好时,执行一些初始化工作。

class MyClass {
  static {
    console.log('类初始化中...');
  }

  constructor() {
    console.log('实例化对象');
  }
}

const obj = new MyClass();

ES2023

Array 支持从尾部查找

新增两个方法: .findLast()、.findLastIndex()​ 从数组的最后一个元素开始查找,可以同 find()、findIndex() 做一个对比。

想象你有一条长长的队伍,人们站成一列。你可以从前面开始数,也可以从后面开始数。数组支持从尾部查找就像是你从队伍尾部开始数人。

const arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }];

// find vs findLast
console.log(arr.find(n n.value % 2 === 1)); // { value: 1 }
console.log(arr.findLast(n n.value % 2 === 1)); // { value: 3 }

// findIndex vs findLastIndex
console.log(arr.findIndex(n n.value % 2 === 1)); // 0
console.log(arr.findLastIndex(n n.value % 2 === 1)); // 2

Hashbang 语法

Hashbang 语法是一种在 URL 中使用 #! 符号,用于标记 Web 应用中的前端路由。

想象你有一本书,但书中有很多章节。你可以用不同的书签快速翻到你想读的章节。Hashbang 语法就像是在 URL 中放了一个特殊的书签,让你能迅速定位到网页的某个部分。

// URL 中的 Hashbang
https://example.com/#!/page1
https://example.com/#!/page2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置

关于pycharm安装出现的interpreter field is empty(解释器为空) 关于pycharm安装出现的interpreter field is empty,无法创建项目存储的位置。如图: 我之前安装的时候一直老是有这个提示,后来才发现是因为没安装这个p…

腾讯云服务器轻量和CVM有什么区别?

腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器价格便宜?是因为轻量服务器CPU内存性能比云服务器CVM性能差吗?轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境,云服务器CV…

linux 安装go 1.18版本

首先去官网找到对应的版本 直接下载下来(如果服务器可以直接访问到go 官网也可以wget直接下载到服务器) 然后把该包上传到linux 的/usr/local 目录下 然后直接解压安装该包: sudo tar -C /usr/local -zxvf go1.18.10.linux-amd64.tar.gz 然…

通过Statement静态语句,实现CRUD操作

首先你需要创建 数据库 和 s_students学生表,再进行下一步的 增(add),删(del),改(update),查(query)。 查询所有学生姓名: Testvoid query(){try{Statement st conn.createStatement();ResultS…

利用Torchmetrics库快速进行Torch的评价指标计算(推荐)

目录 1、安装 2、基本流程介绍 3、MetricCollection 4、自定义指标 5、我们可以调用多个指标计算不同的任务 6、可以是标签,也可以是one_hot编码 7、常用分类指标计算 8、异常报错 1、安装 官网地址:Welcome to TorchMetrics — PyTorch-Metrics 1.0.1 documenta…

JUL 日志 - 最简单易用的Java日志框架

在正式的生产环境下是不能使用 System.out 进行日志记录的 因为 System.out 不能提供时间、线程、执行过程 等信息,如果要手动打印输出则会非常麻烦 而日志就帮我们把这些事给干了 接下来我们学一个最简单的日志框架 JUL JUL全称Java util Logging是java原生的日志框…

用户数据报协议UDP

UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…

资源限制类题目解法,看这一篇就够了!

算法拾遗三十七资源限制类题目 资源限制技巧汇总32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使用最多1GB的内存,怎么找到出现次数最多的数32位无符号整数的范围是0~4294967295,现在又一…

【VBA入门】WorkBook 对象 Name操作 宏录制筛选删除代码

VBA 入门 问题记录1 了解Excel工作簿、表格关系1 默认新建WorkBook2 新建WorkBook并命名工作表添加数据3新建带有指定数量工作表的工作簿 ActiveWorkbook.Names用法(1) 创建名称 (全局名称和局部名称) 宏录制验证删除可行性大招!!&#xff01…

Linux基础与应用开发系列九:各类系统函数与标准IO函数

open_close函数 OPEN函数 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 函数原型&#xff1a; 当文件存在时 int open(const char* pathname,int flags) 当文件不存在时 int open (const char* pathname,int f…

(黑客)自学误区

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 行为&#xff1a;从编程开始掌握&#xff0c;前端后端、通信协议、什么都学。 缺点&#xff1a;花费时间太长、实际向安全过渡后可用到的关键知识并不多…

【2023最新美团笔试题目分析】“求最多出现数字及次数“、坦克大战在线对战游戏(问题描述 + 示例代码 + 时间复杂度分析)

弃幼少嬉戏堕慢之心,而衎衎于进德修业之志。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区特邀专家博主

光致发光二极管光源——荧光效率检测系统

发光二极管&#xff08;LED&#xff09;光源已经逐步地取代传统光源&#xff0c;并在生产和生活中得以广泛应用。荧光粉在LED照明设备中起到了至关重要的作用&#xff0c;其功能为将转换芯片所产生的紫外或者蓝光&#xff0c;发射出目标颜色的光。近年来&#xff0c;人们为了提…

计算文本相似度

目录 Python中的difflib模块模块用法报告涉及的符号实现文本对比普通文本对比文本对比生成HTML报告 余弦相似度sklearn安装使用sklearn的余弦相似度词袋模型 Jaccard相似度编辑距离&#xff08;Levenshtein距离&#xff09;TF-IDFWord2VecDoc2VecBERT结论 Python中的difflib模块…

使用阿里云服务器搭建Discuz论坛网站教程基于CentOS系统

阿里云百科分享使用阿里云服务器建站教程&#xff0c;本文是搭建Discuz论坛&#xff0c;Discuz!是一款通用的社区论坛软件系统&#xff0c;它采用PHP和MySQL组合的基础架构&#xff0c;为您提供高效的论坛解决方案。本文介绍如何在CentOS 7操作系统的ECS实例上搭建Discuz! X3.4…

如何使用 ESP-01S 模块

如何使用 ESP-01S 模块 原始PDF文档 参考&#xff1a; 将 ESP-01 用作 WiFi shield的更好方法 (e-tinkers.com) How do I use ESP8266 ESP-01S WiFi Module with ESP-01S Adapter - Using Arduino / Programming Questions - Arduino Forum ESP-01S WiFi 模块 – 配置布线 -…

自动化测试是什么?自动化测试学什么?自动化测试面试题及答案?--看完后吊打面试官

一、前言 最近有童鞋和我抱怨&#xff0c;说网上很难搜到那些全面又合适的自动化测试面试题&#xff0c;这里根据我个人的经验以及收集整理的&#xff1a; 你没看错&#xff0c;不慌&#xff0c;慢慢来。 先从什么是自动化测试开始说起哈&#xff01; 二、什么是自动化测试&…

点淘的MCN机构申请详细入驻指南!

消费趋势的变化&#xff0c;来自消费人群的变化。 后疫情时代&#xff0c;经济复苏的反弹力度不足&#xff0c;人们开始怀疑我们正从前几年的消费升级&#xff0c;跌入消费降级的时代&#xff0c;但这并不能准确概括消费市场的变化。 仔细翻看各大奢侈品集团的财报&#xff0…

Android高通8.1 Selinux问题

1、最近客户提了一个需求&#xff0c;说要在user版本上面切分辨率&#xff0c;默认屏幕分辨率是2.5 k 执行adb shell指令之后变成 4k 然后adb shell wm size可以查看 2、一开始我能想到就是在文件节点添加权限&#xff0c;这里不管是mtk还是qcom&#xff08;高通平台&#xff…

MySQL中用什么数据类型存IP地址

提到IP地址(IPv4)&#xff0c;我们脑子里肯定立马浮现类似于192.168.0.1、127.0.0.1这种常见的IP地址&#xff0c;然后结合这个问题“MySQL中用什么数据类型存IP地址&#xff1f;”&#xff0c;于是乎脱口而出用char字符串类型存储。 然后再仔细想想发现&#xff0c;这个IP地址…