1. normalize()
用来将字符的不同表示方法统一为同样的形式,成为Unicode正规化。
例如,'\u01D1'.normalize() === '\u004F\u030C'.normalize(),结果为true
2. includes(),startsWith(), endsWith()
用于判断某字符串中是否包含另外的字符
例如:
var s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
这三个方法都支持第二个参数,表示开始搜索的位置
例如:
var s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
3. repeat(n) 返回一个新字符串,表示将原字符串重复n次。
4. padStart()和padEnd()分别表示在字符串头部和尾部用指定字符串补全。
例如:
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
5. 模版字符串是增强版的字符串,用反引号( `)来表示,字符串可以换行,可以加入用{}包围的变量,消除换行可以用trim()。
例如:$('#list').html(`
first
second
`.trim());
6. Eval用法,eval用于执行字符串模式的函数
let str = '(name) => `Hello ${name}!`';
let func = eval.call(null, str);
func('Jack') // "Hello Jack!"
7. Number.isFinite()和Number.isNaN(). 前者用来判断是否为数值,后者判断是否为NaN.
例如:Number.isFinite(15); // true
Number.isFinite('15'); // false
Number.isNaN(NaN) // true
Number.isNaN(15) // false
8. Math.trunc()用于去除一个数的小数点部分,返回整数部分。
9. Math.sign()用于判断一个数到底是正数、负数、还是零。它会返回五种值。
参数为正数,返回+1;参数为负数,返回-1;参数为0,返回0;参数为-0,返回-0;其他值,返回NaN。
10. Array.from(),将对象转为真正的数组。扩展运算符(…)也可以将某些数据结构转化为数组。
例如:
// NodeList对象
[...document.querySelectorAll('div')]
// NodeList对象
let ps = document.querySelectorAll('p');
Array.from(ps).forEach(function (p) {
console.log(p);
});
Array.from()也接受第二个参数,作用类似于数组中的map方法,用来对每个元素进行处理,处理后的结果放到数组中。
例如:
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
11. 数组的find()和findIndex()方法,find()用于找出第一个满足条件的数组成员,如果没有,则返回undefined;findIndex()同find()类似,如果有,则返回第一个符合条件的位置,若没有符合条件的就返回-1.
例如:
[1, 4, -5, 10].find((n) => n < 0)
// -5
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2
另外,这两个方法都满足第二个参数,也可以查找NaN
12. 数组的includes()方法返回一个布尔值,用来表示某个数组是否包含给定的值,与字符串的includes方法类似。
Map和Set数据结构都有has方法,前者是查找key,后者查找value。
例如:
Map.prototype.has(key)
Set.prototype.has(value)
13. 数组中的filter()方法用于对数组按条件进行筛选。
例如:以下返回结果是id满足条件的组成的新数组
let filtered = this.collections.filter(coll =>{
return coll.id === collectionId;
});
14. 扩展运算符(spread)是三个点(…)。将一个数组转化为用逗号分隔的参数序列。
例如:
console.log(...[1, 2, 3])
// 1 2 3
function add(x, y) {
returnx + y;
}
var numbers = [4, 38];
add(...numbers) // 42
Math.max(...[14, 3, 77])
等同于
Math.max(14, 3, 77);
扩展运算符用法:
(1)合并数组
// ES5的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
(2)与解构赋值结合
// ES5
a = list[0], rest = list.slice(1)
// ES6
[a, ...rest] = list
将扩展运算符用于数组赋值时,只能放在最后一个参数,否则报错
const [...butLast, last] = [1, 2, 3, 4, 5];
// 报错
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]
(3)函数的返回值
vardateFields = readDateFields(database);
var d = new Date(...dateFields);
(4) 字符串,将字符串转为数组
[...'hello']
// [ "h", "e", "l", "l", "o" ]
(5)实现Iterator接口的对象
(6)Map和Set结构,Generator函数
15. 箭头函数:
例如:
var f = () => 5;
// 等同于
var f = function () { return 5 };
varsum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
returnnum1 + num2;
};
16. 属性的简洁表示法:
var foo = 'bar';
varbaz = {foo};
baz // {foo: "bar"}
// 等同于
var baz = {foo: foo};
varms = {};
function getItem (key) {
return key in ms ? ms[key] : null;
}
function setItem (key, value) {
ms[key] = value;
}
function clear () {
ms = {};
}
module.exports = { getItem, setItem, clear };
// 等同于
module.exports = {
getItem: getItem,
setItem: setItem,
clear: clear
};
17. Object.assign()用于对象的合并,将源对象的所有可枚举属性,拷贝到目标对象中。第一个参数是目标对象,后面的参数是源对象。
注意:Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
常见用途:
1)为对象添加属性
class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
}
2)为对象添加方法
3)克隆对象
4)合并多个对象为属性指定默认值
5)指定多个对象
18. 属性的遍历. ES6有五种方式遍历:
(1) For…in
例如:
for (let it in data)
(2) Object.keys(obj)
例如:
Object.keys(initial).forEach(key =>{
state[key] = initial[key];
});
(3) Object.getOwnPropertyNames(obj) 返回一个数组
(4) Object.getOwnPropertySymbols(obj) 返回一个数组,包含所有的symbol属性
(5) Reflect.ownKeys(obj) 返回一个数组,包含所有属性
19. __proto__ 属性
(1) __proto__ 属性,用于读取或获取当前对象的prototype对象.
var obj = {
method:function() { ... }
};
obj.__proto__ = someOtherObj;
(2)Object.setPrototypeof(). 该方法作用与__proto__相同,用来设置一个prototype对象. 其用法为: var o = Object.setPrototypeOf({}, null);
(3)Object.getPrototypeof(). 该方法与setPrototypeof()对应着使用,用于读取prototype对象.
例如:
function Rectangle() {
}
var rec = new Rectangle();
Object.getPrototypeOf(rec) ===Rectangle.prototype
// true
Object.setPrototypeOf(rec, Object.prototype);
Object.getPrototypeOf(rec) ===Rectangle.prototype
// false
20. Object.keys(). 读取object中的所有键名并存放到数组中
例如:
var obj = { foo: "bar", baz: 42 };
Object.keys(obj)
// ["foo", "baz"]
const header = Object.keys(items[0]);
let csv = items.map(row =>
header.map(fieldName =>{
let result = row[fieldName] === null ? '' : row[fieldName];
return result;
})
);
21. Object.values(). 读取object中所有键值到数组中,如果不是显式属性,则不会遍历出来,所以symbol属性不会被遍历
例如:
var obj = { foo: "bar", baz: 42 };
Object.values(obj)
// ["bar", 42]
22. Object.entries(), 读取object中的所有键名键值,并将键名和键值对应起来分别放到不同数组中.
例如:
var obj = { foo: 'bar', baz: 42 };
Object.entries(obj)
// [ ["foo", "bar"],["baz", 42] ]
23. Set类似于数组,但是成员的值都是唯一的.
例如:
var s = new Set();
[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
// 例一
var set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
// 例二
var items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5
// 例三
function divs () {
return[...document.querySelectorAll('div')];
}
var set = new Set(divs());
set.size // 56
// 类似于
divs().forEach(div => set.add(div));
set.size // 56
Set中两个NaN总是相等,但是两个空对象总是不相等.
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
Set实例的方法:
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
Set的遍历方法:
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
扩展运算符和Set结构相结合,就可以去除数组的重复成员。
例如:
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
// [3, 5, 2]
数组的map和filter也可用于Set.
例如:
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set结构:{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2)== 0));
// 返回Set结构:{2,4}
24. Cookie, localStorage和sessionStorage的区别:
因为考虑到每个 HTTP 请求都会带着 Cookie 的信息,所以 Cookie 当然是能精简就精简啦,比较常用的一个应用场景就是判断用户是否登录。针对登录过的用户,服务器端会在他登录时往 Cookie 中插入一段加密过的唯一辨识单一用户的辨识码,下次只要读取这个值就可以判断当前用户是否登录啦。曾经还使用 Cookie 来保存用户在电商网站的购物车信息,如今有了 localStorage,似乎在这个方面也可以给 Cookie 放个假了~
而另一方面 localStorage 接替了Cookie 管理购物车的工作,同时也能胜任其他一些工作。比如HTML5游戏通常会产生一些本地数据,localStorage 也是非常适用的。如果遇到一些内容特别多的表单,为了优化用户体验,我们可能要把表单页面拆分成多个子页面,然后按步骤引导用户填写。这时候 sessionStorage 的作用就发挥出来了。
安全性考虑:
需要注意的是,不是什么数据都适合放在Cookie、localStorage和sessionStorage 中的。使用它们的时候,需要时刻注意是否有代码存在XSS 注入的风险。因为只要打开控制台,你就随意修改它们的值,也就是说如果你的网站中有XSS 的风险,它们就能对你的localStorage 肆意妄为。所以千万不要用它们存储你系统中的敏感数据。
Vuex的数据是存放在localStorage中.