理解es6

阅读数:206 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、使用let声明变量

1、与使用var声明变量的区别

(1)变量不能重复说明

(2)不存在变量提升(在执行function函数之前,所有变量都会被提升至函数作用域顶部)

(3)存在块级作用域(不允许外部使用内部的变量)

(4)存在暂时性死区(赋值之前不允许访问,即在预编译的时候不允许访问)

2、let和var在for中的区别

for(var I=0;i<10;i++){
}
//在for语句中用var 声明的 i 实际上是全局变量

for(let j=0;i<10;i++){
}
//用let声明的 j 在每一次循环的时候都会形成块级作用域,生成一个新的i,彼此之间互不干扰

二、const修改的也可变

声明之后不允许修改(实际上并不是不允许修改变量的值,而是不允许修改变量指向的内存地址)

三、函数bind的用法

函数.bind(this指向,[函数参数])

会返回一个新的函数,新函数的this指向bind的第一个参数。

function demo(name,age){
}
var fn1=demo.bind(obj,'ls',18)

四、export default和export的区别

1、export与export default均可用于导出常量、函数、文件、模块等。

2、你可以在其它文件或模块中通过import+(常量|函数|文件|模块)名的方式,将其导入,以便能够对其进行使用。

3、在一个文件或模块中,export、import可以有多个,export default仅有一个

4、通过export方式导出,在导入时要加{},export default则不需要。

五、末尾的逗号

JS一开始就允许给数组的末尾加逗号,ES5开始允许给对象末尾加逗号,ES2017允许给函数参数末尾加逗号,json末尾也可以加逗号。

六、Promise对象

这是ES6引入的封装异步操作的统一接口。Promise本身是一个构造函数,提供了resolve和reject两个方法,一旦异步操作成功结束,就调用resolve方法,一旦异步操作失败,就调用reject方法。

1、Promise的基本语法如下:

let promise = new Promise(function(resolve, reject) {
  // 异步操作的代码...

  if (/* 操作成功 */) {
    resolve(value); // 将promise的状态从"pending"变为"fulfilled",并传递"成功值"
  } else {
    reject(error); // 将promise的状态从"pending"变为"rejected",并传递"错误原因"
  }
});

2、then、catch、finally

你可以使用.then()方法来设置当Promise被兑现(或拒绝)时应该执行的回调函数:

promise.then(
  function(value) { /* 成功时执行的函数 */ },
  function(error) { /* 失败时执行的函数 */ }
);

如果你只想处理拒绝状态,可以使用.catch()方法:

promise.catch(function(error) {
  // 处理拒绝的情况
});

而为了在异步操作完成后执行一些无论成功还是失败都要执行的代码,可以使用.finally()方法:

promise.finally(function() {
  // 无论成功还是失败,都会执行的代码
});

3、静态方法

(1)Promise.resolve(value)

返回一个以给定值解析后的 Promise 对象。

(2)Promise.reject(reason)

返回一个以给定原因拒绝的 Promise

(3)Promise.all(iterable)

返回一个 Promise 实例,此实例在 iterable 参数内的所有 Promise 都“成功完成(fulfilled)”时完成,或者在任何一个 Promise 失败(即被拒绝)时失败。

(4)Promise.allSettled(iterable)

返回一个在所有给定的 Promise 都已经兑现(fulfilled)或拒绝(rejected)后的 Promise,并带有一个对象数组,每个对象表示对应的 Promise 结果。

(5)Promise.race(iterable)

返回一个 Promise,它将与第一个传递的 Promise 相同的完成(fulfillment)或失败(rejection)的结果。

(6)Promise.any(iterable)

返回一个 Promise,一旦 iterable 中的任何一个子 Promise 完成(fulfilled),就返回那个 Promise 的结果。如果所有的 Promise 都失败(rejected),那么返回的 Promise 将是失败的。

七、module

es6意义最大的语法变化,就是引入模块。

一个模块内部,使用export命令转出对外的接口。

// lib/math.js
export function sum(x, y) {
  return x + y;
}
export var pi = 3.141593;

上面的模块输出了sum和pi两个接口。

import命令用于引入该模块。

// app.js
import * as math from "lib/math";
alert("2π = " + math.sum(math.pi, math.pi));

八、箭头函数

任何使用function的地方,都可以使用箭头函数,其调用和普通函数一样。与function不同的是,在箭头函数这种的this是指向当前宿主对象。

//1. 标准情况下
var fn=(形参1,形参2)=>{ 函数体 }

//2.当只有一个变量时,可以省略()
var fn2=info=>{ 函数体 }

//3.函数体只有一个表达式的时候,省略{},此时函数隐藏return,但尽量不要隐藏{},可读性差
var fn3=()=>唯一函数体
var fn4=(age)=>age+1;

JavaScript 中引入箭头函数(Arrow Functions)主要是为了提供一种更简洁的函数写法,并解决一些传统函数表达式存在的问题。箭头函数在 ES6(ECMAScript 2015)中被添加到 JavaScript 语言规范中,它们具有几个主要优点:

1、更短的语法

箭头函数提供了一种更简洁的方式来写函数表达式。不需要使用 function 关键字,也可以避免使用花括号和 return 关键字(在单个表达式的情况下)。

// 传统函数表达式
const add = function(a, b) {
    return a + b;
};

// 箭头函数
const add = (a, b) => a + b;

2、this的词法绑定

在传统的函数表达式中,this 关键字的值取决于函数是如何被调用的,这可能会导致一些混乱。箭头函数没有自己的 this,它们会捕获其所在上下文的 this 值,使得 this 的行为更加可预测。

function Timer() {
    this.seconds = 0;
    setInterval(() => {
        this.seconds++; // `this` 指向 Timer 实例
    }, 1000);
}

3、没有自己的arguments对象

传统的函数有自己的 arguments 对象,而箭头函数没有。箭头函数可以访问外围函数的 arguments 对象,或者使用剩余参数语法(...args)来获取参数。

const joinArgs = (...args) => args.join(', ');

4、不可以作为构造函数

箭头函数不能用作构造函数,它们没有 prototype 属性,也不能使用 new 关键字调用。

5、没有new.taqrget

在箭头函数内部,new.targetundefined,因为箭头函数不能通过 new 关键字调用。

九、字符串的拼接

一般情况下,我们使用的字符串拼接方式都是‘+’,但当有大段代码且包含html标签,就是用模版拼接(反引号``)

str1='星期六';
str2='吃火锅';
var str='当下是${str1},适合去${str2};'

在字符串模板中还可以使用函数

function fn(){
return '天气好,适合吃火锅';
}
var str='${fn()}'

十、解构函数

//1. 将数组的元素,赋值给相应的变量.变量和元素之间是位置对应关系。
var books=['A','B','C','D'];
let[b1,b2,b3,b4]=books;

//2. 将对象的元素,赋值给相应的变量.变量必须是对象中的属性名或者是方法名
var {name,age}={name:11,age:22}

十一、...的用法(扩展运算符)

//在数组前面时,将数组展开
var str=[1,3,5,6]
console.log(...str); //输出1,3,5,6

//将形参合并为数组
fn1('zs','li',18)
function fn1(...arr){
    console.log(arr); // 输出["zs","li",18]
}

//在对象中可以展开属性
var obj={
    name:'ls',
    age:18,
}
var obj1={...obj,money:1000}
console.log(obj1)    //{name:'ls',age:18,money:1000}

1、扩展运算符的深浅拷贝

(1)如果数组或对象中的元素只是简单类型,一层对象或者数组,就是深拷贝

let staff1 = {name: 'xiaohong',age: 27};
let staff2 = {...staff};
staff2.name = 'xiaoming'
staff1 : {name: 'xiaohong',age: 27}
staff2:{name: "xiaoming", age: 27}

(2)如果数组或对象中的元素是复杂类型,就是浅拷贝

let aa = {
age: 18,
name: 'aaa',
    address: {
        city: "hangzhou"
    }
}
 
let bb = {...aa}
bb.address.city = 'shanghai'
 
 
aa: {
        age: 18,
        name: 'aaa',
        address: {
            city: 'shanghai'
        }
    }
 
bb: {
        age: 18,
        name: 'aaa',
        address: {
            city: 'shanghai'
        }
    }



相关推荐

一、基本用法 Object.assign方法用于对象的合并,将源对象的所有可枚举属性复制目标对象。 <

一、script标签属性 async 表示立即下载该脚本,但不妨碍页面中的其他操作,只对外部文件有效。 charset 与src属性一起使用,告诉浏览器用来编码这个javascript程序的

ECMAscript 5添加了第二种运行模式:严格模式(strict mode)。 //针对单个脚本 <script>   "use strict";   console.log("这是严格模式

因为map的key可以为任何类型, 包括对象. 但是JSON语法, key只能为string. 所以不能直接对JSON.stringify(Map). 1.但是可以先把map转换为

Javascript中, !表示运算符"非", 如果变量不是布尔类型, 会将变量自动转化为布尔类型

一、forEach 如果不做特殊处理,一般情况下,不会break的。如果需要中途跳出循环,建议直接用for语句。 <pre class="language-javasc

一、window对象 在javascript中,一个浏览器窗口就是一个window对象,window对象以及这些子对象,由于都是用于操作浏览器窗口,所以我们又称为BOM(Browser Object

Math.random()方法会返回介于0(包含)~1(不包含)之间的一个随机数。 舍掉小数点后的数值的方法有很多,如parseInt(),Math.ceil(),Math.flo

一、async 将不是Promise对象的返回值封装,如果有返回值返回为resolved的Promise,如果没有返回值,则返回rejected的Promise。 1、异步函数的返回值 (1)如果是普

一、概述 所有语言中的代理,其本实现的是对原对象的操作的拦截和一些自定义行为。 二、语法  const p = new Proxy(target, handler) 1、target 可以是任何类型的