【Web前端】ES6新特性详解

本文详细介绍了JavaScriptES6中的核心特性,包括let和const声明变量的差异,模板字符串的使用,解构赋值在数组和对象中的应用,函数扩展如参数默认值、剩余参数和箭头函数,以及对象扩展、Symbol、迭代器、生成器、代理和反射的概念和用法。此外,还讨论了Promise和异步编程,以及类和模块的定义与继承。

1. let和const

1.1 let声明变量

varlet 关键字的区别:

关键字 是否能重复声明变量 是否有块作用域 是否有变量提升 是否影响顶层对象
var ×
let × × ×

1.let 不允许重复声明变量

// var允许重复声明变量
var a = 10;
var a = 10; 
// let不允许重复声明变量
let a = 10;
let a = 10; // Uncaught SyntaxError: Identifier 'a' has already been declared

2.let 声明的变量有块作用域

// var声明的变量,没有块作用域
if (true) {
   
   
  var a = 10;
  console.log(a); // 10
}

console.log(a); // 10

// let声明的变量,有块作用域
if (true) {
   
   
  let a = 10; 
  console.log(a); // 10
}

console.log(a); // Uncaught ReferenceError: a is not defined

3.let 声明的变量,没有变量提升

/* 由于有变量提升,以下代码会转换成如下:
var a;
console.log(a);
a = 10; */

// var声明的变量,有变量提升
console.log(a); // undefined
var a = 10;

// let声明的变量,没有变量提升
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 10;

4.let 声明的变量,不会与顶层对象挂钩

顶层对象:在broswer环境中,指window对象;在node环境中指global对象

// var声明的变量,会与顶层对象挂钩
var a = 10;
console.log(window.a); // 10
// let声明的变量,不会与顶层对象挂钩
let a = 10;
console.log(window.a); // undefined

1.2 const声明常量

const 拥有 let 的全部特性,与 let 不同的是,const声明的变量是常量,一经声明,无法修改。

1.const声明的变量无法修改

// let声明的变量,可以修改
let a = 10;
a = 20;
// const声明的变量,无法修改
const a = 10;
a = 20; // Uncaught TypeError: Assignment to constant variable

2.const声明的变量必须声明时就初始化

const a; // Uncaught SyntaxError: Missing initializer in const declaration

3.当变量是对象时,虽然不能修改对象名,但是可以修改对象的内部属性

解释:因为对象是引用类型,对象名存的是一个地址,而改变对象的内部属性,并没有改变地址本身。

const obj = {
   
   
  name: "Bill",
  age: 18
};

obj.age = 28;
console.log(obj); // {name: 'Bill', age: 28}

letconst 的使用场景:默认情况下使用 const,在知道变量值需要修改时使用 let

2. 模板字符串

模板字符串:其实就是占位符,这样就可以简化字符串拼接。

1.用于字符串拼接

const name = "Bill";
const age = 18;
const person = `my name is ${
     
     name}, my age is ${
     
     age}`;
console.log(person); // my name is Bill, my age is 18

2.支持使用表达式

// 1.支持四则运算
const a = 10;
const b = 20;
const result = `result is ${
     
     a + b}`;
console.log(result); // result is 30

// 2.支持三元表达式
const isEqual = `结果是${
     
     a === 10 ? "相等" : "不相等"}`;
console.log(isEqual); // 结果是相等

3. 解构赋值

解构赋值:用于赋值运算,可以简化赋值。

3.1 数组的解构赋值

1.简化数组的赋值

const arr = [1, 2, 3];

const [a, b, c] = arr; // 等价于 a=1, b=2, c=3
console.log(a, b, c); // 1 2 3

const [d, , e] = arr; // 等价于 d=1, e=3
console.log(d, e); // 1 3

2.嵌套情况下的数组赋值

const arr = [1, [2, 3, 4], 5];
const [a, [b, c], d] = arr; // 等价于 a=1, b=2, c=3, d=5
console.log(a, b, c, d); // 1 2 3 5

3.2 对象的解构赋值

1.简化对象的赋值

const obj = {
   
   
  name: "Bill",
  age: 18
};

const {
   
    name, age } = obj; // 等价于 name=obj.name, age=obj.age
console.log(name, age); // Bill 18

2.声明的变量名需要与对象的属性名一致时,否则在对象的属性名中匹配不到,得到的值是undefined

对象的解构赋值,变量赋值时会与属性名匹配,不会按照声明变量的前后顺序匹配

const obj = {
   
   
  name: "Bill",
  age: 18,
  addr: "Shanghai"
};

const {
   
    name, addr, a } = obj; // 等价于 name=obj.name, addr=obj.addr
console.log(name, addr, a); // Bill Shanghai undefined

3.嵌套情况下的对象赋值

const obj = {
   
   
  name: "Bill",
  age: 18,
  other: {
   
   
    addr: "Shanghai",
    email: "xxx@163.com"
  }
};

const {
   
   
  name,
  age,
  other: {
   
    email }
} = obj; // 等价于 name=obj.name, age=obj.age, email = obj.other.email
console.log(name, age, email); // Bill 18 xxx@163.com

4. 函数扩展

4.1 参数默认值

参数默认值:不传参时,函数使用默认的参数值,传参后会覆盖默认值。

function fn(a, b = 10) {
   
   
  console.log(a, b);
}

fn(10); // 10 10
fn(10, 20); // 10 20

4.2 剩余参数

剩余参数:也称可变参数,剩余参数语法允许将一个不定数量的参数表示为一个数组。

function fn(a, b, ...args) {
   
   
  console.log(args);
}

fn(10, 20, 30, 40, 50); // [30, 40, 50]

4.3 箭头函数

箭头函数:箭头函数可用于简化匿名函数的定义,使书写更为简洁。

1.无参数、无返回值的箭头函数

// 匿名函数写法,无参数、无返回值
const fn = function () {
   
   
  console.log(100);
};

fn(); 

// 箭头函数写法,无参数、无返回值
const fn = () => {
   
   
  console.log(100);
};

fn();

2.有返回值的箭头函数

// 匿名函数写法,有返回值
const fn = function () {
   
   
  console.log(100);
  return 100;
};

// 箭头函数写法,有返回值

// 1.函数内部只有 return,无其它内容
const fn1 = () => 100; 
const fn2 = () => ({
   
    name: "Bill", age: 18 }); // 返回的是对象时,要使用小括号包裹起来

// 2.函数内部除了有 return,还有其它内容
const fn3 = () => {
   
   
  console.log(100);
  return 100;
};

3.带参数的箭头函数

// 匿名函数写法,带参数
const fn = function (a, b) {
   
   
  console.log(a + b);
  return a + b;
};

// 箭头函数写法,带参数

// 1.只有一个参数时,可以省略括号
const fn1 = a => {
   
   
  console.log(a);
};

const fn2 = a => a;

// 2.带多个参数时,不可省略括号
const fn3 = (a, b) => a + b;

const fn4 = (a, b) => {
   
   
  console.log(a + b);
  return a + b;
};

4.箭头函数没有this

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    
<think>嗯,用户遇到了一个QAC报错,问题出在数组初始化上。让我仔细看看。用户定义了一个uint8类型的数组mcu_result,大小是24,初始化的时候用了{0x00}。这时候编译器会提示数组的初始值比声明的大小少,剩下的元素会用默认值初始化。 首先,我得回忆一下C语言的数组初始化规则。当数组初始化列表中的元素数量少于数组大小时,剩余的元素会被自动初始化为0。所以实际上用户这样的写法是正确的,但QAC可能认为显式初始化更安全,或者公司的编码规范要求必须明确所有元素的初始值。 用户可能是在使用静态代码分析工具QAC,这类工具通常会严格执行某些编码标准,比如MISRA C。MISRA C可能有规定,要求显式初始化所有元素,避免隐式行为带来的不确定性。因此,即使语法正确,工具还是会报错。 接下来,我需要考虑如何修改代码。最直接的办法是把初始化的元素数量补全到24个。但手动写24个0x00太麻烦,可以写成{0},这样编译器会自动填充剩余部分为0,但不确定QAC是否接受这种写法。或者,用户可能需要显式地写出所有24个0,或者用更简洁的方式,比如{0x00}重复24次,但这样代码看起来冗长。 另外,可能用户的环境允许使用设计ated initializer,比如在C99中可以用{0},或者更简洁的写法,但需要确认QAC是否支持这些特性,以及是否符合项目规范。 可能的解决方案包括: 1. 补全所有24个元素,显式初始化为0x00。 2. 使用{0},因为C语言会自动填充剩余为0,但不确定QAC是否接受。 3. 检查QAC的配置或规则是否有例外,可以忽略这种警告,如果确实符合项目规范的话。 需要进一步确认用户使用的编码标准和QAC的具体规则。不过通常来说,补全所有元素是最稳妥的方式,避免静态分析工具报错。但手动写24个0不太实际,可以建议用户使用{0}的方式,或者使用宏来定义数组大小,确保初始化的数量匹配。 最后,用户可能需要根据团队规范来决定是否必须显式初始化所有元素,或者是否允许隐式补零。如果允许,可以调整QAC的规则设置,否则必须修改代码。</think>该问题的原因及修改方法如下: 1. **错误分析**: - 声明了一个24字节的数组`uint8 mcu_result[24]` - 初始化时仅提供了1个元素`{0x00}` - 根据C语言规则,未显式初始化的元素会被置为0,但QAC静态分析工具将此视为不规范编码 2. **解决方案(任选其一)**: **方案一:显式补全初始化** ```c uint8 mcu_result[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; ``` **方案二:使用C99简化写法(需编译器支持)** ```c uint8 mcu_result[24] = {[0 ... 23] = 0x00}; // GCC扩展语法 ``` **方案三:推荐规范写法** ```c uint8 mcu_result[24] = {0}; // 标准C语法,自动填充全0 ``` 3. **附加建议**: - 使用`{0}`初始化是C语言标准做法,所有元素都会被正确置零 - 若必须保持`0x00`形式,建议添加注释说明: ```c uint8 mcu_result[24] = {0x00}; /* QAC_DISABLE: 此处隐式补零符合设计预期 */ ``` - 检查QAC规则配置,确认是否需要调整MISRA-C:2012 Rule 9.3的检查策略 选择方案三`{0}`是最简洁且符合标准的解决方案,既能消除警告,又能保证代码可读性和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值