JavaScript实用代码片段

单行if-else语句

如果if-else语句中只有一条语句,那么可以使用三目运算符代替。
例如:

const AGE = 10;
let ageGroup;
// before
if (AGE > 18) {
  ageGroup = 'An adult';
} else {
  ageGroup = 'A child';
}
// after
ageGroup = AGE > 18 ? 'An adult' : 'A child';

相较于简单的if-else语句,三目运算符可能会增加代码的阅读难度,因此需要选择简单的表达式进行替换。

从数组中删除重复项

利用ES6中新增的集合Set

  • Set是一个集合,集合中的值不能重复
const NUMBERS = [1, 1, 2, 3, 5, 5, 8, 9, 9];
const UNIQUE = [...new Set(NUMBERS)]; // → [ 1, 2, 3, 5, 8, 9 ]

原理:

  • 首先将NUMBERS中数据存储在Set中,创建Set会删除数组中重复值
  • 利用展开运算符号...将任意可迭代对象转换为数组,将集合转换为数组。

利用??空值合并操作符

空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

逻辑或操作符(||不同,逻辑或操作符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,''0)时。

  • 判断数据是否为null或undefined

    let temp;
    let demo = 1;
    console.log(temp ?? "Not found"); // → Not found
    console.log(demo ?? "Not found"); // → 1
    
  • 给变量设置初始值

    const DEMO = null ?? 'DEFAULT STRING';
    console.log(DEMO); // → DEFAULT STRING
    const DEMO1 = 0 ?? 'DEFAULT STRING';
    console.log(DEMO1); // → 0
    const DEMO2 = "" ?? 'DEFAULT STRING';
    console.log(DEMO2); // → ""
    

利用?.可选链操作符防止错误

可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值

let DEMO = {
  name: "kai",
  age: 24,
  gender: "boy"
}
console.log(DEMO?.age); // → 24
console.log(DEMO.age); // → 24
DEMO = null;
console.log(DEMO?.sex); // → undefined
console.log(DEMO.sex); // → 报错 TypeError: Cannot read property 'sex' of null

短路计算

const DEMO = null;
let x = 0;
const RES = DEMO?.[x++];
console.log(x);  // → 0

当在表达式中使用可选链时,如果左操作数是 null 或 undefined,表达式将不会被计算

在没有第三个变量的情况下交换两个变量

在 JavaScript 中,可以使用解构从数组中拆分值。这可以应用于交换两个变量而无需第三个:

let x = 1, y = 2;
// before
let temp;
temp = x;
x = y;
y = temp;
// after
[x, y] = [y, x]

使用!!将内容转换为布尔值

在JavaScript中,可以使用!!将任何内容转换为布尔值,例如:

console.log(!!true); // → true
console.log(!!2); // → true
console.log(!![]); // → true
console.log(!!"Test"); // → true
console.log(!!-1); // → true
console.log(!!false); // → false
console.log(!!0); // → false
console.log(!!""); // → false

扩展运算符

使用扩展运算符合并两个数组…:

const DEMO1 = [1, 2, 3];
const DEMO2 = [4, 5, 6];
// before
const DEMO3 = DEMO1.concat(DEMO2);
// after
const DEMO4 = [...DEMO1, ...DEMO2];
let DEMO = [];
// before
DEMO.push(1);
DEMO.push(2);
// after
DEMO = [...DEMO, 3, 4];

传播解构

使用扩展运算符将剩余元素分配给变量:

const student = {
  name: "kai",
  age: 24,
  city: "beijing",
  state: "university",
};
// before
const name = student.name;
const age = student.age;
const address = {city: student.city, state: student.state};
// after
const {name, age, ...address} = student;

使用 && 进行短路评估

不必用if语句检查某事是否为真,使用&&运算符:

const TEMP = true;
function DEMO() {
  console.log("Yay!");
}
// before
if (TEMP) {
  DEMO();
}
// after
TEMP && DEMO();

模板字符串

通过将字符串包装在反引号内并${}用于嵌入值,从而在字符串之间插入变量。

const SOMETHING = '白菜';
const MOOD = '高兴';
const STR = `我买了${SOMETHING}${MOOD}` // → 我买了白菜很高兴

从数组中查找特定元素

使用find()方法查找匹配特定条件的元素:

const STUDENT = [
  {name: "kai", age: 24},
  {name: "hui", age: 23}
];
let name;
// before
for (let i = 0; i < STUDENT.length; ++i) {
  if (STUDENT[i].age === 23) {
    name = STUDENT[i].name;
  }
}
// SHORTHAND
name = STUDENT.find(item => item.age === 23);

对象属性赋值

对象赋值的时候省略键名称使得键值保持一致

const name = 'kai', age = 24;
// before
const PERSON = {
  name: name,
  age: age
};
// after 
const PERSON = {name, age};

使用forEach代替For循环

const NUMBERS = [1, 2, 3];
// before
for (let i = 0; i < NUMBERS.length; i++) {
  console.log(NUMBERS[i]);
}
// after
NUMBERS.forEach(number => console.log(number))

使用默认参数

为函数参数提供默认值

// before 
function DEMO(params) {
  if (params === undefined) {
    params = 'DEFAULT';
  } else {
    console.log(params);
  }
}

// after
function DEMO(params = 'DEFAULT') {
  console.log(params)
}

将对象的键、值收集到数组中

使用Object.keys()收集对象的键

使用Object.values()收集对象的值

const OBJ = {
  name: 'kai',
  age: 24
}
const KEYS = Object.keys(OBJ);
const VALUES = Object.values(OBJ);
console.log(KEYS);  // → [ 'name', 'age' ]
console.log(VALUES); // → [ 'kai', 24 ]

检查一个项目是否存在于数组中

使用 includes() 方法来检查元素是否在数组

const NUMBERS = [1, 2, 3];
// before
console.log(NUMBERS.indexOf(1) > -1); // → true
// after
console.log(NUMBERS.includes(1)); // → true

压缩多个条件

避免使用长|| 检查多个条件链,可以使用刚刚在上一个技巧中学到的东西——即,使用 includes() 方法:

const num = 1;
// before
if(num === 1 || num === 2 || num === 3){
  console.log("Yep");
}
// after
if([1,2,3].includes(num)){
  console.log("Yep");
}

指数运算符

使用**运算符代替Math.pow()

// before
console.log(Math.pow(4, 2)); // → 16
console.log(Math.pow(2, 3)); // → 8
// after
console.log(4 ** 2); // → 16
console.log(2 ** 3); // → 8

Math.floor() 简写

使用~~运算符代替Math.floor()

// before
console.log(Math.floor(5.25)); // → 5.0
// SHORTHAND
console.log(~~5.25); // → 5.0

用一行代码分配多个值

let demo1, demo2;
// before
demo1 = 1;
demo2 = 2;
console.log(demo1); // → 1
console.log(demo2); // → 2
// after
[demo1, demo2] = [1, 2];
console.log(demo1); // → 1
console.log(demo2); // → 2
const PERSON = {
  name: "kai",
  age: 24,
};
// before
let name = PERSON.name;
let age = PERSON.age;
// after
let {name, age} = PERSON;
飞思卡尔智能车竞赛是一项备受关注的科技赛事,旨在激发学生的创新和实践能力,尤其是在嵌入式系统、自动控制和机器人技术等关键领域。其中的“电磁组”要求参赛队伍设计并搭建一辆能够自主导航的智能车,通过电磁感应线圈感知赛道路径。本压缩包文件提供了一套完整的电磁组智能车程序,这是一套经过实战验证的代码,曾在校级比赛中获得第二名的优异成绩。 该程序的核心内容可能涉及以下关键知识点: 传感器处理:文件名“4sensor”表明车辆配备了四个传感器,用于获取环境信息。这些传感器很可能是电磁感应传感器,用于探测赛道上的导电线圈。通过分析传感器信号的变化,车辆能够判断自身的行驶方向和位置。 数据采集与滤波:在实际运行中,传感器读数可能受到噪声干扰,因此需要进行数据滤波以提高精度。常见的滤波算法包括低通滤波、高斯滤波和滑动平均滤波等,以确保车辆对赛道的判断准确无误。 路径规划:车辆需要根据传感器输入实时规划行驶路径。这可能涉及PID(比例-积分-微分)控制、模糊逻辑控制或其他现代控制理论方法,从而确保车辆能够稳定且快速地沿赛道行驶。 电机控制:智能车的驱动通常依赖于直流电机或无刷电机,电机控制是关键环节。程序中可能包含电机速度和方向的调节算法,如PWM(脉宽调制)控制,以实现精准的运动控制。 嵌入式系统编程:飞思卡尔智能车的控制器可能基于飞思卡尔微处理器(例如MC9S12系列)。编程语言通常为C或C++,需要掌握微控制器的中断系统、定时器和串行通信等功能。 软件架构:智能车软件通常具有清晰的架构,包括任务调度、中断服务程序和主循环等。理解和优化这一架构对于提升整体性能至关重要。 调试与优化:程序能够在比赛中取得好成绩,说明经过了反复的调试和优化。这可能涉及代码效率提升、故障排查以及性能瓶颈的识别和解决。 团队协作与版本控制:在项目开发过程中,团队协作和版本控制工具(如Git)的应用不可或缺,能够保
双闭环直流电机调速系统是一种高效且应用广泛的直流调速技术。通过设置转速环和电流环两个闭环,系统能够对电机的转速和电流进行精准控制,从而提升动态响应能力和稳定性,广泛应用于工业自动化领域。 主电路设计:主电路采用三相全控桥整流电路,将交流电转换为可调节的直流电,为电机供电。晶闸管作为核心元件,通过调节控制角α实现输出电压的调节。 元部件设计:包括整流变压器、晶闸管、电抗器等元件的设计与参数计算,这些元件的性能直接影响系统的稳定性和效率。 保护电路:设计过载保护、短路保护等保护电路,确保系统安全运行。 驱动电路:设计触发电路和脉冲变压器,触发电路用于触发晶闸管导通,脉冲变压器用于传递触发信号。 控制器设计:系统核心为转速调节器(ASR)和电流调节器(ACR),分别对转速和电流进行调控。检测电路用于采集实际转速和电流值并反馈给调节器。 仿真分析:利用MATLAB/SIMULINK等工具对系统进行仿真分析,验证其稳定性和性能指标是否达标。 方案确定与框图绘制:明确系统构成及各模块连接方式。 主电路设计:选择整流电路形式,设计整流变压器、晶闸管等元部件并计算参数。 驱动电路设计:设计触发电路和脉冲变压器,确保晶闸管准确触发。 控制器设计: 转速调节器(ASR):根据转速指令调整实际转速。 电流调节器(ACR):根据ASR输出指令调整电流,实现快速响应。 参数计算:计算给定电压、调节器、检测电路、触发电路和稳压电路的参数。 仿真分析:通过软件模拟系统运行状态,评估性能。 电气原理图绘制:完成调速控制电路的电气原理图绘制。 双闭环控制策略:转速环在外,电流环在内,形成嵌套结构,提升动态响应能力。 晶闸管控制角调节:通过改变控制角α调节输出电压,实现转速平滑调节。 仿真分析:借助专业软件验证设计的合理性和有效性。 双闭环直流电机调速系统设计涉及主电路、驱动电路和控制器设计等多个环节,通过仿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiSarH

如果觉得文章不错,可以支持下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值