-
Map & Set
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024181109440 -
for…in… & for…of…
for…in循环用于遍历对象的属性,包括继承的属性,但不包括Symbol类型的属性。
而for…of循环用于遍历可迭代对象,例如数组、字符串、Map、Set等等。
// 自定义可迭代对象
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正则表达式在线测试工具
- 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属性无法正常初始化。