ES6新特性

本文介绍了JavaScript中的默认参数在ES5和ES6中的实现,以及扩展运算符在对象和数组操作中的应用,包括深拷贝和浅拷贝。此外,还讨论了箭头函数、Promise异步处理和类的使用,以及模板字符串的特性。
摘要由CSDN通过智能技术生成

默认参数

//ES5
function getName(name) {     
    var newName=name!=undefined?name:"张三";//用三元运算符判断
    console.log(newName);
}
getName(0)

//ES6
function getName(name="张三"){
    console.log(name);
}
getName(0);

扩展运算符三个点的使用

扩展运算符作用就是取出对象中所有可遍历的属性,拷贝合并到当前对象之中。可以实现拷贝对象、合并对象。拷贝数组、合并数组

ES5



//浅拷贝  
let obj1 = {a:1,b:2};
let obj2 = obj1;
obj2.a = 3;
console.log(obj1);
console.log(obj2);
//{a:3,b:2}
//{a:3,b:2}

//深拷贝
let obj1 = {a:1,b:2};
let obj2={};
for(let key in obj1){
  obj2[key]=obj1[key];
}
obj2.a = 3;
console.log(obj1);
console.log(obj2);
//{a:1,b:2}
//{a:3,b:2}

ES6

//深拷贝
let obj1={a:1,b:2};
let obj2={...obj1};
obj2.a = 3;
console.log(obj1);
console.log(obj2);

//{a:1,b:2}
//{a:3,b:2}

对象合并

let payload={title:"羊肉串",amount:10,price:2};
let user={uid:1,shop_id:20};
let data={...payload,...user};
console.log(data);

数组拷贝

//浅拷贝(官方文档为浅拷贝,实质为深拷贝)
let arr1[1,2,3];
let arr2[...arr1];
arr1.push(4);
console.log(arr1);
console.log(arr2);
//[1,2,3,4]
//[1,2,3]

数组合并

let arr1=[1,2,3];
let arr2=[4,5,6];
let arrData=[...arr1,...arr2];
console.log(arrData);

案例

let data=[
  {id:1,title:"羊肉串"},
  {id:2,title:"猪肉串"},
  {id:3,title:"牛肉串"},
]let newData=[
  {id:4,title:"啤酒"},
  {id:5,title:"可乐"},
  {id:6,title:"雪碧"},
];
//ES5
for(let i=0;i<newData.length;i++){
  data.push(newData[i]);
}
conselo.log(data);

//ES6
data.push(...newData);
console.log(data);

Object.assign对象的拷贝与合并

Object.assign()方法用于将所有可枚举的值从一个或多个源对象复制到目标对象。它将返回目标对象。如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。和拓展运算符一样可以实现对象的浅拷贝。Object.assign()第一个参数是目标对象,后面参数是源对象。

常见用途:

1.为对象添加属性

2.为对象添加方法

let target={a:1};
let source1={b:2};
let source2={c:3};
Object.assign(target,source1,source2);
conselo.log(target);

//如果目标对象与源对象有同名属性或多个源对象有同名属性,那么后面的属性会覆盖前面的属性
let target={a:1,b:2};
let source1={b:3,c:3};
let source2={c:4};
Object.assign(target,source1,source2);
console,log(target);
//{a:1,b:3,c:4}

//如果只有一个目标对象,直接返回该参数
let target={a:1};
Object.assign(target);
console.log(target);
//{a:1}

//如果目标对象不是一个对象,先转成对象
let abc=Object.assign("abc");
console.log(abc);
console.log(abc[0],abc[1],abc[2]);
//{0:"a",1:"b",2:"c"}
//a b c

//目标对象不能是undefined和null
Object.assign(undefined);
Object.assign(null);

//为对象添加属性
function Person(name,age){
  Object.assign(this,{name,age});
  //相当于  
  this.name=name;
  this.age=age;
}



let person=new Person("张三",20);
console.log(person.name,person.age);
//张三 20

function Person(name,age){
  this.name=name;
  this.age=age;
}

为对象添加方法



//ES5
Person.prototype.say=function(){
  console.log("say()方法")
}
Person.prototype.run=function(){
  console.log("run()方法")
}

//ES6
Object.assign(Person.prototype,{
  say(){
    console.log("say()方法")}run(){
    console.log("run()方法")}
});
person.say();
person.run();

//say()方法
//run()方法

对象字面量扩展

属性初始值的简写

//ES5
let title="VUE";
let price=95;
let book={title:title,price:price};
console.log(book);
//{title:"VUE",price:95};

//ES6
let title="VUE";
let price=95;
let book={title,price};
console.log(book);
//{title:"VUE",price:95};

对象方法的简写

//ES5
let person={
  say:function(){
    console.log("say方法");
  }
}
person.say();
//ES6
let person={
  say(){
    console.log("say方法");
  }
}
person.say();

计算属性名

//属性名出现:-或中文,需要用[]
//ES5
let person={};
let ageAttr="age";
person["first-name"]="四";
person["last-name"]="李"
person[ageAttr]=20;
conselo.log(person);

//ES6
let ageAttr="age";
let person={
  ['first-name']:"四",
  ['first-name']:"李",
  [ageAttr]:20,
}
conselo.log(person);

解构赋值

解构赋值语法是一种Javascript表达式。通过解构赋值。可以将属性/值从对象/数组中取出,赋值给其他变量。

//ES5
let person={
  name:"张三"age:20
};
var name=person.name;
var age=person.age;
console.log(name,age);

//ES6
let person={
  name:"张三"age:20
};
let {name,age}=person;
console.log(name,age);

let name,age;
({name,age}=person);
console.log(name,age);

let {name,age,city='北京'}=person;
console.log(name,age,city);
let name="李四";

实例


let classify={
  title:"菜品",
  children:{
    title:"肉类",
    children:{
      title:"羊肉串"
    }
  }
}
let {children:children{tilte}}=classify;
console.log(title);
//羊肉串

let {...personobj}=person;
console.log(personobj);

数组解构

//ES5
let arr=[10,20,30];
let a=arr[0],b=arr[1],c=arr[2];
console.log(a,b,c);
//10,20,30

//ES6
let arr=[10,20,30];
let [a,b,c]=arr;
console.log(a,,b,c);
//10,20,30
let [,,a]=arr;
//30

let a,b,c;
[a,b,c]=arr;
console.log(a,b,c);
//10,20,30

let arr=[10,20,30];
let [a,b,c,d=40,e]=arr;
console.log(a,b,c,d,e)
//10,20,30,40,undefine

//嵌套数组

let book=['PHP','JAVA',['JavaScript','CSS','HTML']];
let [a,,[,,j]]=book;
console.log(a,j);
//PHP HTML

let [a,,...html]=book;
console.log(a,html);
//PHP Arrar(3)

let [a,,...html]=book;
console.log(a,html[0][0]);
//PHP JavaScript

let [a,,html]=book;
console.log(a,html[0]);
//PHP JavaScript

let [a,,[...html]]=book;
console.log(a,html[0]);
//PHP JavaScript

模块化

模块化的好处:

  1. 避免受污染
  2. 提高代码复用率
  3. 提高维护性
  4. 可以提升执行效率
  5. 避免引入时的层层依赖

导出

//导出  global.js
export let name="张三"
export let age=20;
export const URL="https://www.baidu.com";
//方法
export function getName(){
  return "李四";
}

//导出方式
export{
  name as oldName,/别名,一般不在这
  age,
  URL,
  getName();
}



default.js

let name="张三"let age=20;
export default name;
export default age;// 会报错
//只能单个导出,但是导入可以时随意起名
//多个导出可以使用对象形式

export default{
  name,
  age
}

导入


//导入
<script type="module">
  import {name as oldName,age,URL,getName} from "路径/.js";
  let name="王五";
  
  console.log(name);
  console.log(age);
  console.log(URL);  
  console.log(getName());  

  //导入整个模块
  import * as person from "./global.js"
  console.log(person.name);
  console.log(person.age);
  console.log(person.URL);
  console.log(person.getName);
  

  //default.js  文件导入
  import personName from "./default.js"
  console.log(person.name,person.age);
  person.getName();

</script> 

箭头函数

箭头函数在VUE和React中使用非常频繁,箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或new.target 箭头函数表达式更适用于那些本来需要使用匿名函数的地方,并且它不能作构造函数。

//ES5
function person(){
  console.log("大家好");
}

//ES6
let person=()=>{
  console.log("大家好")}

//return
let person=()=>"大家好"//相当于
function person(){
  return "大家好"; 
}

传参

//传参
let person=(name,age)=>{
  console.log(name,age);
}
person("张三",20);

返回字面量

//返回字面量
let person=()=>({name:"张三",age:20});
console.log(person());

//高阶函数
//ES5
function person(){
  return function(wrap){
    return function(prop){
      console.log(wrap,prop);
    }
  }
}
let person=()=>wrap=>prop=>{
  console.log(wrap.prop);
}
person()('我是wrap')('我是prop');

this指向

//this指向
var person={
  name:"张三",
  getName:function(){
    setTimeout(function(){    //setTimeout指向的是window
      console.log(this);
      console.log(this.name);
    },300);
  }
}

var person={
  name:"张三",
  getName:function(){
    setTimeout(()=>{    //使用箭头函数后this指向上一级
      console.log(this);
      console.log(this.name);
    },300);
  }
}

Promise

Promise就是一个对象,用来传递异步操作的消息。可以解决回调函数的嵌套问题,也就是所谓的“回调地狱”

一个Promise有以下几种状态:

  1. pending:初始状态,既不是成功,也不是失败状态
  2. fulfilled:意味着操作成功完成。
  3. rejected:意味着操作失败
    如果异步操作成功,resolve方法将Promise的状态,从“未完成”变为“成功”(即从pending变为fulfilled)。

如果异步操作失败,reject方法将Promise的状态,从“未完成”变为“失败”(即从pending变为rejected)。

如果执行resolve 方法,对应的会调用then方法,then方法传入一个函数作为参数,该函数的参数的值就是resolve 方法的实参。

如果执行rejected 方法,对应的调用catch 方法,catch 方法传入一个函数作为参数,该函数的参数的值就是reject方法的实参。

let code=200;
let p1=new Promise((resolve,reject)=>{
  setTimeout(()=>{
    if(code=200){
      //执行成功调用resolve函数
      resolve("成功!");
    }else{
      //执行失败调用reject函数
      reject("失败!");
    }
  },300)
});
p1.then((result)=>{
  console.log(result);
}).catch((result)=>{
  console.log(result);
})



class类的使用

ES6引入了Class(类)的概念,作为对象的模板。通过class关键字,可以定义类。可以实现:单例模式、访问器属性、静态方法、extends继承

//ES5
function Person(name,age){
  this.name=name;
  this.age=age;
}
//方法
Person.prototype.show=function(){
  console.log(this.name,this.age);
};
var person=new Person("张三",20);
person.show();

//ES6
class Person{
  //构造函数
  constructor(name,age){
    this.name=name;
    this.age=age;
  }
  //方法
  show(){
    console.log(this.name,this.age);
  }
}
var person=new Person("张三",20);
person.show();

//用表达式的形式来定义
let Person=class(name,age){
  constructor(name,age){
    this.name=name;
    this.age=age;
  }
}
var person=new Person("张三",20);
console.log(person.name);

//单例模式
let Person class{
  constructor(name,age){
    this.name=name;
    this.age=age;
  }
}("张三",20);
console.log(Person.name,Person.age);

//访问器属性
class Person{
  constructor(name,age){
    
  }
}

模板字符串

1. 模板字符串 ``

  • 在模板字符串中, 如果需要写一个字符`,则需要在字符前加上 \
  console.log(`\` `);  // 结果 `

2. 字符串的扩展操作方法

1. includes()

  • 查找指定字符,有返回值
  • 如果能找到返回 true ,找不到返回 false
    let str = 'hellow';
    console.log(str.includes('o'));   // true
    console.log(str.includes('a'));  // false

2. startsWith();

  • 判断 是否以 指定字符开头 返回值是 布尔值
  • 是返回 true 不是则返回 false
    console.log(str.startsWith('h'));    // true
    console.log(str.startsWith('he'));   // true
    console.log(str.startsWith('hel'));  // true
    console.log(str.startsWith('helo')); // false
    console.log(str.startsWith('o'));    // false
    console.log(str.startsWith('w'));    // false

3. endsWith();

  • 判断 是否以 指定字符结尾 返回值是 布尔值
  • 是返回true 不是返回false
    console.log(str.endsWith('h'));    // true
    console.log(str.endsWith('w'));    // false

4. repeat();

  • 将原字符串重复指定次数, 并将新生成字符串返回。
    console.log(str.repeat(2));
    console.log(str.repeat(4));

5. trim();

  • 清除字符串前后空格
    let str1 = ' a b c d e f ';
    console.log(str1);
    console.log(str1.trim());   

6. trimStart();

  • 删除首位空格

7. trimEnd();

  • 删除末位空格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冥王丁B

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值