// 自定义可迭代对象
let myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

for (let value of myIterable) {
  console.log(value);
}
// 输出:1 2 3

https://www.liaoxuefeng.com/wiki/1022910821149312/1023024358748480

  • 解构赋值
    let {name, passport:id=‘123’} = person;

  • apply & call
    apply()把参数打包成Array再传入,Math.max.apply(null, [3, 5, 4]); // 5
    call()把参数按顺序传入,Math.max.call(null, 3, 5, 4); // 5
    null为this指向,默认为window
    https://www.liaoxuefeng.com/wiki/1022910821149312/1023023754768768

  • map & reduce
    var results = arr.map(fun) 映射
    Array的reduce()把一个函数作用在这个Array上,这个函数必须接收两个参数(元素,上一个函数处理结果)

  • filter、sort、every、find、find、find

  • 函数闭包
    返回一个自带有参数(可变)的函数,无需额外传参

var f1 = lazy_sum([1, 2, 3, 4, 5]);
var f2 = lazy_sum([1, 2, 3, 4, 5]);
f1 === f2; // false

闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。
https://www.liaoxuefeng.com/wiki/1022910821149312/1023021250770016

  • generator
    是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
try {
    r1 = yield ajax('http://url-1', data1);
    r2 = yield ajax('http://url-2', data2);
    r3 = yield ajax('http://url-3', data3);
    success(r3);
}
catch (err) {
    handle(err);
}
  • 标准对象
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'  -> Array.isArray() 方法判断   console.log(arr instanceof Array)  变量.constructor === Array  Object.prototype.toString.call([1,2,3]) === '[object Array]'
typeof {}; // 'object'

typeof操作符可以判断出number、boolean、string、function和undefined
判断Array要使用Array.isArray(arr)
判断null请使用myVar === null
函数内部判断某个变量是否存在用typeof myVar === ‘undefined’

  • Date()
    JavaScript的Date对象getMonth()值从0开始,牢记0=1月,1=2月,2=3月,……,11=12月;getDay()值从0开始,牢记0=周日,1=周一,……,6=周六。

  • RegExp

var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

RegExp对象的test()方法用于测试给定的字符串是否符合条件。

exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
exec()方法在匹配失败时返回null。

JavaScript的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配
正则表达式还可以指定i标志,表示忽略大小写,m标志,表示执行多行匹配。
runoob正则表达式在线测试工具
image

  • JSON
    JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。
JSON.stringify(xiaoming, ['name', 'skills'], '  ');

第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array;还可以传入一个函数,这样对象的每个键值对都会被函数先处理

function convert(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}

JSON.stringify(xiaoming, convert, '  ');

如果我们还想要精确控制如何序列化小明,可以给xiaoming定义一个toJSON()的方法,直接返回JSON应该序列化的数据:

var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
    toJSON: function () {
        return { // 只输出name和age,并且改变了key:
            'Name': this.name,
            'Age': this.age
        };
    }
};

JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

JSON.parse()还可以接收一个函数,用来转换解析出的属性:

var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {
    if (key === 'name') {
        return value + '同学';
    }
    return value;
});
console.log(JSON.stringify(obj)); // {name: '小明同学', age: 14}
  • 面向对象编程
class Student {
    constructor(name) {
        this.name = name;
    }

    hello() {
        alert('Hello, ' + this.name + '!');
    }
}
var xiaoming = new Student('xiaoming')
console.log(xiaoming.name)

// 继承
class PrimaryStudent extends Student {
    constructor(name, grade) {
        super(name); // 记得用super调用父类的构造方法!
        this.grade = grade;
    }

    myGrade() {
        alert('I am at grade ' + this.grade);
    }
}

需要通过super(name)来调用父类的构造函数,否则父类的name属性无法正常初始化。