352 ES6语法:let与const,字符串新方法,对象简写,函数默认参数(备胎),箭头函数

let与const

ES6中提供了两个声明变量的关键字:const和let


let的使用

ES6 新增了let命令,用来声明变量。它的用法类似于var

  • let声明的变量只有在当前作用域有效
{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1
  • 不存在变量提升
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
  • 不允许重复声明
let a = 10;
let a = 1;//报错 Identifier 'a' has already been declared
// let  const 定义变量 关键字
// var 定义变量 


// var num = 100;

// // function num() {
// //     console.log('你好');
// // }
// function num() {
//     console.log('你好');
// }

// console.log(num);



// 1000行代码
// console.log(num);


// var num = 100;

// // 1000行代码 
// console.log(num);


// let定义变量   
// 特点:
// 1- 变量不会提升(先定义后使用)
// 2- 变量不能重复定义 
// 3- let const定义的变量都是块级作用域  {}


// 变量不会提升
// console.log(num);

// let num = 100;
// console.log(num);

// 变量不能重复定义 

// let num = '呵呵';
// function num  () {}


// let 定义的变量都是块级作用域
// var 之前: 全局作用域  函数作用域 
// {}就是一个块 
let num = 10;
if (num > 5) {
    // var test = '测试数据';
    let test = '测试数据1';
    console.log(test);    
}
// console.log(test);
// let练习题
// for循环 用定时器每秒钟输出一个i的值
// for (var i = 0; i < 10; i++) {
//     (function (i) {
//         setTimeout(function () {
//             console.log(i);
//         }, i*1000)
//     })(i);
// }
// var i = 0; //全局的i
// for (; i < 10; i++) {
//     setTimeout(function () {
//         console.log(i);        
//     }, i * 1000);
// }



for (let i = 0; i < 10; i++) {
    setTimeout(function () {
        console.log(i);        
    }, i * 1000);
}

// 伪代码
for (var i = 0; i < 10; i++)
{ 
    let i = 0;
    setTimeout(function () {
        console.log(i);        
    }, i * 1000);
}

{ 
    let i = 1;
    setTimeout(function () {
        console.log(i);        
    }, i * 1000);
}

{ 
    let i = 2;
    setTimeout(function () {
        console.log(i);        
    }, i * 1000);
}
{ 
    let i = 3;
    setTimeout(function () {
        console.log(i);        
    }, i * 1000);
}
// 。。。。

const的使用

const声明一个只读的常量。常量:值不可以改变的量

  • const声明的量不可以改变
const PI = 3.1415;
PI = 3; //报错
  • const声明的变量必须赋值
const num;
  • 如果const声明了一个对象,仅仅保证地址不变
const obj = {name:'zs'};
obj.age = 18;//正确
obj = {};//报错
  • 其他用法和let一样
1. 只能在当前代码块中使用
2. 不会提升
3. 不能重复

let与const的使用场景

1. 如果声明的变量不需要改变,那么使用const
2. 如果声明的变量需要改变,那么用let
3. 学了const和let之后,尽量别用var

ES6语法 - 字符串新方法

  1. startsWith()  是否以谁开头  布尔类型
  2. endsWith()   是否以谁结尾
  3. includes()     是否包含

let str = "abcdef"
console.log(str.startsWith('ab'));  // true
console.log(str.startsWith('bb'));  // false
console.log(str.endsWith('ef'));    // true
console.log(str.endsWith('ff'));    // false
console.log(str.includes('ab'));    // true
console.log(str.includes('bc'));    // true

ES6语法- 对象简写

1- 在对象中,如果属性名和变量名相同的话,可以省略一个
2- 在对象中,方法也可以简写, 不写function

    let name = 'zs'
    let age = 18 

    // 在对象中,如果属性名和变量名相同的话,可以省略一个
    // 在对象中,方法也可以简写

    let obj = {
      name: name,
      age: age
    }

    let obj = {
      gender: '男',
      name,
      age
    }
    
    // 在对象中的方法可以简写
    // 不写function
    let obj = {
      // say: function () {}
      say(n1) {
        console.log(n1)
      },
      goodBye() {
        console.log('byebye')
      }
    }
    
	//调用
    obj.say(1)
    obj.goodBye()


ES6语法-函数默认参数(备胎)

 es6的函数允许直接传递默认参数
 当调用函数未传递参数时会使用默认参数

// 函数在定义同时可以设置默认参数
// function add(n1, n2) {
//     n1 = n1 || 0;
//     n2 = n2 || 0;
//     console.log(n1+n2);    
// }

// 用户不传参数是 取默认值进行运算
function add(n1 = 0, n2 = 0) {
    console.log(n1 + n2);
    
}

add(); // 0
add(1); // 1
add(1, 2); // 3

ES6语法-箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头:


基本使用

var fn = function(x, y) {
    console.log(x + y);
}

相当于
//语法: (参数列表) => {函数体}
var fn = (x, y) => {
    console.log(x + y);
}
// =>  箭头函数  在定义函数时 使用  箭头进行定义
// 箭头函数 就是一个函数表达式  
// let 变量名 = function (参数) {函数体}
// 箭头函数定义: 
// let 变量名 = (参数) => {函数体}

// let add = function (n1, n2) {
//     console.log(n1 + n2);
// }

// let add1 = (n1, n2) => {
//     console.log(n1 + n2);
// }


// add1(100, 50);

//big 接受一个参数, 返回这参数2倍

let big = (n1) => {
    return n1 * 2;
}

console.log(big(50));


参数详解

  • 如果没有参数列表,使用()表示参数列表
var sum = () => {
    console.log('哈哈')
};
// 等同于:
var sum = function() {    
    console.log('哈哈')
};
  • 如果只有一个参数,可以省略()
// 等同于:
var sum = function(n1) {    
    console.log('哈哈')
};

var sum = n1 => {
    console.log('哈哈')
};

  • 如果有多个参数,需要使用()把参数列表括起来
var sum = function(n1, n2) {    
    console.log('哈哈')
};

var sum = (n1, n2) => {
    console.log('哈哈')
};
let add = function (n1, n2) {
    console.log(n1 + n2);    
}

let big = function (n1) {
    console.log(n1 *2 );    
}


let add1 = (n1, n2) => {
    console.log(n1 + n2);    
}

let big = n1 => {
    console.log(n1 * 2);
}

let big = n1 => console.log(n1 * 2);

返回值详解

  • 如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来
var sum = function(n1) {    
    console.log('哈哈')
};

var sum = n1 => {
    console.log('哈哈')
};
  • 如果函数体只有一行一句,并且需要返回这个值,那么可以省略{}和return
var fn = function(n1, n2) {
    return n1 + n2;
}

var fn = (n1, n2) => n1 + n2;
// let add = function (n1, n2) {
//     return n1 + n2;    
// }

// let big = function (n1) {
//     console.log(n1 * 2); 
//     return n1 * 2;
// }

// let big2 = function (n1) {    
//     return n1 * 2;
// }


// let add = (n1, n2) => {
//     return n1 + n2;
// }

let add = (n1, n2) => n1 + n2;

let big = n1 => {
    console.log(n1 * 2);
    return n1 * 2;
}

let big2 = n1 => n1 * 2;

// console.log(big2(100));


let test = () => {
    console.log(this); // {}
}

test();

箭头函数练习

  1. 有一个数组[1,3,5,7,9,2,4,6,8,10],请对数组进行排序
  2. 有一个数组['a','ccc','bb','dddd'],请按照字符串长度对数组进行排序
  3. 有一个数组,[57,88,99,100,33,77],请保留60分以上的成绩,返回一个新的数组
// let arr = [11, 22, 33, 44, 55]; 
//把数组所有的元素放大1倍 
// arr = arr.map(function (v, i, arr) {
//     return v * 2;
// })
// arr = arr.map(function (v) {
//     return v * 2;
// })

// arr = arr.map( (v) => {
//     return v * 2;
// })

// arr = arr.map(v => v * 2);
// console.log(arr);


// 2-有一个数组,[57,88,99,100,33,77],请保留60分以上的成绩,返回一个新的数组
let score = [57, 88, 99, 100, 33, 77];
// let r = score.filter(function (v) {
//     return v > 60;
// });
let r = score.filter(v => v > 60);
// console.log(r);

// 有一个数组[1,3,5,7,9,2,4,6,8,10],请对数组进行排序
let arr = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10];

// arr = arr.sort(function (a, b) {
//     return a - b;  // 如果 返回大于 0  会互换位置, 否则不就不换位置 
// })

arr = arr.sort((a, b) => b - a);

// console.log(arr);

// 有一个数组['a','ccc','bb','dddd'],请按照字符串长度对数组进行排序
let str = ['a', 'ccc', 'bb', 'dddd'];
// str = str.sort(function (a, b) {
//     return a.length - b.length;
// })

str = str.sort((a, b) => a.length - b.length);
console.log(str);

箭头函数的注意点

  1. 箭头函数内部没有this,因此箭头函数内部的this指向了外部的this最近的外部的this】。
  2. 箭头函数不能作为构造函数,因为箭头函数没有this。

【定义一个对象,定时器打招呼】

PS:箭头函数刚开始用,肯定会有点不习惯,但是任何东西都有一个习惯的过程,慢慢接受就好,多用,多练

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>
        <div></div>
    </div>
    <script>
        //   function say () {
        //       console.log(this);
        //   }
        //   say();

        //   let hi = () => {
        //       console.log(this);          
        //   }
        //   hi();


        var obj = {
                name: '哈哈',
                age: 18,
                // say: function () {
                //     console.log(this.name);
                //     console.log(this);
                //     var that = this;
                //     setTimeout(function () {
                //         console.log(this);
                //         console.log(that.age);
                //     }, 1000);
                // }, 
                hi: function() {
                    // this --> obj
                    setTimeout(() => {
                        console.log(this); // obj对象
                        console.log(this.age); // 18
                    }, 1000);
                }
            }
            // obj.say();
        obj.hi();
    </script>
</body>

</html>
原文地址:https://www.cnblogs.com/jianjie/p/12434889.html