当前位置: 首页 > news >正文

Es6进阶

class里的get和set

  1. 在 ES6 中,class 里的 get 和 set 是用于定义访问器属性的关键字。get 方法可在访问对象属性时调用,set 方法则在设置对象属性时调用。下面通过一个简单示例来介绍它们的用法:
javascript
class Person {constructor(name) {this._name = name;}
// 使用 get 方法获取属性值
get name() {return this._name.toUpperCase();
}// 使用 set 方法设置属性值
set name(newName) {if (typeof newName === 'string' && newName.length > 0) {this._name = newName;} else {console.log('请输入有效的姓名');}
}

}

const person = new Person('John');// 调用 get 方法
console.log(person.name); // 调用 set 方法
person.name = 'Alice';
console.log(person.name); // 尝试设置无效姓名
person.name = '';

代码解释:

  1. constructor 方法:这是类的构造函数,在创建 Person 类的实例时会调用它。这里接收一个参数 name,并把它赋值给实例的 _name 属性。
  2. get name() 方法:当访问 person.name 时,该方法会被调用,它返回 _name 属性值并转换为大写。
  3. set name(newName) 方法:当给 person.name 赋值时,此方法会被调用。它会先检查传入的 newName 是否为有效的字符串,若有效则更新 _name 属性,否则输出错误信息。

数值扩展

  1. 二进制和八进制
  2. 二进制表示方式是0bxxxx
  3. 八进制表示方式是0oxxxx
  4. 十六进制表示方式是0x
对象方法的扩展
  1. 简洁表示法
    在定义对象的属性和方法时,如果属性名和变量名相同,以及方法是函数表达式时,可以使用简洁表示法。
javascript
let name = 'Alice';
let age = 30;
let person = {name, // 等同于 name: nameage,sayHello() { // 等同于 sayHello: function() {... }console.log(`Hello, I'm ${this.name}`);}
};
  1. 对象方法的 name 属性

对象方法的 name 属性可以获取方法的实际名称,即使方法被赋值给其他变量。

j

avascript
let obj = {getName() {return 'Bob';}
};
let func = obj.getName;
console.log(func.name); // 输出 "getName"
  1. super 关键字

在对象的方法中,super 可以调用对象原型上的方法。常用于对象继承场景。

javascript
const parent = {say() {console.log('parent');}
};
const child = {__proto__: parent,say() {super.say();console.log('child');}
};
child.say(); 
// 先输出 "parent",再输出 "child"
  1. Object.assign()

用于对象的合并,将源对象的所有可枚举属性复制到目标对象。
● 目标对象与源对象有同名属性:当使用 Object.assign() 合并对象时,如果目标对象和源对象存在相同的属性名,源对象的属性值会覆盖目标对象的属性值。例如:

javascript
let target = { a: 1, b: 2 };
let source = { b: 4, c: 5 }; 
let result = Object.assign(target, source); 
console.log(result); 
// 输出:{ a: 1, b: 4, c: 5 },target对象的b属性值被source对象的b属性值覆盖

● 多个源对象有同名属性:如果有多个源对象,且它们之间存在同名属性,排在后面的源对象的属性值会覆盖前面源对象的属性值。例如:

j

avascript
let source1 = { x: 10, y: 20 };
let source2 = { y: 30, z: 40 };
let target = {};
let result = Object.assign(target, source1, source2); 
console.log(result); 
// 输出:{ x: 10, y: 30, z: 40 },source2的y属性值覆盖了source1的y属性值

● 属性值为对象时的浅拷贝覆盖:Object.assign() 执行的是浅拷贝。当属性值是对象时,源对象中的对象会直接覆盖目标对象中同名的对象属性(实际上是复制引用),后续对这个对象属性内部属性的修改,会同时影响到目标对象和源对象中该属性指向的对象。例如:

javascript
let target = { info: { name: 'Alice', age: 25 } };
let source = { info: { age: 26 } };
let result = Object.assign(target, source); 
console.log(result.info); 
// 输出:{ age: 26 } ,target的info对象被source的info对象覆盖(浅拷贝)javascript
let target = { a: 1 };
let source1 = { b: 2 };
let source2 = { c: 3 };
Object.assign(target, source1, source2);
console.log(target); 
// 输出 { a: 1, b: 2, c: 3 }
  1. Object.is()

比较两个值是否相等,和 === 类似,但对 +0 与 -0 、NaN 与 NaN 的判断结果不同。

javascript
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
console.log(+0 === -0); // true
  1. Object.keys()、Object.values()、Object.entries()

● Object.keys():返回一个包含对象自身所有可枚举属性名的数组。
● Object.values():返回一个包含对象自身所有可枚举属性值的数组。
● Object.entries():返回一个包含对象自身所有可枚举属性的键值对数组。

javascript
let obj = { a: 1, b: 2 };
console.log(Object.keys(obj)); // ["a", "b"]
console.log(Object.values(obj)); // [1, 2]
console.log(Object.entries(obj)); // [["a", 1], ["b", 2]]

asyna

  1. 基本定义和特点

async 函数是使用 async 关键字定义的函数,它总是返回一个 Promise 对象。如果 async 函数的返回值不是一个 Promise,那么 JavaScript 会自动将其包装成一个已解决(resolved)状态的 Promise。

javascript
async function fetchData() {return '这是异步获取的数据';
}const result = fetchData();
console.log(result); 
// 输出一个 Promise 对象,状态为 resolved,值为 '这是异步获取的数据'
  1. 与 await 关键字结合使用

await 关键字只能在 async 函数内部使用,它用于暂停 async 函数的执行,直到等待的 Promise 对象被解决(resolved)或被拒绝(rejected)。

javascript
function delay(ms) {return new Promise((resolve) => {setTimeout(() => {resolve('延迟结束');}, ms);});
}async function asyncExample() {console.log('开始执行异步操作');const data = await delay(2000);console.log(data); console.log('异步操作完成');
}
  1. asyncExample();

在上述代码中,asyncExample 函数是一个 async 函数,await delay(2000) 会暂停函数的执行,直到 delay 返回的 Promise 被解决(即 2 秒后),然后继续执行后续的代码。

  1. 错误处理

async 函数中的错误可以使用 try…catch 语句来捕获。当 await 一个被拒绝的 Promise 时,try…catch 可以捕获到这个错误。

javascript
function errorPromise() {return new Promise((_, reject) => {reject('发生错误');});
}async function handleError() {try {await errorPromise();} catch (error) {console.log('捕获到错误:', error);}
}
  1. handleError();
    1. await 是 JavaScript 中用于处理异步操作的关键字,它只能在 async 函数内部使用。await 的作用是暂停 async 函数的执行,直到它等待的 Promise 对象被 fulfilled(成功)或 rejected(失败),然后继续执行 async 函数后续的代码。
    2. await 语法的详细介绍:
      基本语法:
      await 表达式的一般形式为:await promise,其中 promise 是一个 Promise 对象(或者是一个可以被隐式转换为 Promise 的值)。
javascript
// 定义一个返回 Promise 的函数
function fetchData() {return new Promise((resolve) => {setTimeout(() => {resolve('数据已获取');}, 1000);});
}// 定义 async 函数
async function getData() {console.log('开始获取数据');// 使用 await 等待 Promise 解决const result = await fetchData();console.log(result); console.log('数据获取完成');
}
  1. getData();

    1. 在上述代码中,getData 是一个 async 函数,await fetchData() 这行代码会暂停 getData 函数的执行,直到 fetchData 返回的 Promise 被 resolve。当 Promise 成功解决后,await 表达式会返回 Promise 的解决值(这里是字符串 ‘数据已获取’),并继续执行 async 函数后续的代码。
      处理拒绝状态的 Promise

    2. 当 await 一个被 rejected 的 Promise 时,async 函数会抛出一个错误。可以使用 try…catch 语句来捕获这个错误。

javascript
function errorPromise() {return new Promise((_, reject) => {reject('发生错误');});
}async function handleError() {try {await errorPromise();} catch (error) {console.log('捕获到错误:', error);}
}
  1. multiSteps();

    multiSteps 函数中依次使用 await 等待 step1 和 step2 返回的 Promise,确保每个步骤按顺序执行。

对象方法的扩展

● 直接在对象字面量中添加方法:可以在定义对象时,直接在对象字面量中添加方法。这种方式简单直观,适用于简单的对象定义。

javascript
let person = {name: 'Alice',age: 30,sayHello: function() {console.log(`Hello, my name is ${this.name}`);}
};
person.sayHello(); // 输出: Hello, my name is Alice

● 使用Object.assign()方法:Object.assign() 方法用于将一个或多个源对象的属性和方法复制到目标对象。如果源对象中有方法,这些方法也会被复制到目标对象上。

javascript
let source = {method1: function() {console.log('This is method1');}
};
let target = {};
Object.assign(target, source);
target.method1(); // 输出: This is method1

● 通过原型链扩展:在 JavaScript 中,每个对象都有一个原型对象。可以通过修改原型对象来为所有基于该原型的对象扩展方法,这样创建的新对象都会继承这些方法。

javascript
function Animal() {}
Animal.prototype.speak = function() {console.log('The animal makes a sound');
};
let dog = new Animal();
dog.speak(); // 输出: The animal makes a sound

● 利用 ES6 的类和继承:ES6 引入了类的概念,通过继承可以创建一个新类,该类不仅拥有自己定义的方法,还能继承父类的方法,也可以重写父类方法或添加新方法来扩展功能。

javascript
class Vehicle {constructor(make, model) {this.make = make;this.model = model;}start() {console.log(`The ${this.make} ${this.model} starts`);}
}
class Car extends Vehicle {constructor(make, model, numDoors) {super(make, model);this.numDoors = numDoors;}// 扩展新方法displayInfo() {console.log(`This ${this.make} ${this.model} has ${this.numDoors} doors`);}
}
let myCar = new Car('Toyota', 'Corolla', 4);
myCar.start(); // 输出: The Toyota Corolla starts
myCar.displayInfo(); // 输出: This Toyota Corolla has 4 doors

● 使用Object.defineProperty()和Object.defineProperties():Object.defineProperty() 方法可以在一个对象上定义一个新属性,或修改一个现有属性,并返回此对象。Object.defineProperties() 则可以一次性定义多个属性。可以利用它们为对象定义带有 getter 和 setter 函数的属性,从而实现对属性访问和设置的自定义逻辑,这也间接扩展了对象的功能。

javascript
let obj = {};
Object.defineProperty(obj, 'count', {value: 0,writable: true,enumerable: true,configurable: true
});
Object.defineProperty(obj, 'increment', {value: function() {this.count++;},writable: true,enumerable: true,configurable: true
});
  • obj.increment();
    console.log(obj.count); // 输出: 1
  1. 获取对象的所有键:object.key(xxx)
  2. 获取对象的所有值:object.value(xxx)
  3. 获取对象的所有键值对:object.entries(xxx);为了创建Map
  4. 区别:
    意思就是用entries可以快速地以数组的形式拿到所有键值对,来创建map
    getOwnPropertyDescriptors()用来获取对象属性的描述对象

扩展运算符和rest

在 JavaScript 里,扩展运算符(Spread Operator)和剩余参数(Rest Parameters)是 ES6 引入的两个实用特性,它们都采用三个点 … 来表示,不过功能有所不同。下面为你分别介绍。

扩展运算符

扩展运算符能够把数组或者对象展开成多个元素。
展开数组

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

展开对象

javascript
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // 输出: { a: 1, b: 2, c: 3, d: 4 }

函数调用时展开数组

javascript
function sum(a, b, c) {return a + b + c;
}
const numbers = [1, 2, 3];
const result = sum(...numbers);
console.log(result); // 输出: 6
剩余参数

剩余参数会把多个独立的参数聚合成一个数组。
函数定义中使用剩余参数
j

avascript
function sumAll(...numbers) {return numbers.reduce((acc, num) => acc + num, 0);
}
const total = sumAll(1, 2, 3, 4, 5);
console.log(total); // 输出: 15

解构赋值中使用剩余参数

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

正则表达式中,命名捕获分组

  1. 语法
    命名捕获分组使用 (?<组名>模式) 的形式,其中 <组名> 是你为捕获组取的名称,模式 是该分组要匹配的正则表达式内容。例如,想要匹配并命名捕获邮箱地址中的用户名部分,可以这样写:/(?\w+)@example.com/ ,这里 (?\w+) 就是一个命名捕获分组,username 是组名,\w+ 是匹配一个或多个单词字符的模式。
  2. 获取捕获结果
    在 JavaScript 中,可以通过正则表达式的 exec 或字符串的 match 等方法获取命名捕获分组的结果,得到的匹配结果对象中会包含一个 groups 属性,该属性是一个对象,其属性名就是命名捕获分组的名称,属性值则是对应的捕获内容。示例如下:
javascript
const str = "test@example.com";
const regex = /(?<username>\w+)@example\.com/;
const match = str.match(regex);
console.log(match.groups.username); // 输出: test
  1. 替换操作中的应用
    在字符串替换操作中,命名捕获分组也很有用。比如在 JavaScript 中使用 replace 方法时,可以通过 $<组名> 的形式引用命名捕获分组的内容。示例:
javascript
let str = "hello world";
let newStr = str.replace(/(?<word1>\w+)\s(?<word2>\w+)/, "$<word2> $<word1>");
console.log(newStr); // 输出: world hello

优势
● 可读性强:相比传统的数字编号捕获组(如 $1 、$2 等),命名捕获分组通过有意义的名称,使代码意图更加清晰,尤其在复杂的正则表达式中,便于理解和维护。
● 易于维护:当正则表达式结构发生变化时,数字编号捕获组的顺序可能改变,导致引用错误;而命名捕获分组通过名称引用,不受顺序变化的影响,降低了维护成本。

正向反向断言

● 肯定反向断言:语法是(?<=pattern),表示只有在pattern(模式)之后的内容才会被匹配。比如要匹配 “100 元” 中的数字,使用(?<=\d)元,这里(?<=\d)就是肯定反向断言,它要求 “元” 字前面必须是数字,才能匹配成功。
● 否定反向断言:语法是(?<!pattern),表示只有不在pattern(模式)之后的内容才会被匹配。例如(?<!\d)元,意味着 “元” 字前面不是数字时才匹配,像 “单元” 能匹配,而 “100 元” 不匹配。
● 正向肯定断言
语法为(?=pattern) ,表示只有当pattern(模式)在当前位置之后出现时,才会匹配成功。例如,想要匹配后面跟着com的atguigu,可以使用正则表达式atguigu(?=com) ,像atguigucom中的atguigu能被匹配到,但atguiguedu中的atguigu则不会被匹配。它常用于从文本中筛选出符合特定后置条件的内容。
● 正向否定断言
语法是(?!pattern) ,意思是只有当pattern(模式)不在当前位置之后出现时,才会匹配成功。比如,要匹配后面不是com的atguigu,可写为atguigu(?!com) ,那么atguiguedu中的atguigu能匹配,而atguigucom中的atguigu就匹配不上。正向否定断言有助于排除特定后置条件的文本匹配 。

dotall模式

  1. 在 JavaScript 正则表达式中,dotall模式也叫点号通配模式,是一种让 . 字符能够匹配包括换行符在内的所有字符的模式。在没有开启dotall模式时,. 只能匹配除换行符(如 \n、\r 等)之外的任意字符。
  2. 开启方式
    在正则表达式的修饰符中添加 s 即可开启 dotall 模式。例如:
javascript
const str = "Hello\nWorld";
// 未开启dotall模式
const reg1 = /.+/; 
const result1 = reg1.exec(str);
console.log(result1[0]); 
// 输出: Hello// 开启dotall模式
const reg2 = /.+/s; 
const result2 = reg2.exec(str);
console.log(result2[0]); 
// 输出: Hello\nWorld

应用场景
● 处理多行文本:在解析 HTML、XML 等格式的多行文本内容时,开启dotall模式可以更方便地匹配跨越多行的内容。比如匹配一段 HTML 中的所有内容,不管其中是否包含换行符。
● 文本搜索与替换:当需要在包含换行的大段文本中查找和替换特定模式时,dotall模式能确保正则表达式按预期工作,避免因换行符而导致匹配不完整的情况。

正则表达式中的dotall知识点
  1. 基础概念
    在正则表达式里,点号(.)是一个特殊字符,在没有开启dotall模式时,它能匹配除换行符(\n)、回车符(\r)、行分隔符(\u2028)、段分隔符(\u2029)以及四个字节的 UTF - 16 字符外的任意单个字符 。而 ES9(ES2018)引入了s修饰符(也称为dotall模式),添加该修饰符后,点号(.)的匹配规则会发生变化,可以匹配包括换行符在内的任意单个字符。
  2. 语法和使用示例
    语法:使用字面量定义正则表达式时,在末尾加上s修饰符,如/pattern/s;使用RegExp构造函数时,第二个参数传入s,如new RegExp(‘pattern’,‘s’)。
示例:
javascript
// 未开启dotall模式
let str = "foo\nbar";
let regex1 = /foo.bar/;
console.log(regex1.test(str)); // false
// 开启dotall模式
let regex2 = /foo.bar/s;
console.log(regex2.test(str)); // true//在上述代码中,字符串str包含换行符\n,regex1未开启dotall模式,所以foo和bar之间的换行符无法被.匹配,返回false;而regex2使用s修饰符开启了dotall模式,.能匹配换行符,因此返回true。
  1. dotall属性
    正则表达式实例有一个只读的dotall属性,用于表明该正则表达式是否使用了s修饰符。如果使用了s修饰符,dotall的值为true,否则为false。示例如下:
javascript
let regex3 = /abc/s;
let regex4 = /abc/;
console.log(regex3.dotall); // true
console.log(regex4.dotall); // false
  1. 与其他修饰符的区别
    和m(多行)修饰符:m修饰符用于指定多行输入字符串应被视为多个行,影响的是和 的匹配行为,即和 的匹配行为,即和 的匹配行为,即和会匹配每一行的开头和结尾,而不是整个字符串的开头和结尾;而s修饰符只影响.的匹配行为,使其能匹配任意字符。例如:
javascript
let multilineStr = "java\npython";
let regexM = /^java/m;
let regexS = /java.s/;
console.log(regexM.test(multilineStr)); // true
console.log(regexS.test(multilineStr)); // false

和u(Unicode)修饰符:u修饰符用于正确处理大于\uFFFF的 Unicode 字符,当匹配多字节的 emoji 字符等时需要用到;s修饰符主要用于改变.的匹配规则。例如:

javascript
let emojiStr = "😀abc";
let regexU = /^.$/u;
let regexSU = /^.$/us;
console.log(regexU.test(emojiStr)); // true
console.log(regexSU.test(emojiStr)); // true
// 若字符串包含换行符,二者表现不同
let emojiStrWithLineBreak = "😀\nabc";
let regexU2 = /^.$/u;
let regexSU2 = /^.$/us;
console.log(regexU2.test(emojiStrWithLineBreak)); // false
console.log(regexSU2.test(emojiStrWithLineBreak)); // true
  1. 应用场景
    在处理包含换行符的文本,如 HTML、XML 等格式的字符串,需要匹配跨越多行的内容时,dotall模式非常有用。例如,提取 HTML 标签内包含换行的文本内容:
javascript
let htmlStr = `
● 电影名称
上映日期: 2024-01-01
`;
let reg = /
● .*?(.*?)<\/a>.*?
(.*?)<\/p>/gs; let result; let data = []; while (result = reg.exec(htmlStr)) { data.push({ title: result[1], time: result[2] }); } console.log(data);

在 JavaScript 中,除了g(全局匹配)和s(dotAll 模式)修饰符外,正则表达式还可以使用以下修饰符:

● i(忽略大小写):使正则表达式在匹配时忽略字符的大小写。比如,正则表达式/hello/i可以匹配字符串中的Hello、hELLo 等各种大小写形式的 “hello”。示例代码如下:

javascript
let str = "Hello, World!";
let regex = /hello/i;
console.log(regex.test(str)); 
// 输出: true

● m(多行匹配):改变和$的匹配行为。默认情况下,^匹配字符串的开头,$匹配字符串的结尾;添加m修饰符后,和$会匹配每一行的开头和结尾。例如,对于字符串"Line1\nLine2",正则表达式/^Line/m能匹配到"Line1"和"Line2"。示例如下:

javascript
let multiLineStr = "Line1\nLine2";
let regexM = /^Line/m;
console.log(regexM.test(multiLineStr)); 
// 输出: true

● u(Unicode 模式):用于正确处理大于\uFFFF的 Unicode 字符。在未使用u修饰符时,JavaScript 正则表达式会将大于\uFFFF的 Unicode 字符拆分为两个代理项对来处理;使用u修饰符后,会将其视为一个完整字符。比如,对于包含表情符号(属于高 Unicode 字符)的字符串,使用u修饰符才能准确匹配。示例如下:

javascript
let emojiStr = "😀";
let regexWithoutU = /^.$/;
let regexWithU = /^.$/u;
console.log(regexWithoutU.test(emojiStr)); 
// 输出: false
console.log(regexWithU.test(emojiStr));  
// 输出: true

● y(粘性匹配):让正则表达式从lastIndex属性指定的位置开始匹配,并且要求必须在该位置找到匹配项,否则匹配失败。每次成功匹配后,lastIndex会更新到匹配内容的末尾。示例如下:

javascript
let str = "abcabc";
let regex = /abc/y;
regex.lastIndex = 3;
console.log(regex.exec(str)); 
// 输出: ["abc"]
regex.lastIndex = 1;
console.log(regex.exec(str)); 
// 输出: null

方法简写
在 ES6 及以后版本中,定义对象方法时,若方法名为键,方法体为值,可以使用更简洁的写法。比如:

Javascript
const person = {name: 'Alice',// 传统写法:sayHello: function() {... }sayHello() { console.log(`Hello, my name is ${this.name}`);}
};
person.sayHello();
  1. Object.keys()
    该方法用于返回一个数组,数组的成员是对象自身的(不包含继承的)所有可枚举属性的键名。例如:
javascript
const obj = { a: 1, b: 2, c: 3 };
const keys = Object.keys(obj);
console.log(keys); 
// 输出: ["a", "b", "c"]
  1. Object.values()
    作用是返回一个数组,成员是对象自身的(不包含继承的)所有可枚举属性的键值。示例如下:
javascript
const obj = { x: 'apple', y: 'banana' };
const values = Object.values(obj);
console.log(values); 
// 输出: ["apple", "banana"]
  1. Object.entries()
    此方法返回一个数组,成员是对象自身的(不包含继承的)所有可枚举属性的键值对数组。例如:
javascript
const user = { id: 1, name: 'Bob' };
const entries = Object.entries(user);
console.log(entries); 
// 输出: [[1, "Bob"]]
  1. Object.assign()
    用于对象的合并,将一个或多个源对象的所有可枚举属性,复制到目标对象上。如果目标对象和源对象存在相同的属性名,源对象的属性会覆盖目标对象的属性。它实行的是浅拷贝,即如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。例如:
javascript
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
console.log(target); 
// 输出: { a: 1, b: 2, c: 3 }
  1. Object.is()
    用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致,但有两点不同:一是+0不等于-0 ,二是NaN等于自身。比如:
javascript
console.log(Object.is(+0, -0)); 
// 输出: false
console.log(Object.is(NaN, NaN)); 
// 输出: true
  1. Object.getOwnPropertyDescriptors()
    返回指定对象所有自身属性(非继承属性)的描述对象。每个描述对象包含了属性的value(值)、writable(是否可写)、enumerable(是否可枚举)、configurable(是否可配置)等信息。例如:
javascript
const myObject = {prop: 42
};
const descriptors = Object.getOwnPropertyDescriptors(myObject);
console.log(descriptors); 
// 输出: { prop: { value: 42, writable: true, enumerable: true, configurable: true } }
  1. Object.setPrototypeOf() 与 Object.getPrototypeOf()
    ● Object.setPrototypeOf()方法用来设置一个对象的原型对象(prototype),返回参数对象本身。例如:Object.setPrototypeOf(obj, proto);,这会将proto对象设为obj对象的原型。
    ● Object.getPrototypeOf()方法用于读取一个对象的原型对象。比如const prototype = Object.getPrototypeOf(someObject);,可以获取someObject的原型。
  2. Object.fromEntries()
    是Object.entries()的逆操作,用于将一个键值对数组转为对象。该方法特别适合将Map结构转为对象。例如:
javascript
const entriesArray = [['name', 'Eve'], ['age', 25]];
const newObject = Object.fromEntries(entriesArray);
console.log(newObject); 
// 输出: { name: 'Eve', age: 25 }
map与set区别

Map和Set都是 ES6 中引入的新的数据结构,它们都用于存储数据,但在使用场景、数据结构和操作方法等方面存在一些区别,具体如下:

  1. 数据结构
    ● Map是一种键值对的集合,它允许你使用任何类型的值作为键,并将其与另一个值(可以是任何类型)进行关联。
    ● Set是一个值的集合,其中每个值都是唯一的,不允许有重复的值。
  2. 常用操作方法
    ● Map:
    ○ set(key, value):添加键值对。
    ○ get(key):获取指定键的值。
    ○ has(key):检查是否包含指定键。
    ○ delete(key):删除指定键值对。
    ● Set:
    ○ add(value):添加值。
    ○ has(value):检查是否包含指定值。
    ○ delete(value):删除指定值。
    ○ clear():清空Set。
  3. 遍历方式
    ● Map:
    ○ keys():返回键的迭代器。
    ○ values():返回值的迭代器。
    ○ entries():返回键值对的迭代器,形式为[key, value]。
    ● Set:
    ○ keys()和values():行为相同,都返回值的迭代器,因为Set中的值就是键。
    ○ entries():返回一个迭代器,其包含的元素为[value, value]形式的数组。
  4. 使用场景
    ● Map:当需要存储和查找键值对数据,且键可以是任意类型时,使用Map。例如,存储用户信息,键可以是用户 ID(可以是数字、字符串或对象等),值可以是包含用户详细信息的对象。
    ● Set:当需要存储一组唯一的值,并且不关心键值对关系,只关注值的唯一性时,使用Set。例如,统计一个数组中不重复的元素,或者用于管理一组具有唯一性的权限、角色等。

字符串方法的扩展

● trimStart():去除字符串开头的空格。

javascript
const str = '   Hello, World!';
console.log(str.trimStart()); // 输出: 'Hello, World!'

● trimEnd():去除字符串结尾的空格。javascript

const str = 'Hello, World!   ';
console.log(str.trimEnd()); // 输出: 'Hello, World!'

● matchAll():返回一个包含所有匹配结果的迭代器,可用于全局匹配。

javascript
const str = 'abcabc';
const regex = /abc/g;
const matches = str.matchAll(regex);
for (const match of matches) {console.log(match);
}

相关文章:

Es6进阶

class里的get和set 在 ES6 中&#xff0c;class 里的 get 和 set 是用于定义访问器属性的关键字。get 方法可在访问对象属性时调用&#xff0c;set 方法则在设置对象属性时调用。下面通过一个简单示例来介绍它们的用法&#xff1a; javascript class Person {constructor(nam…...

可发1区的创新思路:​基于K-means聚类的EMD-BiLSTM-CNN-Attention时间序列预测模型(功率预测、寿命预测、流量预测、故障诊断)

首先声明,该模型为原创!原创!原创! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、交通流量预测、电机故障检测等等。 二、模型整体介绍(本文以光伏功率预测为例) 核心架构 ​数据聚类:K-means对风电场机组分组,降低异质性干扰。​…...

Android BLE 权限管理

前言 android 权限一直是比较活跃的 在蓝牙权限这一块又分新版和旧版 新版权限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT旧版权限如9.0以下 Manifest.permission.A…...

vue3 ts 注册全局组件

vue3 ts 注册全局组件 register.tsmain.ts register.ts // 注册全局组件 import {App} from "vue" import headerPage from "/headerPage.vue" export default {install(app:App){app.component("headerPage",headerPage)} }main.ts import re…...

Apache Doris学习

https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构&#xff08;大规模并行处理&#xff09;的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询…...

llama源码学习·model.py[7]Transformer类

一、源码展示 class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params paramsself.vocab_size params.vocab_sizeself.n_layers params.n_layersself.tok_embeddings VocabParallelEmbedding(params.vocab_size, params.dim,…...

Windows server 2022域控制服务器的配置

Windows server 2022介绍 一、核心特性与改进 安全核心服务器&#xff08;Secured-Core Server&#xff09; 硬件级安全&#xff1a;支持基于硬件的安全功能&#xff08;如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS&#xff09;&#xff0c;防止固件攻击。受信任的启动链…...

yolo目标检测算法在DJI上的研究分析(大纲)

yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求&#xff1a; DJI设备&#xff08;如无人机、摄像头&#xff09;在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...

三、重学C++—C语言内存管理

上一章节&#xff1a; 二、重学C—C语言核心-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146191640?spm1001.2014.3001.5502 本章节代码&#xff1a; cPart2 CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/…...

DAY37 动态归化Ⅰ基础题目

509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int fib(int n) {if(n<1) return n;int dp[2];dp[0]0;dp[1]1;int sum0;for(int i2;i<n;i){sum dp[0]dp[1];dp[0]dp[1];dp[1]sum;}return sum;} }; 70. 爬楼梯 - 力扣&#xff08;Lee…...

ABAP Core Data Services (SAP PRESS) (First Edition)

ABAP Core Data Services (SAP PRESS) (First Edition)...

ORM——对象关系映射

对象关系映射&#xff08;ORM&#xff09;深度解析&#xff1a;原理、优势与应用场景 一、什么是ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09;即对象关系映射&#xff0c;是一种将面向对象编程中的对象与关系型数据库中的表进行映射的技术。简单来…...

【Docker系列五】Docker Compose 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

大语言模型-2.2/3-主流模型架构与新型架构

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…...

JAVA组件的利用漏洞 Shlr搜索引擎 shiro身份 Log4j日志

solr组件 1、作用 &#xff1a; 基于http和apache lucene 进行全文搜索服务器 2、识别&#xff1a; 第一个就是图标类似于华为的那个 然后就是端口标识是 8983 3、CVE利用&#xff1a; 1、命令执行&#xff08;CVE-2019-17558&#xff09; Apache Solr 5.0.0版本至8…...

MongoDB未授权访问漏洞

1、连接MongoDB&#xff0c;添加账号密码 mongo 127.0.0.1 use admindb.createUser({user: admin,pwd: MongoDB123%.com,roles:[{role: root,db: admin}] })创建admin用户&#xff0c;密码为&#xff1a;MongoDB123%.com 2、设置完成&#xff0c;可以通过指令 show users 查看…...

CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~

汇总结果来源&#xff1a;CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开&#xff0c;则说明还未公布&#xff0c;在公布后笔者会及时添加. 若笔者未及时添加&#xff0c;欢迎读者告知. 文章根据题目关键词搜索&#xff0c;可能会有遗漏. 若笔者出现…...

MyBatis 动态 SQL 优化:标签的实战与技巧

目录 动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL&#xff1f;1.2 动态SQL的优点1.3 动态SQL的常见用途 二、动态SQL的常见用法&#xff08;XML方式&#xff09;2.1 < if > 标签2.2 < trim> 标签2.3 <where>标签2.4<set>标签2.5 <foreach&g…...

自动化机器学习(TPOT优化临床试验数据)

目录 自动化机器学习(TPOT优化临床试验数据)1. 引言2. 项目背景与意义2.1 临床试验数据分析的重要性2.2 自动化机器学习的优势2.3 工业级数据处理与GPU加速需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化机器学习与TPOT4.1 自动化机器学习简介4.2 TPOT在临…...

spring boot3 验证码工具kaptcha使用

1、pom.xml文件&#xff0c;下载验证码工具kaptcha依赖 官网搭建的spring boot项目 <!--验证码工具kaptcha的依赖--> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId> </dependency> 阿里云…...

Android 根据Url使用Retrofit框架进行文件下载

一、背景 根据后端返回的url下载地址,去执行文件下载&#xff0c;将文件保存到SD卡。这里使用Retrofit网络框架。 二、代码实现 2.1、定义一个DownloadFileService interface DownloadFileService {StreamingGETsuspend fun downloadFile(Url fileUrl: String):ResponseBody…...

可视化动态表单动态表单界的天花板--Formily(阿里开源)

文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态&#xff1a; 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…...

Java常用类

常用类 1.包 2.String类 3.String注意事项 String是不可变字符串对象。只要是以“ …. ”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份。但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。String s2 s1 "a"…...

多模态大模型常见问题

1.视觉编码器和 LLM 连接时&#xff0c;使用 BLIP2中 Q-Former那种复杂的 Adaptor 好还是 LLaVA中简单的 MLP 好&#xff0c;说说各自的优缺点&#xff1f; Q-Former&#xff08;BLIP2&#xff09;&#xff1a; 优点&#xff1a;Q-Former 通过查询机制有效融合了视觉和语言特征…...

2025 年大模型排行分析:中美竞争与未来展望

具体排名数据见文章结尾 在人工智能领域&#xff0c;大模型的性能成为衡量机构技术实力的重要标志。以下是根据最新排名的一些主要发现&#xff0c;尤其关注中国模型的发展现状和优势。 全球领先的模型 在本次排名中&#xff0c;美国 OpenAI 的多个版本占据榜首位置。具体而…...

为什么后端路由需要携带 /api 作为前缀?前端如何设置基础路径 /api?

一、为什么后端路由需要携带 /api 作为前缀&#xff1f; 1. 区分 API 端点与其他路由 在 Web 应用程序中&#xff0c;后端不仅需要处理 API 请求&#xff0c;还可能需要处理静态资源&#xff08;如 HTML、CSS、JS 文件&#xff09;或其他服务&#xff08;如 WebSocket&#x…...

Mac:Ant 下载+安装+环境配置(详细讲解)

&#x1f4cc; 下载 Ant 下载地址&#xff1a;https://ant.apache.org/bindownload.cgi &#x1f4cc; 无需安装 Apache官网下载 Ant 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目录下新建了个…...

web客户端存储,IndexDB相关讲解

IndexDB详细讲解 IndexedDB 是浏览器提供的一种底层 API,用于在客户端存储大量结构化数据。相比 Web Storage(localStorage/sessionStorage),它支持更复杂的数据结构、事务处理、索引查询等高级功能。以下是一个系统化的讲解: 一、核心概念 1、​数据库(Database)​ 每…...

使用DeepSeek翻译英文科技论文,以MarkDown格式输出,使用Writage 3.3.1插件转换为Word文件

一、使用DeepSeek翻译英文科技论文&#xff0c;以MarkDown格式输出 以科技论文“Electrical Power System Sizing within the Numerical Propulsion System Simulation”为例。 需要Writage 3.3.1 license key注册码的小伙伴&#xff0c;可发送邮件至邮箱pyengine163.com. 首先…...

Linux 文件操作-文件IO函数2- write向文件写入数据、read从文件读取数据、lseek重定位文件描述符的偏移量的验证

目录 1.write 向文件描述符中写入数据 1.1 向标准输出STDOUT_FILENO (终端屏幕)写入数据 1.2 向文件写入数据 2.read 从文件描述符中读取数据 2.1从标准输入STDIN_FILENO&#xff08;键盘&#xff09;读取数据 2.2从文件读取数据 3.lseek重定位偏移量 1.write 向文件描述…...

`chromadb` 是什么

chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…...

Python 爬虫(4)HTTP协议

文章目录 一、HTTP协议1、HTTP特点2、HTTP工作原理3、HTTP与HTTPS的区别 前言&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;用于在客户端和服务器之间传输超文本&#xf…...

Redis 事件机制详解

Redis 事件机制详解 Redis 的事件机制是其高性能和高并发能力的关键之一&#xff0c;它采用Reactor 模型&#xff0c;基于文件事件驱动机制实现高效的 I/O 处理。Redis 的事件机制主要分为以下几类&#xff1a; 文件事件&#xff08;File Event&#xff09; —— 处理网络 I/…...

JMeter对API接口进行压力测试使用教程

1.启动工具&#xff1a;以管理员身份运行 启动成功会有两个窗口&#xff0c;都保留别关闭 2.创建线程组 3.创建http请求 配置 4.添加监听&#xff0c;查看请求结果 5.运行 成功截图 6.接口压力测试&#xff0c;修改线程组参数 7.2000请求&#xff0c;2秒完成...

Vue 3 项目实现国际化指南 i18n

引言 在开发现代 Web 应用时&#xff0c;国际化&#xff08;Internationalization&#xff0c;简称 i18n&#xff09;已经成为一个不可或缺的功能。无论是面向全球用户的商业网站&#xff0c;还是需要支持多语言的企业应用&#xff0c;良好的国际化支持都能显著提升用户体验。本…...

使用Trae 生成的React版的贪吃蛇

使用Trae 生成的React版的贪吃蛇 首先你想用这个贪吃蛇&#xff0c;你需要先安装Trae Trae 官方地址 他有两种模式 chat builder 我使用的是builder模式,虽然是Alpha.还是可以用。 接下来就是按着需求傻瓜式的操作生成代码 他生成的代码不完全正确&#xff0c;比如没有引入…...

HAL库定时器配置

定时器的开启需要手动开启&#xff0c;例如在driver_capature.c开启&#xff0c;该文件主要写了具体的函数实现&#xff0c;与driver_can.c一样&#xff0c;同时还有回调函数等一些高级的自定义函数。 这段代码是 STM32 HAL 库中用于初始化 定时器 2 (TIM2) 的函数 MX_TIM2_In…...

快速部署Linux + Ollama + AnythingLLM + Deepseek

简介 部署的系统&#xff1a;Ubuntu20.04 这里选择AnythingLLM的原因&#xff0c;是因为它自身支持了知识库的功能&#xff0c;其他的还有chatbox、dify等可以选择。 部署流程&#xff08;请务必使用魔法&#xff09; 一、Ollama安装 1、访问ollama官网&#xff1a;https:/…...

人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)

最近终于把毕业大论文忙完了&#xff0c;众所周知硕士大论文需要有三个工作点&#xff0c;表情识别领域的第三个工作点一般是做一个表情识别系统出来&#xff0c;如下图所示。 这里分享一下这个表情识别系统&#xff1a; 采用 深度学习OpenCVPyQt5 构建&#xff0c;主要功能包…...

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器&#xff0c;需要解析mp3文件&#xff0c;于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…...

LiteratureReading:[2023] GPT-4: Technical Report

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…...

Elasticsearch8.17 生产集群使用优化

一、通用优化建议 避免返回大量文档结果集 Elasticsearch 作为搜索引擎,擅长返回与查询匹配的顶级文档。对于需要检索所有匹配文档的数据库类型操作,建议使用 滚动 API(Scroll API) 或 **搜索后游标(Search After Cursor)**,以避免内存和性能问题。 避免大型文档 默…...

Linux系统管理与编程09:任务驱动综合应用

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09; [步骤] 5 …...

C++:背包问题习题

1. 货币系统 1371. 货币系统 - AcWing题库 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每种货币使用的次数不限。 不同种类的货币&#xff0c;面值可能是相同的。 现在&#xff0c;要你用这 V 种货币凑出 N 元钱&#xff0c;请问共有多少种不同的…...

Flutter中常用命令

1.检测flutter运行环境 flutter doctor 2.升级flutter flutter upgrade 3.查看flutter 版本 flutter --version 4.查看连接的设备 flutter devices 5.运行flutter项目 flutter run 或者在vscode中按FnF5 6.打包 flutter build apk //默认打release包 7.开…...

数学爱好者写的编程系列文章

作为一个数学爱好者&#xff0c;我大学读的专业却不是数学专业&#xff0c;而是跟计算机有关的专业。原本我对编程一窍不通&#xff0c;平时上课也是在看数学文献&#xff0c;作业基本靠同学&#xff0c;考试及格就行。不过后来因为毕业的压力&#xff0c;我还是拥抱编程了&…...

QT笔记---JSON

QT笔记---JSON JSON1、JSON基本概念1.1、判断.json文件工具 2、生成.json数据3、解析.json数据 JSON 在现代软件开发中&#xff0c;数据的交换和存储格式至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁易…...

C站算法技能题-题解(javascript)

切面条 const 切面条 (n10)>{return 2 ** n 1; } 切面条(0) 2 切面条(1) 3 切面条(2) 5 切面条(10) 1025大衍数列 const 大衍数列 (n100) > {let ans []for(let i1;i<n;i){if(i%2 0){ans.push((i ** 2 ) / 2)}else{ans.push((i ** 2 - 1) / 2)}}return ans…...

专利信息管理知识产权基于Spring Boot SSM

目录 一、需求分析 1.1系统用户角色与权限 1.2 专利信息管理功能 二、数据分析与报表生成 三、系统性能与安全性 四 用户体验与界面设计 五 扩展性与可维护性 六、法律法规与合规性 七. 技术选型与实现 ‌7.1技术选型‌&#xff1a; ‌7.2实现方式‌&#xff1a; 随…...

掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...