ES6学习笔记

图片来源:https://ss2.bdstatic.com

let与var

  • 同一个作用域里,如果命名重复的话,var后者会覆盖掉前者,而let会报错
// var直接覆盖
var temp = 1;
console.log(temp);  // 1
var temp = 2;
console.log(temp);  // 2
// let报错
let temp = 1;
console.log(temp);
let temp = 2;
console.log(temp); // Uncaught SyntaxError: Identifier 'temp' has already been declared
  • var只有全局作用域和函数作用域,let相较于var增加了块作用域
var name1 = 'aaaaa';
while (true) {
    var name1 = 'bbbbb';
    console.log(name1); // bbbbb
    break;
}
console.log(name1);  // bbbbb, while里的name1值覆盖了外面所定义的name1值
let name2 = 'aaaaa';
while (true) {
    let name2 = 'bbbbb';
    console.log(name2); // bbbbb
    break;
}
console.log(name2) // aaaaaa, while里的name2值不会覆盖外面所定义的name2值
  • let解决了var的变量泄露问题,var一般使用闭包来解决这个问题
var a1 = [];
for (var i = 0; i < 10; i++) {
    a1[i] = function () {
        console.log(i);
    };
}
a1[6]();  // 10
a1[3]();  // 10
let a2 = [];
for (let i = 0; i < 10; i++) {
    a2[i] = function () {
        console.log(i);
    };
}
a2[6](); // 6
a2[3](); // 3

const

  • 同一个作用域里,如果命名重复的话会报错,不同作用域里会不影响
for(var i = 0; i < 2; i++){
    const PI = Math.PI; 
    console.log(PI);  // 3.141592653589793
}
const PI = 3.14;
console.log(PI); // 3.14
  • const定义常量,值不能改变
const PI = Math.PI;
PI = 23; // Uncaught SyntaxError: Identifier 'PI' has already been declared
  • const允许变量赋值
let te1 = 1;
const text = te1;
console.log(text); // 1
te1 = 2;
console.log(text); // 2
  • const的实际用途
// 定义常量
const PI = Math.PI;
// 定义函数
const fun1 = () => {
    ...
}
// 命名空间
const GLOBAL = {}
GLOBAL.namespace = function (str) {
        var arr = str.split('.'),
    o = GLOBAL;
    for(let i = (arr[0] === 'GLOBAL') ? 1 : 0; i < arr.length; i++){
            o[arr[i]] = o[arr[i]] || {};
            o = o[arr[i]];
    }
};

面向对象

  • class, extends, super
function Point(x, y) {
    this.x = x;
    this.y = y;
}
Point.prototype.toString = function () {
    return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
//定义类
class Point {
    constructor(x, y) {    //constructor 构造方法
        this.x = x;
        this.y = y;
    }
    toString() {
        return '(' + this.x + ', ' + this.y + ')';
    }
}
var p = new Point(1, 2);

arrow function 箭头函数

  • 简化代码,指向使用时所在的对象。
  • 解决了 this 指向乱跑的问题。
  • 备注
    • 如果只有一个参数时 () 可以省略
    • 如果只有一个return时 {}return 可以省略
function test1(x, y) { 
    x++;
    y--;
    return x + y;
}
const test2 = (x, y) => {
    x++; 
    y--; 
    return x+y
}
function test3(x) => {
    return x * 3;
}
const test4 = x => x * 3;
  • 实例
<div class="red">
    <div class="blue">
    </div>
</div>
<script type="text/javascript">
    $('.red').on('click', clickEvent);
    function clickEvent(){
        var that = this;
        //$(this).text();
        console.log(this);
        // $(this).text('被点击了');
        setTimeout(function(){
            $(that).text('被点击了');
            console.log(this);
        }, 1000);
        setTimeout(() => {
            $(this).text('被点击了');
            console.log(this);
        }, 1000);
    }
    // function clickEvent(){
    //  var that = this;
    //  console.log(this);
    //  changeEvent();
    //  function changeEvent(){
    //      console.log(this);
    //      $(that).find('.blue').css('background-color', 'yellow');
    //  }
    //  const changeEvent = () => {
    //      $(this).find('.blue').css('background-color', 'yellow');
    //  }
    // }
</script>

string 字符串

新方法

  • startsWith
  • endsWith

template string 字符串模板

<div id="result1"></div>
<div id="result2"></div>
let basket = {
    count: 5,
    onSale: 4
};
$("#result1").append(
    "There are <b>" + basket.count + "</b> " +
    "items in your basket, " +
    "<em>" + basket.onSale +
    "</em> are on sale!"
);
$("#result2").append(`
    template string:
    There are <b>${basket.count}</b> items
    in your basket, <em>${basket.onSale}</em>
    are on sale!
`);
className="";
className={`class1 clsaa2`};

destructuring 解构赋值

  • 简化代码
  • 注意
    • 等号两边结构必须一样
    • 声明和赋值不能分开
let cat = '喵喵';
let dog = '旺财';
let zoo1 = {cat: cat, dog: dog};
console.log(zoo1);  // {cat: '喵喵', dog: '旺财'}
let zoo2 = {cat, dog};
console.log(zoo2);  // {cat: '喵喵', dog: '旺财'}
let { type, many} = {type: 'animal', many: 2};
console.log(type, many); // animal 2

default,rest

  • 给参数一个默认值 type = 'cat' ,之前都是用 type = type || 'cat' 实现
  • rest 用于收集剩余的参数
  • rest 也可用于数组展开
  • rest 必须是最后一个形参
function todo(type = 'cat', b , ...arg){
    console.log(type, b, arg);
}
todo(undefined, '123', [1,2,3], 12); // cat 123 [[1, 2, 3], 12]

数组处理

map 映射(一对一)

// 统一用 arr 做例子
let arr = [
    { name: '张三', score: 30 },
    { name: '李四', score: 96 },
    { name: '喵喵', score: 59 },
];
const introduce = arr.map(val => `${val.name}考了${val.score},${val.score < 60 ? '不' : ''}及格`);
console.log(introduce.join(';')); // 张三考了30,不及格;李四考了96,及格;喵喵考了59,不及格

reduce 汇总(多对一)

  • 形参
    • tmp 中间结果
    • item 本次数据
    • index 下标,从1开始
const max = arr.reduce((tmp, item, index) => {
    console.log(tmp, item, index);
    // {name: "张三", score: 30} {name: "李四", score: 96} 1
    //  {name: "李四", score: 96} {name: "喵喵", score: 59} 2
    return tmp.score > item.score ? tmp : item;
});
console.log(`${max.name}考的分数最高,最高分为${max.score}`); // 李四考的分数最高,最高分为96

filter 过滤

const noPass = arr.filter(val => {
    return val.score < 60;
});
console.log(`${noPass.map(v => v.name)}未及格,需要请家长`); // 张三,喵喵未及格,需要请家长

forEach 迭代

  • 简化代码,但是不能在forEach中使用breakcontinuereturn关键字
arr.forEach((val) => {
    console.log(val); 
    // { name: '张三', score: 30 },
    // { name: '李四', score: 96 },
    // { name: '喵喵', score: 59 },
});

for-in与for-of

for-in是为普通对象设计的,适用于遍历得到字符串类型或者对象的键,而不适用于数组遍历。
在使用for-in遍历数组时会出现以下问题:

  1. for(let k in arr)k的值不是数字而是字符串"0"、"1"、"2"
  2. for-in循环体除了遍历数组元素外,还会遍历自定义属性,甚至连数组原型链上的属性都能被访问到
  3. 在某些情况下,for-in可能按照随机顺序遍历数组元素

由于在使用for-in遍历数组会出现一些问题,所以ES6增加了for-of: 语法简洁,修复for-in的问题,可以使用breakcontinuereturn关键字(相比于forEach)

let arr = ['1', '2', '3'];
for(let i of arr){
    console.log(i);
}
  • 支持遍历DOM NodeList(for-in遍历得到的并不是子节点)
<div id="parent">
    <span>1</span>
    <span>2</span>
    <span>3</span>
    <span>4</span>
    <span>5</span>
</div>
<script>
    let parent = document.getElementById('parent');
    let child_nodes = parent.childNodes;
    for(let node of child_nodes){  
        console.log(node);
    }
    // 相当于
    for(let i = 0; i < child_nodes.length; i++){
        console.log(child_nodes[i]);
    }
</script>
  • 支持字符串的遍历,会把字符串作为一组 Unicode 的字符进行遍历(for-in也可以做到)
for (var ch of "123") {
    console.log(ch);
}
  • 还支持应用于 Map 和 Set 对象(Map 和 Set 对象还没研究,暂搁)

  • 注意: for-of并不适用于处理原有的原生对象(包括JSON对象),处理原有的原生对象时可以使用for-in或者内置的Object.keys()

let obj = {
    name: '张三',
    age: 12
}
for(let key in obj){
    console.log(key, obj[key]);
}
for (var key of Object.keys(obj)) {
    console.log(key, obj[key]);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 《ECMAScript6 入门》阮一峰 读书笔记 let和constlet声明的变量仅在块级作用域内有效,var声...
    亲爱的孟良阅读 720评论 1 2
  • ECMAScript 6.0( 以下简称ES6) 是JavaScript语言的下一代标准。 ECMAScript和...
    EarthChen阅读 440评论 0 0
  • 什么是ES6? ECMAScript 6.0 是继ECMAScript 5.1 之后 JavaScript 语...
    多多酱_DuoDuo_阅读 1,096评论 0 4
  • 强大的for-of循环 ES6不会破坏你已经写好的JS代码。目前看来,成千上万的Web网站依赖for-in循环,其...
    Awe阅读 7,515评论 2 7
  • 第一章 块级作用域绑定 let 和 const 都是不存在提升,声明的都是块级标识符都禁止重声明 每个const声...
    NowhereToRun阅读 1,586评论 0 2