Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >重新认识 JavaScript

重新认识 JavaScript

作者头像
Cell
发布于 2022-05-02 02:24:56
发布于 2022-05-02 02:24:56
3700
举报
文章被收录于专栏:Cell的前端专栏Cell的前端专栏

前言

前端框架轮替变化越来越快,JavaScript 也在不断地升级迭代,越来越多的新特性让我们的代码写起来变得简洁有趣。

每隔一段时间就该重新认识一下 JS,这篇文章会介绍 6 种新特性,一起研究一下吧。

数组方法 some, every, find, filter

共同点:这几个方法都不会改变原始数组。

some

some() 方法测试数组中是不是至少有 1 个元素通过了被提供的函数测试,它返回一个布尔值。

数组中有至少一个元素通过回调函数的测试就会返回 true,所有元素都没有通过回调函数的测试返回值才会为 false

1

arr.some(callback(element[, index[, array]])[, thisArg])

1 2

[2, 5, 8, 1, 4].some(x => x > 10); // false [12, 5, 8, 1, 4].some(x => x > 10); // true

提示

some() 不会对空数组进行检测,空数组返回 `false

every

助记:every()some() 功能相反

every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试,它返回一个布尔值。

如果回调函数的每一次返回都为 truthy 值,返回 true ,否则返回 false

1

arr.every(callback(element[, index[, array]])[, thisArg])

1 2

[12, 5, 8, 130, 44].every(x => x >= 10); // false [12, 54, 18, 130, 44].every(x => x >= 10); // true

提示

every() 不会对空数组进行检测,空数组返回 `true

Find

助记:功能和 some() 类似,some() 返回布尔值,find() 返回找到的元素

find() 方法返回数组中满足提供的测试函数的第一个元素的值,否则返回 undefined

1

arr.find(callback[, thisArg])

1 2 3 4 5 6

const array1 = [5, 12, 8, 130, 44]; const found = array1.find(element => element > 10); console.log(found); // expected output: 12

引用

另请参见 findIndex() 方法,它返回数组中找到的元素的索引,而不是其值。

如果你需要找到一个元素的位置或者一个元素是否存在于数组中,使用 Array.prototype.indexOf()Array.prototype.includes()

filter

助记:如字面意思,它是一个筛子,会筛选出满足条件的元素

filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。

返回值是一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。

1

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

1 2 3 4 5 6

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']; const result = words.filter(word => word.length > 6); console.log(result); // expected output: Array ["exuberant", "destruction", "present"]

使用 Object.hasOwn 替代 in 操作符

有时,我们想知道对象上是否存在某个属性,一般会使用 in 操作符或 obj.hasOwnProperty,但它们都有各自的缺陷。

in

如果指定的属性位于对象或其原型链中,in 运算符将返回 true

1 2 3 4 5 6 7 8

const Person = function (age) { this.age = age } Person.prototype.name = 'fatfish' const p1 = new Person(24) console.log('age' in p1) // true console.log('name' in p1) // true 注意这里

obj.hasOwnProperty

hasOwnProperty 方法会返回一个布尔值,表示对象自身属性中是否具有对应的值(原型链上的属性不会读取)。

1 2 3 4 5 6 7 8

const Person = function (age) { this.age = age } Person.prototype.name = 'fatfish' const p1 = new Person(24) console.log(p1.hasOwnProperty('age')) // true console.log(p1.hasOwnProperty('name')) // fasle 注意这里

obj.hasOwnProperty 已经可以过滤掉原型链上的属性,但在某些情况下,它还是不安全。

1 2

Object.create(null).hasOwnProperty('name') // Uncaught TypeError: Object.create(...).hasOwnProperty is not a function

Object.hasOwn

别急,我们可以使用 Object.hasOwn 来避免这两个问题,这比 obj.hasOwnProperty 方法更加方便、安全。

1 2 3 4 5

let object = { age: 24 } Object.hasOwn(object, 'age') // true let object3 = Object.create(null) Object.hasOwn(object3, 'age') // false

使用 “#” 声明私有属性

以前,我们一般用_表示私有属性,但它并不靠谱,还是会被外部修改。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

class Person { constructor (name) { this._money = 1 this.name = name } get money () { return this._money } set money (money) { this._money = money } showMoney () { console.log(this._money) } } const p1 = new Person('fatfish') console.log(p1.money) // 1 console.log(p1._money) // 1 p1._money = 2 // 依旧可以从外部修改_money 属性,所以这种做法并不安全 console.log(p1.money) // 2 console.log(p1._money) // 2

使用#实现真正私有属性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

class Person { #money=1 constructor (name) { this.name = name } get money () { return this.#money } set money (money) { this.#money = money } showMoney () { console.log(this.#money) } } const p1 = new Person('fatfish') console.log(p1.money) // 1 // p1.#money = 2 // 没法从外部直接修改 p1.money = 2 console.log(p1.money) // 2 console.log(p1.#money) // Uncaught SyntaxError: Private field '#money' must be declared in an enclosing class

有用的数字分隔符

可以使用 _ 分隔数字,当然也可以用于计算

1 2 3 4 5 6 7

// ✅ 更加易于阅读 const newSixBillion = 6000_000_000 // ❌ 难以阅读 const originSixBillion = 6000000000 console.log(newSixBillion === originSixBillion) // expected output: true

1 2

const sum = 1000 + 6000_000_000 // expected output: 6000001000

提示

另外,我们写时间时,24*60*60*1000 的可读性也是远大于 86400000 的。

“?.”, “??”, “??=” 的使用

可选链 ?.

以前我们为了简化 if else,通常会写出这样的代码

1 2 3 4 5

const obj = null console.log(obj && obj.name) const $title = document.querySelector('.title') const title = $title ? title.innerText : undefined

使用 ?. 简化 && 和三元运算符

1 2 3 4 5

const obj = null console.log(obj?.name) const $title = document.querySelector('.title') const title = $title?.innerText

空值合并运算符 ??

之前给变量赋默认值时,我们一般会用 || 来写,比如

1 2 3 4 5 6 7

let foo = 1 let bar = foo || 2 console.log(bar) // 1 let foo = 0 let bar = foo || 2 console.log(bar) // 2 注意这里

所以,|| 有时候并不是很安全,所以我们不得不加判断

1 2 3

let foo = 0 let bar = foo !== undefined ? foo : 2 console.log(bar) // 0

现在使用 ?? 可以使代码更加优雅

1 2 3 4 5 6 7

let foo = 1 let bar = foo ?? 2 console.log(bar) // 1 let foo = 0 let bar = foo ?? 2 console.log(bar) // 0

空值赋值运算符 ??=

1 2 3 4 5 6 7

let foo = 0 foo ??= 2 console.log(foo) // 0 let foo = 1 foo ??= 2 console.log(foo) // 1

很好理解,这里的 foo ??= 2 等价于 foo = foo ?? 2

使用 BigInt 支持大数计算

JS 中超过 Number.MAX_SAFE_INTEGER 的数字计算将是不安全的。

Example:

1 2 3

Math.pow(2, 53) === Math.pow(2, 53) + 1 // true // Math.pow(2, 53) => 9007199254740992 // Math.pow(2, 53) + 1 => 9007199254740992

使用 BigInt 完全可以避免这个问题

1 2 3

BigInt(Math.pow(2, 53)) === BigInt(Math.pow(2, 53)) + BigInt(1) // false // BigInt(Math.pow(2, 53)) => 9007199254740992n // BigInt(Math.pow(2, 53)) + BigInt(1) => 9007199254740993n

要创建一个 BigInt,可以在一个整数的末尾添加字符n,或者调用函数 BigInt()

1 2 3 4 5

let foo = BigInt(1) // 1n let bar = BigInt(2) // 2n console.log(foo > bar) // false console.log(1n > 2n) // false

学无止境,与未来的自己共勉

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5个一定要学会的JavaScript新特性
JavaScript在不断地升级迭代,越来越多的新特性让我们的代码写起来变得简洁有趣,这篇文章会介绍5个新特性,一起研究一下把。
前端胖头鱼
2022/07/25
2360
分享 5 个让人兴奋的 ES13 功能
英文 | https://javascript.plainenglish.io/5-most-exciting-es13-features-you-should-know-about-c1c304f4ce02
前端达人
2023/09/14
1750
分享 5 个让人兴奋的 ES13 功能
掌握这 10 个 JavaScript 新的特性,让编写的代码既干净又有趣
JavaScript 不断升级迭代,越来越多的新特性让我们的代码写起来干净有趣,在这篇文章中我们介绍了 10 个新特性。
艾编程
2022/11/28
8980
掌握这 10 个 JavaScript 新的特性,让编写的代码既干净又有趣
ES13 中的 11 个惊人的 JavaScript 新特性
与许多其他编程语言一样,JavaScript 也在不断发展。每年,该语言都会通过新功能变得更强大,让开发人员编写更具表现力和简洁的代码。 让我们探索 ECMAScript 2022 (ES13) 中添加的最新功能,并查看它们的使用示例以更好地理解它们。 ◆ 1. 类字段声明 在 ES13 之前,类字段只能在构造函数中声明。与许多其他语言不同,我们不能在类的最外层范围内声明或定义它们。 class Car { constructor() { this.color = 'blue'; this.
IT大咖说
2022/08/26
7640
ES13 中的 11 个惊人的 JavaScript 新特性
ECMAScript13 中11个令人惊叹的 JavaScript 新特性
与许多其他编程语言一样,JavaScript 也在不断发展。每年,该语言都会通过新功能变得更加强大,使开发人员能够编写更具表现力和简洁的代码。 小编今天就为大家介绍ES13中添加的最新功能,并查看其用法示例以更好地理解它们。
葡萄城控件
2023/10/16
2790
ES13的11个超赞的新属性
声明:本文为翻译文章,原文为11 Amazing New JavaScript Features in ES13
进击的大葱
2022/08/22
4030
在 JavaScript 中,什么时候使用 Map 或胜过 Object
在 JavaScript 中,对象是很方便的。它们允许我们轻松地将多个数据块组合在一起。 在ES6之后,又出了一个新的语言补充-- Map。在很多方面,它看起来像是一个功能更强的对象,但接口却有些笨拙。
前端小智@大迁世界
2022/10/08
2.3K0
在 JavaScript 中,什么时候使用 Map 或胜过 Object
【完整汇总】近 5 年 JavaScript 新特性完整总览
本文深度解析近 5 年来 JavaScript 的所有重要更新,帮助你快速了解 JavaScript 新特性。
沉浸式趣谈
2025/03/04
1210
【完整汇总】近 5 年 JavaScript 新特性完整总览
JavaScript 又出新特性了?来看看这篇就明白了
https://juejin.im/post/5ca2e1935188254416288eb2
崔庆才
2019/05/06
1.6K0
一文吃透es6 ~ es13所有新特性
ECMAScript是一个脚本语言规范,通常看作是js的标准规范,但是js其实是ES的扩展语言。
心念
2023/01/11
2.1K0
44 个 JavaScript 变态题解析
当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", "2", "3"].map(parseInt) 知识点: Array/map Number/parseInt JavaScript parseInt 首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this值 其中回调函数接受三个参数 currentValue, index, arrary; 而题目中, m
用户1667431
2018/04/18
9690
「查缺补漏」送你 54 道 JavaScript 面试题
. VS = 操作符优先级 let a = {n : 1}; let b = a; a.x = a = {n: 2}; console.log(a.x) console.log(b.x) 输出是什么呢? 真的想明白了吗? 答案 undefined { n : 2} 你真的了解作用域吗 var a = 0, b = 0; function A(a) {
童欧巴
2020/12/15
1.1K0
从 JavaScript 发展历史中聊 ECMAScript(ES6-ES11) 新功能
JavaScript 是当今使用最广泛的、发展最好的前后端(后端主要是 Nodejs)语言,如果我们想要灵活使用 JavaScript,我们首先需要了解的就是 JavaScript 和 ECMAScript(ES) 的基础知识及发展历程。
coder_koala
2020/03/20
6.9K0
📚从ES7到ES12,了解JavaScript的新特性与语法演变
Array.prototype.includes 是一个用于判断数组是否包含特定元素的方法。它返回一个布尔值,表示数组中是否存在指定的值。
linwu
2023/07/27
4180
2022 年 JavaScript 从 ES6 到 ES12 新特性汇总
Javascript 是前端三剑客技术最重要的技能之一。每个学习前端的人,这个JavaScript技术是必须要学的。随着技术不断更新迭代,所以现在有一些新的知识来支持我们去学习 ES6 ~ ES12。
五月君
2022/12/12
1.5K0
2022 年 JavaScript 从 ES6 到 ES12 新特性汇总
掌握现代JavaScript:ES7到ES12的新特性全解析!
一、Array.prototype.{flat, flatMap} 扁平化嵌套数组
代码天才TTT
2023/07/12
6070
掌握现代JavaScript:ES7到ES12的新特性全解析!
ES7、ES8、ES9、ES10新特性大盘点
从 ECMAScript 2016(ES7)开始,版本发布变得更加频繁,每年发布一个新版本,好在每次版本的更新内容并不多,本文会细说这些新特性,尽可能和旧知识相关联,帮你迅速上手这些特性。
心莱科技雪雁
2019/12/11
2K0
ES7、ES8、ES9、ES10新特性大盘点
快来看看ECMAScript 2022(ES13)有哪些新标准?
ES2021已经发布一段时间了 ECMAScript2021 (ES12)的新特性,快来复习下!,ES2021的新特性你用起来了没?下面我们来看看ES2022 会带来那些有意思的新特性。
江一铭
2022/06/16
1.3K0
快来看看ECMAScript 2022(ES13)有哪些新标准?
20道精选的面试题附答案,进来看看能答对多少(一)
以下面试目,本人验证无误,查阅了相关资料,得出解析部分并做了相关总结,希望对正准备跳槽或找工作的你有所帮助!
前端达人
2021/06/16
4790
43道JavaScript面试题
在函数中,我们首先使用var关键字声明了name变量。 这意味着变量在创建阶段会被提升(JavaScript会在创建变量创建阶段为其分配内存空间),默认值为undefined,直到我们实际执行到使用该变量的行。 我们还没有为name变量赋值,所以它仍然保持undefined的值。
conanma
2021/10/28
1.9K0
推荐阅读
相关推荐
5个一定要学会的JavaScript新特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档