1.? normalize()
用來將字符的不同表示方法統(tǒng)一為同樣的形式,成為Unicode正規(guī)化。
例如皆尔,'\u01D1'.normalize() === '\u004F\u030C'.normalize(),結(jié)果為true
2.? includes(),startsWith(), endsWith()
用于判斷某字符串中是否包含另外的字符
例如:
var s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
這三個方法都支持第二個參數(shù)秕衙,表示開始搜索的位置
例如:
var s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
3.? repeat(n) 返回一個新字符串,表示將原字符串重復(fù)n次事秀。
4.? padStart()和padEnd()分別表示在字符串頭部和尾部用指定字符串補(bǔ)全。
例如:
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
5.? 模版字符串是增強(qiáng)版的字符串野舶,用反引號( `)來表示易迹,字符串可以換行,可以加入用{}包圍的變量平道,消除換行可以用trim()睹欲。
例如:$('#list').html(`
first
second
`.trim());
6.? Eval用法,eval用于執(zhí)行字符串模式的函數(shù)
let str = '(name) => `Hello ${name}!`';
let func = eval.call(null, str);
func('Jack') // "Hello Jack!"
7.? Number.isFinite()和Number.isNaN(). 前者用來判斷是否為數(shù)值一屋,后者判斷是否為NaN.
例如:Number.isFinite(15); // true
Number.isFinite('15'); // false
Number.isNaN(NaN) // true
Number.isNaN(15) // false
8.? Math.trunc()用于去除一個數(shù)的小數(shù)點部分窘疮,返回整數(shù)部分。
9.? Math.sign()用于判斷一個數(shù)到底是正數(shù)冀墨、負(fù)數(shù)闸衫、還是零。它會返回五種值诽嘉。
參數(shù)為正數(shù)蔚出,返回+1;參數(shù)為負(fù)數(shù)虫腋,返回-1骄酗;參數(shù)為0,返回0悦冀;參數(shù)為-0趋翻,返回-0;其他值盒蟆,返回NaN踏烙。
10.? Array.from()师骗,將對象轉(zhuǎn)為真正的數(shù)組。擴(kuò)展運算符(…)也可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為數(shù)組讨惩。
例如:
// NodeList對象
[...document.querySelectorAll('div')]
// NodeList對象
let ps = document.querySelectorAll('p');
Array.from(ps).forEach(function (p) {
? console.log(p);
});
Array.from()也接受第二個參數(shù)丧凤,作用類似于數(shù)組中的map方法,用來對每個元素進(jìn)行處理步脓,處理后的結(jié)果放到數(shù)組中。
例如:
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.? 數(shù)組的find()和findIndex()方法浩螺,find()用于找出第一個滿足條件的數(shù)組成員靴患,如果沒有,則返回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
另外或颊,這兩個方法都滿足第二個參數(shù),也可以查找NaN
12.? 數(shù)組的includes()方法返回一個布爾值传于,用來表示某個數(shù)組是否包含給定的值囱挑,與字符串的includes方法類似。
Map和Set數(shù)據(jù)結(jié)構(gòu)都有has方法沼溜,前者是查找key平挑,后者查找value。
例如:
Map.prototype.has(key)
Set.prototype.has(value)
13.? 數(shù)組中的filter()方法用于對數(shù)組按條件進(jìn)行篩選系草。
例如:以下返回結(jié)果是id滿足條件的組成的新數(shù)組
let filtered = this.collections.filter(coll =>{
???????????return coll.id === collectionId;
?????????});
14.? 擴(kuò)展運算符(spread)是三個點(…)通熄。將一個數(shù)組轉(zhuǎn)化為用逗號分隔的參數(shù)序列。
例如:
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);
擴(kuò)展運算符用法:
(1)合并數(shù)組
// ES5的合并數(shù)組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6的合并數(shù)組
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
(2)與解構(gòu)賦值結(jié)合
// ES5
a = list[0], rest = list.slice(1)
// ES6
[a, ...rest] = list
將擴(kuò)展運算符用于數(shù)組賦值時找都,只能放在最后一個參數(shù)唇辨,否則報錯
const [...butLast, last] = [1, 2, 3, 4, 5];
// 報錯
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest? // [2, 3, 4, 5]
(3)函數(shù)的返回值
vardateFields = readDateFields(database);
var d = new Date(...dateFields);
(4) 字符串,將字符串轉(zhuǎn)為數(shù)組
[...'hello']
// [ "h", "e", "l", "l", "o" ]
(5)實現(xiàn)Iterator接口的對象
(6)Map和Set結(jié)構(gòu)能耻,Generator函數(shù)
15.? 箭頭函數(shù):
例如:
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()用于對象的合并赏枚,將源對象的所有可枚舉屬性,拷貝到目標(biāo)對象中晓猛。第一個參數(shù)是目標(biāo)對象嗡贺,后面的參數(shù)是源對象。
注意:Object.assign方法實行的是淺拷貝鞍帝,而不是深拷貝诫睬。也就是說,如果源對象某個屬性的值是對象帕涌,那么目標(biāo)對象拷貝得到的是這個對象的引用摄凡。
常見用途:
1)為對象添加屬性
class Point {
? constructor(x, y) {
??? Object.assign(this, {x, y});
? }
}
2)為對象添加方法
3)克隆對象
4)合并多個對象為屬性指定默認(rèn)值
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) 返回一個數(shù)組
(4) Object.getOwnPropertySymbols(obj) 返回一個數(shù)組,包含所有的symbol屬性
(5) Reflect.ownKeys(obj) 返回一個數(shù)組,包含所有屬性
19.? __proto__ 屬性
(1) __proto__ 屬性,用于讀取或獲取當(dāng)前對象的prototype對象.
var obj = {
? method:function() { ... }
};
obj.__proto__ = someOtherObj;
(2)Object.setPrototypeof(). 該方法作用與__proto__相同,用來設(shè)置一個prototype對象. 其用法為: var o = Object.setPrototypeOf({}, null);
(3)Object.getPrototypeof(). 該方法與setPrototypeof()對應(yīng)著使用,用于讀取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中的所有鍵名并存放到數(shù)組中
例如:
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中所有鍵值到數(shù)組中,如果不是顯式屬性,則不會遍歷出來,所以symbol屬性不會被遍歷
例如:
var obj = { foo: "bar", baz: 42 };
Object.values(obj)
// ["bar", 42]
22.? Object.entries(), 讀取object中的所有鍵名鍵值,并將鍵名和鍵值對應(yīng)起來分別放到不同數(shù)組中.
例如:
var obj = { foo: 'bar', baz: 42 };
Object.entries(obj)
// [ ["foo", "bar"],["baz", 42] ]
23.? Set類似于數(shù)組,但是成員的值都是唯一的.
例如:
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結(jié)構(gòu)本身。
delete(value):刪除某個值亲澡,返回一個布爾值钦扭,表示刪除是否成功。
has(value):返回一個布爾值床绪,表示該值是否為Set的成員客情。
clear():清除所有成員,沒有返回值癞己。
Set的遍歷方法:
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個成員
擴(kuò)展運算符和Set結(jié)構(gòu)相結(jié)合膀斋,就可以去除數(shù)組的重復(fù)成員。
例如:
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
// [3, 5, 2]
數(shù)組的map和filter也可用于Set.
例如:
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set結(jié)構(gòu):{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2)== 0));
// 返回Set結(jié)構(gòu):{2,4}
24.? Cookie, localStorage和sessionStorage的區(qū)別:
因為考慮到每個 HTTP 請求都會帶著 Cookie 的信息痹雅,所以 Cookie 當(dāng)然是能精簡就精簡啦仰担,比較常用的一個應(yīng)用場景就是判斷用戶是否登錄。針對登錄過的用戶绩社,服務(wù)器端會在他登錄時往 Cookie 中插入一段加密過的唯一辨識單一用戶的辨識碼摔蓝,下次只要讀取這個值就可以判斷當(dāng)前用戶是否登錄啦。曾經(jīng)還使用 Cookie 來保存用戶在電商網(wǎng)站的購物車信息愉耙,如今有了 localStorage贮尉,似乎在這個方面也可以給 Cookie 放個假了~
而另一方面 localStorage 接替了Cookie 管理購物車的工作,同時也能勝任其他一些工作朴沿。比如HTML5游戲通常會產(chǎn)生一些本地數(shù)據(jù)绘盟,localStorage 也是非常適用的。如果遇到一些內(nèi)容特別多的表單悯仙,為了優(yōu)化用戶體驗龄毡,我們可能要把表單頁面拆分成多個子頁面,然后按步驟引導(dǎo)用戶填寫锡垄。這時候 sessionStorage 的作用就發(fā)揮出來了沦零。
安全性考慮:
需要注意的是,不是什么數(shù)據(jù)都適合放在Cookie货岭、localStorage和sessionStorage 中的路操。使用它們的時候,需要時刻注意是否有代碼存在XSS 注入的風(fēng)險千贯。因為只要打開控制臺屯仗,你就隨意修改它們的值,也就是說如果你的網(wǎng)站中有XSS 的風(fēng)險搔谴,它們就能對你的localStorage 肆意妄為魁袜。所以千萬不要用它們存儲你系統(tǒng)中的敏感數(shù)據(jù)。
Vuex的數(shù)據(jù)是存放在localStorage中.