JavaScript 学习笔记 对象属性 symbol 数组常用方法

JavaScript 学习笔记

目录

文章目录

  • JavaScript 学习笔记
    • 目录
    • 参考教程
    • 对象
      • 遍历对象元素保留原来顺序
      • 判断是否是空对象
      • 对象浅拷贝
      • 对象深拷贝
      • 对象的方法不能这样写成箭头函数,否则找不到title
      • 对象的方法这样写,才能找到title
      • 可选链
    • symbol 类型
    • 字符串
      • 字符串的查找 includes
      • 字符串截取 slice
      • 字符串截取 substring
    • 数组
      • 判断是否是数组 Array.isArray(list)
      • 从后取元素方法 at,老系统需要polyfills
      • 添加与删除数据 pop/push, shift/unshift
      • 添充元素 fill
      • 循坏之查找 find / findIndex(indexOf) / findLastIndex / findLast
      • 循坏之操作数组 [forEach](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
      • 循坏之返回指定字段 map
        • 1. 去除不必要的字段,仅保留数据中需要的字段
        • 2. 将某些字段进行一些操作后返回
        • 3. 将某些字段进行一些操作后返回
        • 4. 将某字段(title)值生成一个新的数组
        • 5. 返回某字段满足需求的 boolean值
      • 循坏之返回满足需要的数组 [filter](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
        • 1. 返回某字段满足需求的所有数据
      • 循坏之 some
      • 循坏之 every
      • 循坏之归并 reduce
      • 操作数组的瑞士军刀: splice,删除、插入、改写
    • 正则

参考教程

javascript
developer.mozilla

对象

遍历对象元素保留原来顺序

用非数字作为key,就不会把“1” 排在最前面了

let codes = {"+49": "Germany","+41": "Switzerland","+44": "Great Britain",// ..,"+1": "USA"
};for (let code in codes) {alert( +code ); // 49, 41, 44, 1
}

判断是否是空对象

方法1const isEmpty = (obj) => {for (let key in obj) {return false}return true
}
方法2const isEmpty = (obj) => JSON.stringify(obj) === '{}'
方法3const isEmpty = (obj) => Object.keys(obj).length === 0

对象浅拷贝

即,当对象属性为基本类型时,可以用如下方法进行对象拷贝;一旦含有引用类型属性时,下面的方法将失效。

const obj = {"type": "1","title": "Criss","phone": "+86-10-84556681",
}
const obj2={}
Object.assign(obj2, obj)
或缩写
let clone = Object.assign({}, obj);

对象深拷贝

let clone =JSON.parse(JSON.stringify(obj))

不会拷贝: function、属性值为undefined、
属性值变为null: 属性值为-Infinity、属性值为Infinity、属性值为NaN

使用 lodash 库的 _.cloneDeep(obj)。

对象的方法不能这样写成箭头函数,否则找不到title

const obj = {"title": "Criss",fun:()=>{ console.log(this.title)}
}

对象的方法这样写,才能找到title

const obj = {"title": "Criss",fun(){ console.log(this.title)}
}

可选链

user.address && user.address.street && user.address.street.name
user.address?.street?.name

?对其前面的属性进行可选性校验,第一级写了不起作用,所以不用写

obj.method?.() obj下有方法method才执行
vue 举例

title() {return this.list?.[0]?.['title'];
},

symbol 类型

  1. 唯一性
const { log } = console
const user = {id:1,
}
let id = Symbol("id");
let id2 = Symbol("id");
user[id]=2
user['id']=3
user[id2]=4
log(user)// { id: 3, [Symbol(id)]: 2, [Symbol(id)]: 4 }
  1. symbol 属性在 for…in 循环内不输出。
let id = Symbol("id");
let user = {[id]: 123,name:'1111'
};
for (let key in user) { log(key)
}
// name ,忽略了symbol
  1. Object.keys(user) 也会忽略symbol
let id = Symbol("id");
let user = {[id]: 123,name:'1111'
};
let clone=Object.keys(user)
log( clone ); // [ 'name' ],忽略了symbol
  1. 相反,Object.assign({}, user)可以克隆
const { log } = console
let id = Symbol("id");
let user = {[id]: 123
};
let clone = Object.assign({}, user);
log( clone ); // { [Symbol(id)]: 123 },symbol依然存在
  1. symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 symbol 相等,那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话则创建)一个以 key 作为名字的全局 symbol。使用 Symbol.for 多次调用 key 相同的 symbol 时,返回的就是同一个 symbol
let id = Symbol.for("id");
let id1 = Symbol.for("id");
let user = {[id]: 123,[id1]: 234,name:'1111'
};
log(user)// { name: '1111', [Symbol(id)]: 234 } 只有一个symbol

字符串

字符串的查找 includes

注意:
1. 找字符串的时候区分大小写
2. 返回值为true / false

const { log } = console
// 在字符串内查找
const str = 'hello world'
log(str.includes('hello'))
// 在数组内查找
const arr1 = ['hello world']
log(arr1.includes('hello'))
// 在数组对象内查找
const arr = [{name:'hello'},{name:'world'},
]let flag = arr.some(item => item.name.includes('hello') )
log(flag)

字符串截取 slice

slice(indexStart)
slice(indexStart, indexEnd)

字符串截取 substring

substring(indexStart)
substring(indexStart, indexEnd)

数组

判断是否是数组 Array.isArray(list)

从后取元素方法 at,老系统需要polyfills

let fruits = ["Apple", "Orange", "Plum"];
log( fruits.at(-1) );// 取最后一个元素
fruits.at(0)与fruits[0]一样效果,负数的时候从后向前取

添加与删除数据 pop/push, shift/unshift

注意:
1. push/pop 方法运行的比较快,而 shift/unshift 比较慢。

后入 / 后出  push / pop
前入 / 前出  unshift  / shift

添充元素 fill

// 实用案例:拿到后台返回数据后,前端需要控制某条数据被选中
let list = [{title: '111',},{title: '222',},{title: '333',},
]
let flag = new Array(list.length).fill(false)
log(flag)

循坏之查找 find / findIndex(indexOf) / findLastIndex / findLast

// find 找出满足需求的元素
const list = [{title: '111',},{title: '222',},{title: '333',},
]
const flag = list.find(item => item.title === '222')
log(flag) //  { title: '222' }

循坏之操作数组 forEach

  1. forEach() 方法是一个迭代方法。它按索引升序地为数组中的每个元素调用一次提供的 callbackFn 函数(同for循环)。
  2. 与 map() 不同,forEach() 总是返回 undefined,而且不能继续链式调用。
  3. 其典型的用法是在链式调用的末尾执行某些操作。
  4. 除非抛出异常,否则没有办法停止或中断 forEach() 循环,有类似需求请使用for循环。
  5. forEach() 期望的是一个同步函数,它不会等待 Promise 兑现。

循坏之返回指定字段 map

1. 去除不必要的字段,仅保留数据中需要的字段
const list = [{title: '111',},{title: '222',age:18},{title: '333',},{title: '222',age:20},
]
const arr = list.map(item =>{return {title:item.title}
} )
log(arr)
/* [{ title: '111' },{ title: '222' },{ title: '333' },{ title: '222' }
]
*/
2. 将某些字段进行一些操作后返回
const arr = list.map(item =>{return {title:'标题 '+item.title}
})
3. 将某些字段进行一些操作后返回
const arr = list.map(item =>{return {...item,title:'标题 '+item.title}
})
4. 将某字段(title)值生成一个新的数组
const arr = list.map(item => item.title)//[ '111', '222', '333', '222' ]
5. 返回某字段满足需求的 boolean值
const arr = list.map(item => item.age>18) // [ false, false, false, true ]

循坏之返回满足需要的数组 filter

1. 返回某字段满足需求的所有数据
// 返回age<20的数据
const isYoung = item => item.age<20
const arr = list.filter(isYoung) // [ { title: '222', age: 20 } ]

循坏之 some

循坏之 every

循坏之归并 reduce

操作数组的瑞士军刀: splice,删除、插入、改写

正则

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

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

相关文章

【三维目标检测】【自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…

浅谈测试自动化selenium之POM模式

基于本人也是一个初学者&#xff0c;在运用POM模式的时候记录一下自己的学习笔记。 如果你是大神&#xff0c;那么可以略过&#xff0c;如果你是初学者&#xff0c;希望对你有帮助。 本文阐述了以下几个问题&#xff1a; 什么叫POM模式 为什么要用POM模式 POM模式的思想 POM模…

【http】HTTP/1.0、HTTP/1.1和HTTP/2.0

✨ 专栏介绍 在当今互联网时代&#xff0c;计算机网络已经成为了人们生活和工作中不可或缺的一部分。而要实现计算机之间的通信和数据传输&#xff0c;就需要依靠各种网络协议来进行规范和约束。无论是浏览网页、发送电子邮件还是进行在线交流&#xff0c;都离不开各种各样的网…

CCI2023 | 人工智能赋能介入医学

在岁末的时光里&#xff0c;医学创新的光芒在南京绽放&#xff0c;“2023中国医师协会介入医师年会&#xff08;CCI2023&#xff09;”于12月21-24日在江苏省南京市国际青年会议中心举行&#xff0c;本次大会汇聚了国内外医学领域的专家学者&#xff0c;为探讨介入医学领域的最…

Kubernetes(k8s)部署DolphinScheduler

1.环境准备 1.1 集群规划 本次安装环境为&#xff1a;3台k8s现有的mysql数据库nfs 1.2 下载及介绍 DolphinScheduler-3.2.0官网&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.0 官网安装文档&#xff1a;https://dolphinscheduler.apache.org/zh-cn…

CDN 原理

CDN 原理 CND 一般包含分发服务系统、负载均衡系统和管理系统 分发服务系统 其基本的工作单元就是各个 Cache 服务器。负责直接响应用户请求&#xff0c;将内容快速分发到用户&#xff1b;同时还负责内容更新&#xff0c;保证和源站内容的同步。 根据内容类型和服务种类的不…

CSS中浮动float带来的高度塌陷问题及4种解决方案

一&#xff1a;高度塌陷问题 在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;也就是子元素多高&#xff0c;父元素就多高。但是当为子元素设置浮动以后&#xff0c;子元素会完全脱离文档流&#xff0c;此时将会导致子元素无法撑起父元素的高度&#xff0c…

IDEA2023创建web项目

一、新建项目 点击File->New->Project...&#xff0c;如果是第一次创建项目则单击New Project 二、添加Web Application 建好的样子 把web移动到main目录下同时改名为webapp 三、不存在Add Framework Support添加Web Application 如何存在Add Framework Support&#…

中间件系列 - Redis入门到实战(原理篇)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis数据结构Redis网…

长图拼接软件,多张图片拼接合成一张

我们每天都会接触到无数的图片&#xff0c;有些图片或许只是短暂的惊艳&#xff0c;而有些则能深深触动我们的心灵。你是否想过&#xff0c;将那些美丽的瞬间拼接在一起&#xff0c;创造出一个全新的视觉体验&#xff1f;今天&#xff0c;我要为大家介绍一款拼接图片的软件——…

vue+element+springboot实现多张图片上传

1.需求说明 2.实现思路 3.el-upload组件主要属性说明 4.前端传递MultipartFile数组与服务端接收说明 5.完整代码 1.需求说明 动态模块新增添加动态功能,支持多张图片上传.实现过程中对el-upload组件不是很熟悉,踩了很多坑,当然也参考过别的文章,发现处…

低代码选型注意事项

凭借着革命性的生产力优势&#xff0c;低代码技术火爆了整个IT圈。面对纷繁复杂的低代码和无代码产品&#xff0c;开发者该如何选择&#xff1f; 在研究低代码平台的年数上&#xff0c;本人已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;很多企业面临低代码选型上的…

果然,大厂都在卷这个!

大家好&#xff0c;我是鱼皮。首先祝大家平安夜快乐&#xff01;给大家看看我们搞的小圣诞树哈哈&#xff5e; 言归正传&#xff0c;这周中我去北京待了 2 天&#xff0c;主要是收到百度的邀请去参加百度云的智算大会&#xff0c;听说有些 AI 产品要发布。 我自己是非常关注国内…

安装kafka

静态文件安装&#xff08;单机&#xff09; 解压到指定目录&#xff08;解压到 /usr&#xff09; tar -zxf kafka_2.11-2.2.0.tgz -C /usr/ 到指定的解压目录下 cd /usr/kafka_2.11-2.2.0/ 配置主机名 查看是否配置了HOSTNAME vim /etc/sysconfig/network 没有就新增 HOSTNA…

Python模拟动态星空

前言 今天&#xff0c;我们来用Python做个星空。 一、模拟星空 1,.首先导入所需要的库&#xff1a; from turtle import * from random import random, randint 2.初始画面&#xff1a; screen Screen() width, height 800, 600 screen.setup(width, height) screen.tit…

信号与线性系统翻转课堂笔记12——时域取样定理

信号与线性系统翻转课堂笔记12 The Flipped Classroom12 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信号取样的概念&#xff1…

Redis分布式锁进阶源码分析

Redis分布式锁进阶源码分析 1、如何写一个商品秒杀代码&#xff1f;2、加上Java锁3、使用redis setnx命令获取锁4、增加try和finally5、给锁设置过期时间6、增长过期时间&#xff0c;并setnx增加唯一value7、使用redisson8、源码分析a、RedissonLock.tryLockInnerAsyncb、Redis…

插入排序,选择排序,冒泡排序,顺序搜索,二分搜索,迭代,求最大公因数,最小公倍数等简单模板

目录 1.排序 1.插入排序模板 2.冒泡排序模板 3.选择排序模板 2.搜索 1.顺序搜索 2.二分搜索 3.迭代 1.基础迭代 ​编辑 4.求最大公因数&#xff0c;最小公倍数 1.最直接的方法 取巧一点 2.辗转相除法&#xff08;欧几里得法&#xff09; 1.排序 1.插入排序模板 插…

ES慢查询分析——性能提升6 倍

问题 生产环境频繁报警。查询跨度91天的数据&#xff0c;请求耗时已经来到了30s。报警的阈值为5s。 背景 查询关键词简单&#xff0c;为‘北京’ 单次仅检索两个字段 查询时间跨度为91天&#xff0c;覆盖数据为450亿数据 问题分析 使用profle分析&#xff0c;复现监控报警的…

Halo多博客备份,同时备份redis与mysql,将备份文件上传到百度云

代码&#xff1a;https://github.com/loks666/py_tools 写在前面 我的服务器运行了多个halo博客&#xff0c;都在同一个域名下&#xff0c;只是用前缀区分&#xff0c;所以代码中我也是使用前缀区分的&#xff0c;使用了list元祖中包含了多个halo站点信息&#xff0c;记得在代…