从零开始学前端---ES6入门

从零开始学前端—ES6入门

1.let 和 const命令

1.let声明变量

1.变量不能重复声明
2.块级作用域(只在代码块中有效)
3.不存在变量提升(不允许在变量声明之前使用变量)
4.不影响作用域链

2.const声明常量

1.常量声明格式
1.一定要赋初始值
2.一般常量使用大写(潜规则,语法要求)
3.常量值不能修改
4.块级作用域
5.对于数组和对象的元素的修改,不算做对常量的修改

在开发过程中默认使用const,在数据需要发生变更时使用let,使用var可能会出现重复变量

3.解构赋值(适用场景:方法的重复调用)

1.数组的解构
const F4 = ['小沈阳''赵四','刘能','宋小宝']
let [xiao,zhao,liu,song] = F4;
2.对象的解构
const zhao = {
    name:'赵本山',
    age:'不详',
    xiaopin:function(){
        console.log('我可以演小品');
    }
};
let {name,age,xiaopin} = zhao;
//从对象获取K对应的值赋值给前面的值
const {name} = zhao;

2.模板字符串

1.声明格式---``
2.内容中可以直接出现换行符
3.变量拼接
	拼接语法:let out = `${xx}xxx`

3.简化对象写法

1.es6 允许在大括号中,直接写入变量和函数,作为对象的属性和方法

4.箭头函数(=>)

1.语法简明

语法:删除funtion关键字,加上=>,没有参数加括号,一个参数可选择,多个参数逗号分隔

2.可以以是返回

3.不绑定this

原因:箭头函数没有自己的this值,在箭头函数定义时就指定了this,就是它的父级this

//声明一个函数
//()写形参
let fn = (a,b) =>{
    //代码体
}

1.箭头函数声明的特性

1.this 是静态的,this 始终指向函数声明时所在作用域的 this 的值
2.不能作为构造函数实例化对象
3.不能使用 arguments 变量
4.箭头函数的简写
1.省略小括号(当形参有且只有一个时)
2.省略花括号(当代码体只有一条语句时),此时return语句必须省略
5.箭头函数的不适用场景

1.作为构造函数,一个方法需要绑定到对象

<script>
    //错误示例
    const Person = (name,points)=>{
        this.name = name;
        this.points = points;
    }
    //正确示例
    const Person = function(name,points){
        this.name = name;
        this.points = points;
    }
    //错误示例
    const Jelly = new Person('jelly',5);
	Person.prototype.updatePoints = () =>{
        //this指向时window
        this.points++;
        console.log(this.points)
    }
    //正确示例
    const Jelly = new Person('jelly',5);
	Person.prototype.updatePoints = function(){
        this.points++;
        console.log(this.points)
    }
</script>

2.当真的需要this的时候

<script>
    //错误示例 this指向window
	const button = document.querySelector('.zoom');
	button.addEventListener('click',()=>{
        this.classList.add('in');
        setTimeout(()=>{
            this.classList.remove('in');
        },2000);
    })
	//正确示例
	const button = document.querySelector('.zoom');
	button.addEventListener('click',function(){
        this.classList.add('in');
        //正确
        setTimeout(()=>{
            this.classList.remove('in');
        },2000);
        //错误
        setTimeout(function(){
            //this指向window
            this.classList.remove('in');
        },2000);
    })
</script>

3.需要使用arguments对象

//错误
const sum = () =>{
    return Array.form(arguments)
    			.reduce((prevSum,value)=>prevSum+value,0)
}
//正确
const sum = function() {
    return Array.form(arguments)
    			.reduce((prevSum,value)=>prevSum+value,0)
}

5.函数参数的默认值

es6允许给函数参数赋初始值

1.形参初始值,具有默认值的参数,一般位置靠后
function add(a,b,c=10){
    return a+b+c;
}
let result = add(1,2);
2.与解构赋值结合

6.Symbol

Symbol:原始数据类型,表示独一无二的值,主要用来定义对象的唯一属性名

7.Map 和Set

1.map对象

Map对象保存键值对。任何值(对象或者原始值)都可以作为一个键或一个值。

Maps和objects的区别
  1. 一个Object的键只能是字符串或者Symbols,但一个Map的键可以是任意值。
  2. Map中的键值是有序的(FIFO原则),而添加到对象中的键则不是。
  3. Map的键值对个数可以size属性获取,而Object的键值对个数只能手动计算。
  4. object都有自己的原型,原型链上的键名可能和你自己在对象上设置的键名产生冲突。
Map的迭代

for…of

let myMap = new Map();
myMap.set(0,"zero");
myMap.set(1,"one");
for (let [key,value] of myMap){
    console.log(key + "=" + value)
}

forEach()

let myMap = new Map();
myMap.set(0,"zero");
myMap.set(1,"one");
myMap.forEach(function (value,key){
    console.log(key +"=" + value)
},myMap);

2.Set对象(相当于java中的set,起去重复的作用)

8.for循环

1.for of循环

目前不支持对象

const fruits = ['Apple','Banana','Oragnge','Mango'];
for(let fruit of fruits){
    //支持循环终止和跳过
    if(fruit === 'Oragnge'){
        //break;
        continue;
    }
    //得到属性值
}

//使用示例
for(let fruit of fruits.entries()){
    //同时得到索引值和value值
}

2.for in循环(遍历对象上所有的可枚举属性)

const fruits = ['Apple','Banana','Oragnge','Mango'];
for(let fruit in fruits){
    //得到属性名
}

9.Array.from() and .of

1.Array.from()

1.可以将内数组转换为数组,调用map方法得到值

const todos = document.querySelectorAll('li');
const names = Array.from(todos,todo=>todo.textContent);
  1. arguments内数组对象转换为数组

    function sum(){
        return Array.from(arguments).reduce((prev,curr)=>prev+curr,0);
    }
    
    

等。。。。

2.Array.of()

返回由参数组成的数组(保证返回结果的一致性)

10.数组中的新方法

1、.find()

获取数组中某一个满足条件的值

const inventory = [
    {name:'apples',quantity:2},
    {name:'bananas',quantity:0};
    {name:'cherries',quantity:5};
]

const bananas = inventory.find(fruit=>{
    if(fruit.name === 'bananas'){
        return true
    }
    return false
})
//简写
const bananas = inventory.find(fruit=>fruit.name === 'bananas')

2、.findIndex()

获取数组中元素的索引

const inventory = [
    {name:'apples',quantity:2},
    {name:'bananas',quantity:0};
    {name:'cherries',quantity:5};
]

const bananas = inventory.findIndex(fruit=>fruit.name === 'bananas')

3、.some()

如果元素满足返回true,不会执行后面的操作

const inventory = [
    {name:'apples',quantity:2},
    {name:'bananas',quantity:0};
    {name:'cherries',quantity:5};
]

const isEnough = inventory.some(fruit=>fruit.quantity > 0)

4、.every()

当所有元素满足返回true,当有一个元素为false,返回false ,不执行后面的操作

const inventory = [
    {name:'apples',quantity:2},
    {name:'bananas',quantity:0};
    {name:'cherries',quantity:5};
]

const isAllEnough = inventory.every(fruit=>fruit.quantity > 0)

11.剩余参数

应用场景:

1.对函数参数的处理

function sum(...numbers){
    return numbers.reduce((prev,curr)=> prev + curr, 0)
}

sum(1,2,3,4)

2.变量的解构

const player = ['jelly',123,5.4,6.7,3.4,7.8]

const[name,id,...scores] = player;

12.拓展运算符

把可遍历对象的元素扩展为一个新的参数序列,

const youngers = ['George','John','Thomas'];

const olders = ['James','Adrew','Martin'];

//数组整合
const members = youngers.concat(olders);

//扩展运算符
let members = [...youngers,...olders];
//添加元素
let members = [...youngers,'Mary',...olders];

13.运算符的扩展

1.指数运算符(**)

//**(相当于2的多少次方)
2**2
//=**(新的赋值运算符)
let a = 10;
a=**2 //等同于 a = a * a

2.链判断运算符(?.)

//message?.body?.firstname如果不存在,则firstName等于default
const firstName = message?.body?.firstname || 'default'

3.Null判断运算符

// ||运算符
//如果response.seettings.headerText为Null或undefined,则显示默认值
//如果属性值为字符串或false或0,默认值不会生效
const headerText = response.seettings.headerText || 'hello,world'
//??运算符(只有在运算符左侧的值为NUll或undefined,才会返回右侧的值)
const headerText = response.seettings.headerText ?? 'hello,world'

14.Promise

就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果 。可以理解为对异步编程的一个反馈

1. .then() .catch (事件监听)
let username;
const usersPromise = axios.get('https://api.github.com/users')
// 监听usersPromise
usersPromise.then(reponse=>{
    username = reponse.data[0].login;
    return axios.get(`https://api.github.com/users/${username}/repos`)
}).then(repose =>{
    console.log(repose.data)
})
//监听错误的发生
.catch(err =>{
    console.log(err)
})

版权声明:本文为qq_56730681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。