9 个实用的 JavaScript 技巧

这篇具有很好参考价值的文章主要介绍了9 个实用的 JavaScript 技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JavaScript 最初是为了给网站添加一些功能而被设计出来的简单语言。但是时至今日,它无处不在,而且还更加复杂了。随着 Web 应用程序越来越复杂,JavaScript 也发展得越来越快。编写简洁、可读且可维护的 JavaScript 程序不再像以前那么容易了。

今天我们总结 9 个实用的 JavaScript 技巧,帮助你更优雅的编写前端代码

1. 以 JavaScript 方式打破嵌套循环

许多编程语言都有用于跳出循环的break关键字。

然而,该关键字仅用于跳出当前循环。如果您必须打破嵌套循环,则可能很难保持代码整洁。

例如,如何实现以下代码?

for (let i in arr1) {
    for (let j in arr2) {
        for (let k in arr3) {
            if (k === j - 4) {
                // need to break out of the second loop
            }
            if (k === i - 3) {
                // need to break out of the outermost loop
            }
        }
    }
}

在其他语言中,您可能需要将布尔变量声明为外部循环的“flags”,并在进入相应循环时检查中断的“标志”。此方法有效,但如果有很多布尔标志,会使您的代码有点混乱。

JavaScript 针对这种场景提供了语法级的解决方案——label。

您可以使用标签来标识循环,然后参考该标签来打破相应的循环。

因此,上述代码的JavaScript实现方式如下:

loop1:
    for (let i in arr1) {
        loop2:
            for (let j in arr2) {
                for (let k in arr3) {
                    if (k === j - 4) {
                        break loop2
                    }
                    if (k === i - 3) {
                        break loop1
                    }
                }
            }
    }

Loop1 和 Loop2 是这两个外部循环的标签,因此使用其标签可以轻松打破匹配的循环。无需将其他变量声明为“flags”。

2. 利用扩展运算符进行解构赋值

扩展运算符是整洁 JavaScript 程序的关键。

let leaders = {
    me: "Yang",
    T: "Elon",
    A: "Tim",
    MS: "Bill"
}
let {me, ...others} = leaders
console.log(me)
// "Yang"
console.log(others)
// {T: "Elon", A: "Tim", MS: "Bill"}

如上面的示例所示,我们使用了一个简单的三个点的扩展运算符,将leader[“me”]的值分配给名为me的变量,并将其他键值对分配给数组others。

在 React 中,此技巧通常用于在构建 UI 组件时从 props 接收多个值。

3. 浅复制对象或数组的几种方法

众所周知,JavaScript 中的对象和数组等非原始数据类型是通过引用传递的。

因此,如下例所示,更改“新”数组也会更改原始数组:

let a = [1, 2, 3]
let b = a
b.push(8)
console.log(a, b)
// [ 1, 2, 3, 8 ] [ 1, 2, 3, 8 ]

要真正将数组 a 复制到新数组 b,JavaScript 中至少有 4 种方法。

使用 slice() 方法

slice()方法是提取数组的一部分。鉴于它在新数组中返回提取的部分,我们可以提取整个数组并将返回的数组作为副本:

let a = [1, 2, 3]
let b = a.slice()
b.push(8)
console.log(a, b)
// [ 1, 2, 3 ] [ 1, 2, 3, 8 ]

使用扩展运算符

扩展运算符不仅擅长解构赋值,还能够从数组或对象中解包项目:

let a = [1, 2, 3]
let b = [...a]
b.push(8)
console.log(a, b)
// [ 1, 2, 3 ] [ 1, 2, 3, 8 ]

使用内置的 Array.from() 方法

事实上,有一个专门设计的方法来进行复制——Array.from():

let a = [1, 2, 3]
let b = Array.from(a)
b.push(8)
console.log(a, b)
// [ 1, 2, 3 ] [ 1, 2, 3, 8 ]

使用 concat() 方法

concat() 方法用于合并两个或多个数组。由于此方法返回一个新数组而不更改现有数组,因此我们也可以利用它进行复制:

let a = [1, 2, 3]
let b = [].concat(a)
b.push(8)
console.log(a, b)
// [ 1, 2, 3 ] [ 1, 2, 3, 8 ]

对于物体,这三个点也能完美地工作:​​​​​​​

let leader = {
    name:'Yang',
    age:'30'
}
let fake_leader = {...leader}
fake_leader['skill']='coding'
console.log(leader,fake_leader)
// { name: 'Yang', age: '30' } { name: 'Yang', age: '30', skill: 'coding' }

另一种方法是使用内置的 Object.assign() 方法:​​​​​​​

let leader = {
    name:'Yang',
    age:'30'
}
let fake_leader = Object.assign({},leader)
fake_leader['skill']='coding'
console.log(leader,fake_leader)
// { name: 'Yang', age: '30' } { name: 'Yang', age: '30', skill: 'coding' }

这种类型的复制实际上称为浅复制,这意味着它只有一层深。它仅复制元素的引用,而不复制元素本身。因此,如果元素是对象或数组,复制的数组仍将引用相同的对象或数组。

例如,如果数组 a 包含一个内部数组(两级深),则浅拷贝无法真正复制它们,并且编辑数组 b 的内部数组也会更改 a 的:​​​​​​​

let a = [1, [2, 2, 2], 3]
let b = [].concat(a)
b[1].push(8)
console.log(a, b)
// [ 1, [ 2, 2, 2, 8 ], 3 ] [ 1, [ 2, 2, 2, 8 ], 3 ]

4. 使用 JSON 技巧进行深度复制

要实现深度复制,一个流行的技巧是结合使用 JSON.stringify() 和 JSON.parse()。

这个想法是将对象(或数组)序列化为 JSON 格式的字符串,然后将其解析回新对象。此过程有效且优雅地创建原始数组或对象的深层副本:​​​​​​​

let a = [1, [2, 2, 2], 3]
let b = JSON.parse(JSON.stringify(a))
b[1].push(8)
console.log(a, b)
// [ 1, [ 2, 2, 2 ], 3 ] [ 1, [ 2, 2, 2, 8 ], 3 ]

基于 JSON 的技巧在大多数简单情况下都很有用。但是,我们需要知道,要使该方法有效,对象必须是 JSON 可序列化的。

我们看一个反例:​​​​​​​

const obj = {
    func: function() {
        console.log("hello world!");
    }
}
const cp_obj=JSON.parse(JSON.stringify(obj))

console.log(cp_obj['func'])
// undefined

obj['func'] 的值是一个函数。它不能再通过 JSON 技巧进行复制。

在这种情况下,我们可以利用一个著名的第三方 JS 库 lodash:

​​​​​​​

const _ = require('lodash');
const obj = {
    func: function() {
        console.log("hello world!");
    }
}
const cp_obj=_.cloneDeep(obj)

cp_obj['func']()
// hello world!

如上所示,lodash 中的 cloneDeep 方法完美克隆了 obj 内的函数,并且可以在新的 cp_obj 上成功执行。

5. 熟练地实现For循环

如果您仍在 JavaScript 中使用 C/C++ 风格的 for 循环,那么,您肯定需要提升您的技能。

当然,下面的代码是正确的,但它还不够“JavaScript”。​​​​​​​

const arr = ['Y', 'a', 'n', 'g']
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
// Y
// a
// n
// g

在 JavaScript 中编写上述代码的惯用方法如下:

使用 forEach() 方法

forEach 方法非常适合迭代数组的元素:​​​​​​​

const author = [ 'Y', 'a', 'n', 'g' ];
author.forEach((c)=>{console.log(c)})
// Y
// a
// n
// g

使用map()函数

如果您阅读开源 JavaScript 程序,您可能会遇到 map() 函数。它是 JavaScript 中最流行的方法之一:​​​​​​​

const author = [ 'Y', 'a', 'n', 'g' ];
author.map((c)=>{console.log(c)})
// Y
// a
// n
// g

map() 函数的行为与 forEach() 基本相似,但有一个显着差异:

map() 方法返回一个与原始数组长度相同的新数组,其中每个元素都是对相应元素调用函数的结果。原始数组保持不变。forEach() 方法不返回任何内容。

以下代码说明了如何使用map()函数获取新数组:​​​​​​​

const author = ['Y', 'a', 'n', 'g'];
const cute_author = author.map((c) => c + ':)')
console.log(cute_author)
// [ 'Y:)', 'a:)', 'n:)', 'g:)' ]
console.log(author)
// [ 'Y', 'a', 'n', 'g' ]

但是,我们无法使用 forEach() 函数获取新数组:​​​​​​​

const author = ['Y', 'a', 'n', 'g'];
const cute_author = author.forEach((c) => c + ':)')
console.log(cute_author)
// undefined
console.log(author)
// [ 'Y', 'a', 'n', 'g' ]

使用 for...of... 结构

ES6 是 JavaScript 的一个里程碑。这个版本引入了许多好的功能。“for...of...”方法就是其中之一。​​​​​​​

const author = [ 'Y', 'a', 'n', 'g' ];
for (let char of author){
    console.log(char);
}
// Y
// a
// n
// g

使用 for...in... 结构

“for...in...”语法也能够实现与我们相同的功能。但我们应该注意“for…in…”和“for…of…”之间的区别。下面的代码片段对此进行了解释:​​​​​​​

const author = [ 'Y', 'a', 'n', 'g' ];
for (let idx in author){
    console.log(author[idx]);
}
// Y
// a
// n
// g

6. 删除数组重复值的最快方法

ES6 为 JavaScrip 引入了一种新的数据结构——集合。集合是唯一的项目的集合。

由于集合的特性,它使得删除数组的重复值变得更加简单。​​​​​​​

const a = [1, 2, 1, 6, 6, 6, 9]
const unique_a = [...new Set(a)]
console.log(unique_a)
// [ 1, 2, 6, 9 ]

如上面的程序所示,我们可以利用展开运算符和 Set() 方法来方便地获取数组的唯一元素。

7. 用一行代码反转字符串

要在 JavaScript 中反转字符串,我们不需要编写 for 循环。

执行此操作需要 3 个步骤:

  • 将字符串拆分为数组

  • 反转数组

  • 将数组转换为字符串

这 3 个步骤需要利用 3 种不同的内置方法,如下所示:​​​​​​​

const author = "Yang Zhou";
const reversedAuthor = author.split("").reverse().join("");
console.log(reversedAuthor);
// uohZ gnaY

这是一句不错的俏皮话,但说实话,JS 反转字符串的方式并不像 Python 那样优雅。由于其优美的切片语法,Python 可以更简洁地完成同样的事情:​​​​​​​

author = 'Yang Zhou'
reversed_author = author[::-1]
print(reversed_author)
# uohZ gnaY

顺便说一句,检查 JavaScript 字符串是否为回文的一个简单方法是将字符串与其反转版本进行比较:​​​​​​​

const author = 'YangnaY'
const isPalindrome = author.split("").reverse().join("") === author
console.log(isPalindrome)
// true

8.快速计算数组中的元素

如何计算 JavaScript 数组中的每个元素?

使用for循环一项一项地遍历项目并在此过程中对它们进行计数?

这是一个解决方案,但根本不是一个优雅的解决方案。我想说 lodash 是一个超级有用的 JS 库:​​​​​​​

const _ = require('lodash');
const author = ['Y', 'a', 'a', 'a', 'n', 'n', 'g', 'g', 'g', 'g']
console.log(_.countBy(author))
// { Y: 1, a: 3, n: 2, g: 4 }

如果你不想使用第三方库,自己实现类似的功能并不难:​​​​​​​

const countBy = (arr) => {
    let count = {};
    arr.forEach((e) => {
        count[e] = (count[e] || 0) + 1;
    });
    return count;
}

const author = ['Y', 'a', 'a', 'a', 'n', 'n', 'g', 'g', 'g', 'g']
const charCount = countBy(author);
console.log(charCount);
// { Y: 1, a: 3, n: 2, g: 4 }

如果您只需要计算一个特定项目,则 filter() 方法是一个不错的选择:​​​​​​​

const author = ['Y', 'a', 'a', 'a', 'n', 'n', 'g', 'g', 'g', 'g']

// Filter all elements equal to 'a' and return the length (count)
const countOfa = author.filter(x => x === 'a').length
console.log(countOfa)
// 3

9. 使用逗号运算符简化代码

由于逗号运算符的语法,逗号在 JavaScript 中更加强大。

逗号 (,) 运算符计算每个表达式(从左到右)并返回最后一个表达式的值。如果你能熟练地利用它的力量,这对简化你的代码将会非常有帮助。

例如,以下程序演示了如何利用逗号运算符通过一行代码实现两个不同的目的:​​​​​​​

let sum = 0;
const squares = [1, 2, 3, 4, 5].map((x) => (sum += x, x * x));
console.log(squares);
// [1, 4, 9, 16, 25]
console.log(sum);
// 15

鉴于逗号运算符始终返回最后一个表达式的结果,我们可以利用此功能来避免编写许多 return 关键字。

例如,以下代码的 get_author() 函数返回更改后的 arr:​​​​​​​

const get_author = arr => {
    arr.push('g')
    return arr
}
console.log(get_author(['Y','a','n']))
// [ 'Y', 'a', 'n', 'g' ]

这是让逗号运算符炫耀的最佳场景:​​​​​​​

const t_author = arr => (arr.push('g'), arr)
console.log(get_author(['Y', 'a', 'n']))
// [ 'Y', 'a', 'n', 'g' ]

这9个方法,无论你的新晋职场的小白,还是前端大神在实际的开发过程中都非常的实用,希望可以帮带你!文章来源地址https://www.toymoban.com/news/detail-698492.html

到了这里,关于9 个实用的 JavaScript 技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)

    知识总结: Python_web前端开发 python 安装Flask web框架 pip install flask 简介:templates用来返回html的页面,而非文本。 创建文件index.html 结构如下 index.xml内容如下: web1.py内容如下: 重新运行后: 固定格式:h/div/span/a/img/ul/li/table/input/form 通用的字符编码 meta charset=“UTF-8” div:一个

    2024年04月14日
    浏览(66)
  • Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript

    家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有运用,CSS的代码量也很足、很细致,使用hover来完成

    2024年02月08日
    浏览(61)
  • [HTML]Web前端开发技术9(HTML5、CSS3、JavaScript )——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 CSS颜色与背景 颜色color属性 背景background属性 1. 背景颜色background-color 2. 背景图像background-image 3. 背景

    2024年02月03日
    浏览(73)
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:三列自适应宽度 网页标题:多行三列自适应宽度 一级水平导航菜单:采用“无序列表+超

    2024年01月16日
    浏览(73)
  • [HTML]Web前端开发技术13(HTML5、CSS3、JavaScript )横向二级导航菜单 Web页面设计实例——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 横向二级导航菜单 Web页面设计实例 总结 该练的还是要练,终究是自己的! 网页标题:二级下拉导航

    2024年01月17日
    浏览(70)
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 CSS的定位机制 文档流定位 元素类型   浮动定位 float的用处 float的特点 clear属性 层定位 position属性

    2024年02月05日
    浏览(69)
  • JavaScript高级技巧:深入探索JavaScript语言的高级特性和用法

    当我们谈论JavaScript高级技巧时,以下是一些示例来说明这些概念: 闭包(Closures): 在上面的例子中, innerFunction 是一个闭包,它可以访问外部函数 outerFunction 中的 outerVariable 变量,即使在外部函数执行结束后也可以。 高阶函数(Higher-Order Functions): 在上面的例子中,

    2024年02月08日
    浏览(49)
  • web前端框架Javascript之JavaScript 异步编程史

    早期的 Web 应用中,与后台进行交互时,需要进行 form 表单的提交,然后在页面刷新后给用户反馈结果。在页面刷新过程中,后台会重新返回一段 HTML 代码,这段 HTML 中的大部分内容与之前页面基本相同,这势必造成了流量的浪费,而且一来一回也延长了页面的响应时间,总

    2024年02月14日
    浏览(54)
  • 大型医院云HIS系统:采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发 融合B/S版电子病历系统

    一套医院云his系统源码 采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发。融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。 文末卡片获取联系! 基于云计算技术的B/S架构的医院管理系统(简称云HIS),采用前后

    2024年02月03日
    浏览(48)
  • Web前端-JavaScript

    目录 1 概述 2 HTML嵌入JS代码三种方式 2.1 第一种方式 2.2 第二种方式 2.3 第三种方式 3 变量 4 数据类型 4.1 概述 4.2 Number数据类型  4.3 几个值得注意的函数 4.4 Boolean数据类型  4.5 String数据类型 4.6 关于Object类型 4.7 NaN、undefined、null的区别 4 函数 5 事件 5.1 JS中有哪些常用的事件

    2024年02月09日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包