Javascript高级程序设计(第四版)--学习记录之集合引用类型(上)

Object

显示的创建Object的实例方法:

  • new操作符和Object构造函数
let person = new Object();
person.name = 'Jason';
person.age = 42
  • 对象字面量
let person = {
name:'Jason',
age:42}

存取属性的方法一般有两种:点语法和中括号

let person = {
name:'Jason',
age:42};
console.log(person.name);
console.log(person['name']);

从功能上讲两种存取属性的方法没有区别,使用中括号的主要优势就是可以通过变量访问属性。

let propertyName = "name"; 
console.log(person[propertyName]); // "Jason"

Array

创建数组的方法:

  • Array构造函数创建

let colors = new Array();

  • 数组字面量表示法

let colors = ['red','blue','pink']

  • Array.from(),第一个参数是一个类数组对象,即任何可迭代的结构,或者有一个length属性和可索引元素的结构。
console.log(Array.from("Matt")); // ["M", "a", "t", "t"] 
// 可以使用 from()将集合和映射转换为一个新数组
const m = new Map().set(1, 2) 
 .set(3, 4); 
const s = new Set().add(1) 
 .add(2) 
 .add(3) 
 .add(4); 
console.log(Array.from(m)); // [[1, 2], [3, 4]] 
console.log(Array.from(s)); // [1, 2, 3, 4] 
// Array.from()对现有数组执行浅复制
const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1); 
console.log(a1); // [1, 2, 3, 4] 
alert(a1 === a2); // false
// 可以使用任何可迭代对象
const iter = { 
 *[Symbol.iterator]() { 
 yield 1; 
 yield 2; 
 yield 3; 
 yield 4; 
 } 
}; 
console.log(Array.from(iter)); // [1, 2, 3, 4]

// arguments 对象可以被轻松地转换为数组
function getArgsArray() { 
 return Array.from(arguments); 
} 
console.log(getArgsArray(1, 2, 3, 4)); // [1, 2, 3, 4] 
// from()也能转换带有必要属性的自定义对象
const arrayLikeObject = { 
 0: 1, 
 1: 2, 
 2: 3, 
 3: 4, 
 length: 4 
}; 
console.log(Array.from(arrayLikeObject)); // [1, 2, 3, 4]
Array.from()还接收第二个可选的映射函数参数。这个函数可以直接增强新数组的值,而无须像调用 Array.from().map()那样先创建一个中间数组。还可以接收第三个可选参数,用于指定映射函数中 this 的值。但这个重写的 this 值在箭头函数中不适用。
const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1, x => x**2); 
const a3 = Array.from(a1, function(x) {return x**this.exponent}, {exponent: 2}); 
console.log(a2); // [1, 4, 9, 16] 
console.log(a3); // [1, 4, 9, 16]
  • Array.of()可以把一组参数转换为数组

检索数组内容的方法:

  • keys(),返回数组索引的迭代器
  • values(),返回数组元素的迭代器
  • entries(),返回索引/值对的迭代器
const a = ["foo", "bar", "baz", "qux"]; 
// 因为这些方法都返回迭代器,所以可以将它们的内容
// 通过 Array.from()直接转换为数组实例
const aKeys = Array.from(a.keys()); 
const aValues = Array.from(a.values()); 
const aEntries = Array.from(a.entries()); 
console.log(aKeys); // [0, 1, 2, 3] 
console.log(aValues); // ["foo", "bar", "baz", "qux"] 
console.log(aEntries); // [[0, "foo"], [1, "bar"], [2, "baz"], [3, "qux"]]

复制和填充方法:

批量复制方法copyWithin(),会按照指定范围浅复制数组中的部分内容,然后将它们插入到指

定索引开始的位置。

填充数组方法fill(),可以向一个已有的数组中插入全部或部分相同的值。开始索引用于指定开始填充的位置,它是可选的。如果不提供结束索引,则一直填充到数组末尾。负值索引从数组末尾开始计算。

const zeroes = [0, 0, 0, 0, 0]; 
// 用 5 填充整个数组
zeroes.fill(5); 
console.log(zeroes); // [5, 5, 5, 5, 5] 
zeroes.fill(0); // 重置
// 用 6 填充索引大于等于 3 的元素
zeroes.fill(6, 3); 
console.log(zeroes); // [0, 0, 0, 6, 6] 
zeroes.fill(0); // 重置
// 用 7 填充索引大于等于 1 且小于 3 的元素
zeroes.fill(7, 1, 3); 
console.log(zeroes); // [0, 7, 7, 0, 0]; 
zeroes.fill(0); // 重置
// 用 8 填充索引大于等于 1 且小于 4 的元素
// (-4 + zeroes.length = 1) 
// (-1 + zeroes.length = 4) 
zeroes.fill(8, -4, -1); 
console.log(zeroes); // [0, 8, 8, 8, 0]; 
fill()静默忽略超出数组边界、零长度及方向相反的索引范围:
const zeroes = [0, 0, 0, 0, 0]; 
// 索引过低,忽略
zeroes.fill(1, -10, -6); 
console.log(zeroes); // [0, 0, 0, 0, 0] 
// 索引过高,忽略
zeroes.fill(1, 10, 15); 
console.log(zeroes); // [0, 0, 0, 0, 0] 
// 索引反向,忽略
zeroes.fill(2, 4, 2); 
console.log(zeroes); // [0, 0, 0, 0, 0] 
// 索引部分可用,填充可用部分
zeroes.fill(4, 3, 10) 
console.log(zeroes); // [0, 0, 0, 4, 4]

栈方法

  • push(),接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度.
  • pop(),用于删除数组的最后一项,同时减少数组的 length 值,返回被删除的项.
    let colors = [];
    let count = colors.push('red','green')
    console.log(count);//2
    let item = colors.pop()
    console.log(item);//green

队列方法

  • shift(),删除数组的第一项并返回它,然后数组长度减 1
let colors = [];
let count = colors.push('red','blue');
let item = colors.shift();
console.log(item);//red
  • unshift(),在数组开头添加任意多个值,然后返回新的数组长度
let colors = [];
let count = colors.unshift('red','blue');
let item = colors.pop();
console.log(item);//blue

排序方法

  • reverse(),是将数组元素反向排列。
let values = [1, 2, 3, 4, 5]; 
values.reverse(); 
alert(values); // 5,4,3,2,1
  • sort(),按照升序重新排列数组元素。sort()会在每一项上调用 String()转型函数,然后比较字符串来决定顺序。即使数组的元素都是数值,也会先把数组转换为字符串再比较、排序。
let values = [0, 1, 5, 10, 15]; 
values.sort(); 
alert(values); // 0,1,10,15,5

sort()方法可以接收一个比较函数,用于判断哪个值应该排在前面。

let values = [0, 1, 5, 10, 15]; 
values.sort((a, b) => a < b ? 1 : a > b ? -1 : 0); 
alert(values); // 15,10,5,1,0

操作 方法

  • concat()方法可以在现有数组全部元素基础上创建一个新数组。它首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组。如果传入一个或多个数组,则 concat()会把这些数组的每一项都添加到结果数组。如果参数不是数组,则直接把它们添加到结果数组末尾。
    打平数组参数的行为可以重写,方法是在参数数组上指定一个特殊的符号: Symbol.isConcat-Spreadable。这个符号能够阻止 concat() 打平参数数组。相反,把这个值设置为 true 可以强制打平类数组对象:
    let colors = ["red", "green", "blue"]; 
    let newColors = ["black", "brown"]; 
    let moreNewColors = { 
     [Symbol.isConcatSpreadable]: true, 
     length: 2, 
     0: "pink", 
     1: "cyan" 
    }; 
    newColors[Symbol.isConcatSpreadable] = false; 
    // 强制不打平数组
    let colors2 = colors.concat("yellow", newColors); 
    // 强制打平类数组对象
    let colors3 = colors.concat(moreNewColors); 
    console.log(colors); // ["red", "green", "blue"] 
    console.log(colors2); // ["red", "green", "blue", "yellow", ["black", "brown"]] 
    console.log(colors3); // ["red", "green", "blue", "pink", "cyan"]

    • slice() 用于创建一个包含原有数组中一个或多个元素的新数组。 slice() 方法可以
      接收一个或两个参数:返回元素的开始索引和结束索引。如果只有一个参数,则 slice() 会返回该索引到数组末尾的所有元素。如果有两个参数,则 slice() 返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。
    let colors = ["red", "green", "blue", "yellow", "purple"]; 
    let colors2 = colors.slice(1); 
    let colors3 = colors.slice(1, 4); 
    alert(colors2); // green,blue,yellow,purple 
    alert(colors3); // green,blue,yellow
    
    /*如果 slice()的参数有负值,那么就以数值长度加上这个负值的结果确定位置。比
    如,在包含 5 个元素的数组上调用 slice(-2,-1),就相当于调用 slice(3,4)。如果结
    束位置小于开始位置,则返回空数组。*/
    • splice(),主要目的是在数组中间插入元素,有3种不同的方式使用这个方法。
      • 删除。需要给splice()传2个参数:要删除的第一个元素的位置和要删除的元素数量。
      • 插入。需要给splice()传3个参数:开始位置、0和要插入的元素,可以在数组中指定的位置插入元素。
      • 替换。splice()在删除元素的同时可以在指定位置插入新元素,同样要传入3个参数:开始位置、要删除元素的数量和要插入的任意多个元素。
    let colors = ["red", "green", "blue"]; 
    let removed = colors.splice(0,1); // 删除第一项
    alert(colors); // green,blue 
    alert(removed); // red,只有一个元素的数组
    removed = colors.splice(1, 0, "yellow", "orange"); // 在位置 1 插入两个元素
    alert(colors); // green,yellow,orange,blue 
    alert(removed); // 空数组
    removed = colors.splice(1, 1, "red", "purple"); // 插入两个值,删除一个元素
    alert(colors); // green,red,purple,orange,blue 
    alert(removed); // yellow,只有一个元素的数组

    搜索和位置方法

    • 严格相等
      • indexOf(),从数组前头开始向后搜索,返回要查找的元素在数组中的位置,如果没找到返回-1.
      • lastIndexOf(),从数组末尾开始向前搜索,返回要查找的元素在数组中的位置,如果没找到返回-1.
      • includes(),从数组前头开始向后搜索,返回布尔值,表示是否至少找到一个于指定元素匹配的项。

            都接收两个参数:要查找的元素和一个可选的起始搜索位置。

    let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
    alert(numbers.indexOf(4)); // 3 
    alert(numbers.lastIndexOf(4)); // 5 
    alert(numbers.includes(4)); // true 
    alert(numbers.indexOf(4, 4)); // 5 
    alert(numbers.lastIndexOf(4, 4)); // 3 
    alert(numbers.includes(4, 7)); // false 
    let person = { name: "Nicholas" }; 
    let people = [{ name: "Nicholas" }]; 
    let morePeople = [person]; 
    alert(people.indexOf(person)); // -1 
    alert(morePeople.indexOf(person)); // 0 
    alert(people.includes(person)); // false 
    alert(morePeople.includes(person)); // true
    • 断言函数接收3个参数:元素、索引和数组本身。
      • find(),从数组最小的索引开始,返回第一个匹配的元素,找到一个后不在继续搜索
      • findIndex(),从数组最小的索引开始,返回第一个匹配元素的索引,找到一个后不在继续搜索
    const people = [ 
     { 
     name: "Matt", 
     age: 27 
     }, 
     { 
     name: "Nicholas", 
     age: 29 
     } 
    ]; 
    alert(people.find((element, index, array) => element.age < 28)); 
    // {name: "Matt", age: 27} 
    alert(people.findIndex((element, index, array) => element.age < 28)); 
    // 0

    迭代方法

    • every() :对数组每一项都运行传入的函数,如果对每一项函数都返回 true ,则这个方法返回 true
    • forEach() :对数组每一项都运行传入的函数,没有返回值。
    • some() :对数组每一项都运行传入的函数,如果有一项函数返回 true ,则这个方法返回 true
    • map() :对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。
    • filter() :对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后回。
      let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
      let everyResult = numbers.every((item, index, array) => item > 2); 
      alert(everyResult); // false 
      let someResult = numbers.some((item, index, array) => item > 2); 
      alert(someResult); // true
      ------------------
      let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
      let filterResult = numbers.filter((item, index, array) => item > 2); 
      alert(filterResult); // 3,4,5,4,3
      
      ------------------
      let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
      let mapResult = numbers.map((item, index, array) => item * 2); 
      alert(mapResult); // 2,4,6,8,10,8,6,4,2
      -------------------
      let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; 
      numbers.forEach((item, index, array) => { 
       // 执行某些操作 
      });

      归并方法

      • reduce(),从第一项开始遍历到末尾
      • reduceRight(),从最后一项开始遍历到开头
      这两个方法都接收两个参数:对每一项都会运行的归并函数,以及可选的以之为归并起点的初始值。 传给 reduce() reduceRight() 的函数接收 4 个参数:上一个归并值、当前项、当前项的索引和数组本身。
      let values = [1, 2, 3, 4, 5]; 
      let sum = values.reduce((prev, cur, index, array) => prev + cur); 
      alert(sum); // 15
      
      let sum1 = values.reduceRight(function(prev, cur, index, array){ 
       return prev + cur; 
      }); 
      alert(sum1); // 15

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高考志愿填报:选择好专业还是好学校?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 高考志愿填报&#xff1a;选择好专业还是好学校&#xff1f; 每年高考结束后&#xff0c;考生和家长面临的一个…

网络设备框架

文章目录 前言一、主要流程二、Linux网络设备驱动架构1.概述2.读入数据 总结 前言 Linux中的Ethernet驱动框架涉及到网络设备驱动程序的多个方面&#xff0c;包括初始化、注册、数据传输以及与物理层&#xff08;PHY&#xff09;的交互。以下是网络设备驱动架构的概述&#xf…

Spring Boot配置Springdoc

刚刚开通了一个公众号&#xff0c;会分享一些技术博客和自己觉得比较好的项目&#xff0c;同时会更新一些自己使用的工具和图书资料&#xff0c;后面会整理一些面试资料进行分享&#xff0c;觉得有兴趣的可以关注一下。 问题描述 之前文章有提到Spring Boot切换到Springdoc&a…

LeetCode刷题之HOT100之乘积最大子数组

2024/6/25 六月也来到了末尾&#xff0c;刷题也刷了一个半月左右。收获还是有的&#xff0c;最起码打字快了哈哈&#xff0c;做题啦&#xff01; 1、题目描述 2、逻辑分析 一眼动态规划。 解题思路 遍历数组时计算当前最大值&#xff0c;不断更新令nowMax 为当前最大值&…

【azure openaiai翻译】翻译功能测试及对比(定价,响应速度,响应限制,翻译质量)

最近在测试翻译质量&#xff0c;用到了azure ai service里的文本翻译&#xff08;简称ai翻译&#xff09;和azure openai 。 告一段落&#xff0c;辅以笔记。这两种将分别从定价&#xff0c;响应速度&#xff0c;响应限制&#xff0c;翻译质量进行讲解。 1.azure openai 对于内…

EthernetIP IO从站设备数据 转opc ua项目案例

1 案例说明 设置网关采集EthernetIP IO设备数据把采集的数据转成opc ua协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0c;是把一种协议转换成另外一种协议。网关可以采集西门子&#xff0c;欧姆龙&#xff0c;三菱&#xff0c;AB PLC&#xff0…

2005年下半年软件设计师【上午题】试题及答案

文章目录 2005年下半年软件设计师上午题--试题2005年下半年软件设计师上午题--答案 2005年下半年软件设计师上午题–试题 2005年下半年软件设计师上午题–答案

ModbusRTU协议报文解析

ModbusRTU协议报文解析 报文格式&#xff1a; 设备地址/从站地址&#xff1a; 1个字节 指定目标设备地址&#xff08;从站地址&#xff09; 功能码&#xff1a;1个字节 功能码在modbus协议用于表示信息帧的功能&#xff0c;例如读取线圈状态、读取寄存器等。 数据&#xff…

C语言数据结构-分析期末选择题考点(一)

昔我往矣&#xff0c;杨柳依依 今我来思&#xff0c;雨雪霏霏 契子✨ 有道是&#xff1a;得选择题者得天下。临近考试&#xff0c;便总结一下数据结构选择题的常考题型吧&#xff0c;以及预测一下考点&#xff0c;一来是为了备考&#xff0c;二来可以水文。祝各位老铁 “挂柯南…

韩顺平0基础学java——第30天

p600-611 坦克大战&#xff01; 艰难推进中 坦克大战-子弹 发射子弹 1.当发射一颗子弹后&#xff0c;就相当于启动一个线程 2.玩家拥有子弹对象&#xff0c;当按下J时&#xff0c;就启动发射行为&#xff08;线程&#xff09;&#xff0c;让子弹不停移动&#xff0c;形成…

(上位机APP开发)调用华为云命令API接口给设备下发命令

一、功能说明 通过调用华为云IOT提供的命令下发API接口,实现下面界面上相同的功能。调用API接口给设备下发命令。 二、JavaScript代码 function sendUnlockCommand() {var requestUrl = "https://9bcf4cfd30.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/60…

全国首场以AI数字内容风控为主题的大会正式官宣,首批演讲嘉宾和议题揭晓!

曾经我们感叹的“AI迎来了iPhone时刻”&#xff0c;如今已变成“iPhone迎来了AI时刻”。前段时间&#xff0c;苹果全球开发者大会的召开&#xff0c;以及闻声而起的资本市场&#xff0c;无一不再次佐证了AI的无穷想象。 从OpenAI直播演示GPT-4o和谷歌的I/O开发者大会2024&…

空调制冷剂泄漏引发健康隐患,冷媒传感器实时监测至关重要

随着夏季的脚步逐渐临近&#xff0c;气温逐渐攀升&#xff0c;空调成为了许多家庭和企业必不可少的降温设备。然而&#xff0c;近年来多起因空调制冷剂泄漏导致的健康问题和安全事故&#xff0c;让人们开始重新审视空调使用安全的重要性。其中&#xff0c;冷媒传感器的实时监测…

智能AI在线人工智能对话源码系统 完整的代安装码+搭建部署教程

系统概述 智能 AI 在线人工智能对话源码系统是一款前沿的技术解决方案&#xff0c;它融合了人工智能的强大能力&#xff0c;为用户提供了一个高效、智能的对话平台。该系统基于先进的算法和模型&#xff0c;能够理解用户的输入&#xff0c;并以高度准确和自然的方式进行回应。…

深度测试中的隐藏面消除技术

by STANCH 标签&#xff1a;#计算机图形学 #深度测试 #深度测试 #隐藏面消除 1.概述 根据我们的日常经验&#xff0c;近处的物体会挡住后面的物体&#xff0c;在三维场景中通常通过深度缓冲来实现这样的效果。深度缓冲记录着屏幕对应的每个像素的深度值。模型一开始所在的局部…

计算机工具软件安装攻略:Chrome浏览器下载安装及使用

1 Chrome简介 Chrome是谷歌公司开发的一款免费网页浏览器它快速、稳定、安全拥有简洁流畅的界面和丰富的应用程序内置了强大的谷歌搜索引擎。Chrome使用Blink浏览器引擎和V8 JavaScript引擎支持多种插件和扩展程序让浏览网页更便捷。它可以与Android手机良好同步支持跨设备浏览…

AI降重技术:论文查重率的智能解决方案

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

中霖教育怎么样?中霖教育好吗?

中霖教育怎么样?中霖教育好吗? 中霖教育包括师资力量、课程设置、教学方法等都是经过不断完善来制定的&#xff0c;我们拥有专业且经验丰富的师资队伍&#xff0c;在教学过程中更注重个性化教学方式&#xff0c;针对每个学员的需求和学习情况制定专属的学习计划。 无论是在…

养殖自动化管理系统:开启智慧养殖新篇章

在现代农业的快速演进中&#xff0c;养殖业正经历一场前所未有的技术革命。养殖自动化管理系统&#xff0c;作为这场变革的前沿科技&#xff0c;正逐步成为推动行业高效、环保、可持续发展的关键力量。本文将深入探讨自动化养殖系统如何通过精准管理、智能监控、数据驱动决策&a…

无线领夹麦克风哪个牌子好,一篇教你无线领夹麦克风怎么挑选!

对于领夹麦克风这一术语&#xff0c;可能在非专业人士听来颇为生僻&#xff0c;然而在互联网行业工作者和短视频博主中&#xff0c;它却是一个常见的必备工具。如果你正计划成为一名短视频创作者&#xff0c;或者即将涉足视频拍摄与直播等互动媒体活动&#xff0c;那么熟悉并掌…