15个提高Javascript开发技巧

news2024/11/30 14:31:27

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

劈柴不照纹,累死劈柴人。上学的时候就总有那些“小怪物们”总能解出来难题, 总能最快的完成作业,总能轻松考个的好成绩,还不耽误下课一起玩。怎么回事儿?人家有技巧啊!那现在干开发了,你想不想成为“小怪物”?来,我给你介绍!

这篇文章中,我将分享15 个关于JavaScript 的优秀技巧。这些技巧或者你可能已经掌握了,不过没有关系,这个技巧也不可能适用所有人,我分享的目的是把这些有趣好玩又便捷的技巧让更多人知道,以及在需要的时候,可以想到它们。

现在,我们一起来看看这些技巧。

1.判断空和未定义

我们很快就会在 JavaScript 中学到的一件事是,并非一切都像它看起来的那样,并且在像这样的动态语言中,变量可能会以多种方式导致你出现问题。可以进行的一个非常常见的测试是检查变量是否为空或未定义,甚至“空”,如下例所示:

let username;
if (name !== null || name !== undefined || name !== '') {
   userName = name;
} else {
   userName = "";
复制代码

进行相同评估的更简单方法是:

let userName = name || "";
复制代码

如果你不相信,请测试一下!

2.数组定义

所以你必须创建一个 Array 对象,然后用它的元素填充它,对吧?你的代码可能看起来像这样:

let a = new Array(); 
a[0] = "s1"; 
a[1] = "s2"; 
a[2] = "s3";
复制代码

在一行中做同样的事情怎么样?

let a = ["s1", "s2", "s3"]
复制代码

挺好看的吧!

注意:我知道这个技巧更简单,但对我来说很简单,它可能会帮助一些从其他编程语言开始的人。

3.三元运算符

著名的“单行 if/else”,三元运算符对于 Java 和 C# 等语言对于许多程序员来说已经是老熟人了。它也存在于 JS 中,并且可以像这样轻松地转换代码块:

let big;
if (x > 10) {
    big = true;
}
else {
    big = false;
}
复制代码

在这:

let big = x > 10 ? true : false;
复制代码

或者更简单:

let big = x > 10; 但它也适用于函数调用吗?如果我有两个不同的函数,并且我想在 if 为真时调用一个,在 if 为假的情况下调用一个,通常你会执行以下操作:

function x() { console.log('x') };
function y() { console.log('y') };

let z = 3;
if (z == 3) {
    x();
} else {
    y();
}
复制代码

但是,你也可以使用三元进行相同的函数调用:

function x() { console.log('x') };
function y() { console.log('y') };

let z = 3;
(z==3 ? x : y)(); // Shortcut
复制代码

另外,值得一提的是测试变量是否为真的 ifs,一些程序员仍然这样做:

if (likeJs === true)
复制代码

当他们可以这样做时:

if (likeJs)
复制代码

4.声明变量

是的,即使是变量的声明也有其怪癖。虽然这不是一个秘密,但你仍然会看到很多程序员做出这样的声明:

let x;
let y;
let z = 3;
复制代码

他们什么时候可以这样做:

let x, y, z = 3;
复制代码

5.使用正则表达式

当涉及到文本分析和验证以及某些类型的网络爬虫的数据提取时,正则表达式是创建优雅而强大的代码的好工具。

你可以在以下链接中了解有关如何使用正则表达式的更多信息:

developer.mozilla.org/enUS/docs/W…

regexr.com/

regex101.com/

6.charAt() 快捷键

你只想从一个字符串中选择一个字符,在一个特定的位置,对吧?我敢打赌,你首先想到的是使用 charAt 函数,如下所示:

"string".charAt(0);
复制代码

但是得到这个,通过记住 String 是一个字符数组的类比,你会得到相同的结果:

"string"[0]; // Returns 's'
复制代码

7.以 10 为底的幂

这只是对 Base-10 指数数或充满零的著名数字的一种更精简的表示法。对于数学比较接近的人来说,看到其中一个不会太惊讶,但是一个数字 10000 在 JS 中可以很容易地被 1e4 替换,即 1 后跟 4 个零,如下所示:

for (let i = 0; i < 1e4; i++) {
复制代码

8.模板文字

这种语义特性是 ECMAScript 版本 6 或更高版本所独有的,并且极大地简化了读取变量集中的字符串连接。例如,下面的串联:

const question = “My number is “ + number + “, ok?”
复制代码

这个很简单,你可能做了更糟糕的连接。从 ES6 开始,我们可以使用模板文字进行这种连接:

const question = `My number is ${number}, ok?`
复制代码

9.箭头函数

箭头函数是声明函数的缩短方式。是的,自第一个 JavaScript 版本以来,有更多方法可以做同样的事情。例如,下面是一个求和函数:

function sum(n1,n2){
   return n1 + n2;
}
复制代码

我们也可以像这样声明这个函数:

const sum = function(n1,n2){
   return n1+n2;
}
复制代码

但是使用箭头函数:

const sum = (n1,n2) => n1 + n2;
复制代码

10.参数解构

本技巧适用于那些充满参数的函数,并且你决定用一个对象替换所有这些函数。或者对于那些真正需要配置对象作为参数的函数。

到目前为止都没有问题,毕竟谁从来没有经历过这个?问题是必须继续访问由参数传递的对象,然后是我们要读取的每个属性,对吧?像这样:

function init(config){
   const s = config.s;
   const t = config.t;
   return s + t;// or config.s + config.t
}

init({s: "1", t: "2"});
复制代码

参数解构特性正是为了简化这一点,同时通过用下面的语句替换前面的语句来帮助代码可读性:

function init({s, t}){
   return s + t;
}

init({s: 1, t: 2});
复制代码

最重要的是,我们仍然可以在参数对象的属性中添加默认值:

function init({s = 10, t = 20}){
   return s + t;
}

init({s: 1});
复制代码

这样,s 的值为 1,但 t 的值将默认为该属性,即 20。

11.键值名称

一个非常令人上瘾的功能是为对象分配属性的缩写方式。想象一下,你有一个 person 对象,该对象具有将通过 name 变量分配的 name 属性。它看起来像这样:

const name = "Joseph"
const person = { name: name }
// { name: "Joseph" }
复制代码

虽然你可以这样做:

const name = "Joseph"
const person = { name }
// { name: "Joseph" }
复制代码

也就是说,如果你的变量与属性同名,则不需要调用它,只需传递变量即可。多个属性也是如此:

const name = "Joseph"
const canCode = true
const person = { name, canCode }
// { name: "Joseph", canCode: true }
复制代码

12.Map

考虑以下对象数组:

const animals = [
    {
        "name": "cat",
        "size": "small",
        "weight": 5
    },
    {
        "name": "dog",
        "size": "small",
        "weight": 10
    },
    {
        "name": "lion",
        "size": "medium",
        "weight": 150
    },
    {
        "name": "elefante",
        "size": "large",
        "weight": 5000
    }
]
复制代码

现在想象一下,我们只想将动物的名字添加到另一个数组中。通常我们会这样做:

let animalNames = [];

for (let i = 0; i < animals.length; i++) {
    animalNames.push(animals[i].name);
}
复制代码

但是使用 Map,我们可以这样做:

let animalNames = animais.map((animal) => {
    return animal.nome;
})
复制代码

请注意,map 需要一个最多三个参数的函数:

  • 第一个是当前对象(如在 foreach 中)
  • 第二个是当前迭代的索引
  • 第三个是整个数组

显然,这个函数将为动物数组中的每个对象调用一次。

13.Filter

如果我们想遍历与上一个技巧中相同的动物对象数组,但这次只返回那些大小为“小”的对象怎么办?

我们将如何使用常规 JS 来做到这一点?

let smallAnimals = [];

for (let i = 0; i < animals.length; i ++) {
    if (animals[i].size === "small") {
       smallAnimals.push(animals[i])
    }
}
复制代码

然而,使用过filter操作符,我们可以用一种更简洁、更清晰的方式来做到这一点:

let smallAnimals = animais.filter((animal) => {
    return animal.size === "small"
})
复制代码

Filter 期望一个函数的参数是当前迭代的对象(如在 foreach 中),它应该返回一个布尔值,指示该对象是否将成为返回数组的一部分(true 表示它通过了测试 并将成为其中的一部分)。

14.Reduce

Javascript 的另一个重要特性是 reduce。它允许我们以非常简单和强大的方式在集合之上进行分组和计算。例如,如果我们想将动物对象数组中所有动物的重量相加,我们会怎么做?

let totalWeight = 0;

for (let i = 0; i < animals.length; i++) {
    totalWeight += animals[i].weight;
}
复制代码

但是使用 reduce 我们可以这样做:

let totalWeight = animals.reduce((total, animal) => {
    return total += animal.weight;
}, 0)
复制代码

Reduce 需要一个带有以下参数的函数:

  • 第一个是累加器变量的当前值(在所有迭代结束时,它将包含最终值)
  • 第二个参数是当前迭代的对象
  • 第三个参数是当前迭代的索引
  • 第四个参数是将要迭代的所有对象的数组

此函数将对数组中的每个对象执行一次,并在其执行结束时返回聚合值。

有了这些技巧,让你的开发事半功倍,不加班,不熬夜,不脱发。再也不是梦!

End -

 

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

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

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

相关文章

固态硬盘无法识别,怎么办?4招教您解决!

案例&#xff1a;电脑识别不了固态硬盘怎么办&#xff1f; 【我的电脑识别不了固态硬盘&#xff0c;这给我带来了很大的困扰。我尝试了很多方法&#xff0c;还没有解决。求一个有效的解决方法&#xff01;】 固态硬盘在计算机领域中越来越普遍&#xff0c;其快速读取和写入速…

PyCharm十大提高生产力的插件

PyCharm是一个非常流行的Python开发IDE。除了支持Python语言&#xff0c;PyCharm还支持其他流行的语言&#xff0c;如C、C、JavaScript等。PyCharm被广泛使用&#xff0c;是因为它拥有许多方便而实用的插件&#xff0c;这些插件能够显著提高开发者的生产力。下面我们将介绍十大…

鲸鸿动能广告接入如何高效变现流量?

广告是App开发者最常用的流量变现方法之一&#xff0c;当App拥有一定数量用户时&#xff0c;开发者就需要考虑如何进行流量变现&#xff0c;帮助App实现商业可持续增长。 鲸鸿动能流量变现服务是广告服务依托华为终端强大的平台与数据能力为开发者提供的App流量变现服务&#…

用例评审的正确姿势,2个要点不容忽视

&#xff0c;点击蓝字&#x1f446; 关注Agilean&#xff0c;获取一手干货 导语 用例评审的作用已经不言而喻&#xff0c;但是在很多组织的实际落地过程中&#xff0c;却收效甚微。研发管理人员常常会发现即使做了用例评审&#xff0c;一些显而易见的问题还是会出现&#xff1a…

ECharts折线图堆叠和不堆叠的问题

今天配合后台联调数据的时候遇到一种情况 第三条数据为0时候并没有在y轴为0上&#xff0c;而是跟上一条线重合了 ECharts折线图是堆叠的&#xff0c;折线图堆叠的意思就是&#xff1a;第二条线的数值本身的数值第一条线的数值&#xff0c;第三条的数值第二条线图上的数值本身的…

手撕三子棋

代码思路&#xff1a; 1.多文件的使用&#xff08;test.c game.c game.h&#xff09; 2.宏定义的使用 3.打印菜单 4.创建二维数组 5.初始化数组 6.打印棋盘 7.玩家下棋 8.电脑下棋 9.判断输赢 10.代码全析总结 &#xff08;1&#xff09;多文件的使用&#xff1a;…

MySQL 关于缓存的 “杂七杂八”

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

中心极限定理模拟

中心极限定理模拟 文章目录 中心极限定理模拟 [toc] 设服从均值为 μ \mu μ、方差为 σ 2 < ∞ \sigma^2<\infty σ2<∞的任意一个总体&#xff0c;抽取样本量为 n n n的样本&#xff0c;当 n → ∞ n\to\infty n→∞&#xff0c;样本均值 X ˉ \bar{X} Xˉ的抽样分布…

云原生之使用Docker部署webos私有云盘

云原生之使用Docker部署webos私有云盘 一、webos介绍1. webos简介2. webos特点 二、本次实践介绍1. 本次实践简介2. 本次部署环境规划 三、检查本地Docker环境1. 检查Docker版本2. 检查Docker服务状态 四、下载webos镜像五、部署webos1. 创建挂载目录2. 创建webos容器3. 查看we…

光栅化过程 (顶点片元着色)

片元为什么是三角形&#xff1a; 1 三角形是最基本的多边形&#xff1b; 2 任何多边形都可以拆分成三角形&#xff1b; 3 空间内任何三个点的连线一定是平面&#xff1b; 4 三角形有清晰的内部和外部定义&#xff1b; 5 三角形只要定义顶点的属性就可以计算三角形内部点的渐变关…

mac iterm2设置rz sz文件传输

1、安装lrzsz $ brew install lrzsz 2、创建并设置iterm2-send-zmodem.sh sudo vim /usr/local/bin/iterm2-send-zmodem.sh # /usr/local/bin/iterm2-send-zmodem.sh#!/bin/bash # Author: Matt Mastracci (matthewmastracci.com) # AppleScript from http://stackoverflow.com…

【云原生】使用外网Rancher2.5.12搭建阿里云内网K8s 1.20集群

目录 一、目标二、解决方案三、草图四、版本信息五、资源规划六、必要条件七、开始部署1、安装Docker2、安装Rancher3、解析Rancher Server URL域名4、创建K8s集群5、注册K8s集群节点 八、验证 一、目标 在云平台搭建一套高可用的K8s集群 二、解决方案 第一种&#xff1a;使…

创客匠人产品怎么样?

创客匠人产品经过多年的更新与送代&#xff0c;现如今应用范畴已经逐渐完善&#xff0c;客户群体也越来越来越广泛。虽然有很多人都有听说过创客匠人&#xff0c;但是对于创客匠人的功能和性质可能并不是得分的了解&#xff0c;为了便于大家选择&#xff0c;下面就由小编我为大…

谈谈几种分布式锁实现

大家好&#xff0c;我是易安&#xff01;今天我们呢谈一谈常见的分布式锁的几种实现方式。 什么是分布式锁 在JVM中&#xff0c;在多线程并发的情况下&#xff0c;我们可以使用同步锁或Lock锁&#xff0c;保证在同一时间内&#xff0c;只能有一个线程修改共享变量或执行代码块…

Linux监听器 -- inotify

inotify作为Linux系统的一个监听器&#xff0c;能够监听文件或者目录的变化。 inotify接口 inotify的接口主要有三个&#xff0c;分别是inotify_init、inotify_add_watch 和 inotify_rm_watch。下面分别进行详细介绍。 inotify_init 函数用于创建inotify句柄&#xff0c;函数…

一图看懂 pytz 模块:现代以及历史版本的世界时区定义数据库,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 pytz 模块&#xff1a;现代以及历史版本的世界时区定义&#xff0c;将时区数据库引入 Python&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&am…

算法小课堂(七)字符串

一、概念 1.1相关概念 0C中有两种字符串表示形式&#xff1a;C风格字符串和string类类型。 C风格字符串是 字符数组使用null字符\0终止的一维字符数组&#xff0c;字符指针是一个指针变量&#xff0c;里面存放一个字符的地址 而string类处理起字符串来会方便很多&#xff0c;完…

Golang中的数组和切片

目录 数组 基础知识 声明并初始化一个数组 遍历一个数组 切片 基础知识 声明并初始化一个切片 向切片中添加元素 切片的遍历和切片表达式 数组和切片的区别 数组 基础知识 数组是一种由固定长度的特定类型元素组成的序列&#xff0c;元素可以是任何数据类型&#x…

数组——知识点大全(简洁,含使用演示和代码)

目录 一.一维数组的创建 1.数组的基本形式 2.变长数组 3.数组的初始化 二.数组的本质 三.一维数组的使用 1.访问数组成员 2.计算数组的大小 四.一维数组在内存中的存储 五.二维数组 1.二维数组的形式 2.二维数组的初始化规则 六.二维数组的使用 1.打印二维数组 …

Linux下新加新磁盘分区及挂载

一&#xff1a;新插入磁盘查看 查看插入磁盘 法1&#xff1a;$sudo fdisk -l 法2&#xff1a; $sudo lsblk 二&#xff1a;磁盘分区及格式化 1: 分区 $sudo fdisk /dev/nvme0n1 进入分区工具后&#xff0c;我们可以输入 m 看指令说明&#xff1a; Command (m for help): …