1).chartAt返回指定字符es6
'abc'.charAt(0) // "a"
2).includes,startWith,endsWith判斷該字符串是否含有某字符shell
var s = 'Hello world!'; s.startsWith('Hello') // true s.endsWith('!') // true s.includes('o') // true //指定位置 s.startsWith('world', 6) // true s.endsWith('Hello', 5) // true s.includes('Hello', 6) // false
3).repeat複製字符編程
'x'.repeat(3) // "xxx" 'hello'.repeat(2) // "hellohello" 'na'.repeat(0) //NaN等於0
4).padStart,padEnd補全字符json
1.常見用法,補充位數 '12'.padStart(10, '0') // "0000000012" 2.提示字符串格式 12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12" 3.用空格補全 'x'.padStart(4) // ' x' 'x'.padEnd(4) // 'x
1).parseInt()和parseFloat()強轉字符串數組
Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45
2).Number.isInteger()用來判斷一個值是否爲整數promise
//整數和浮點數是一樣的儲存方法 Number.isInteger(25) // true Number.isInteger(25.0) // true
3).Math.trunc方法用於去除一個數的小數部分,返回整數部分。服務器
Math.trunc(4.1) // 4
4).Math.sign方法用來判斷一個數究竟是正數、負數、仍是零。app
參數爲正數,返回+1; 參數爲負數,返回-1; 參數爲0,返回0; 參數爲-0,返回-0; 其餘值,返回NaN。
1).合併數組異步
// ES5的合併數組 arr1.concat(arr2, arr3); // [ 'a', 'b', 'c', 'd', 'e' ] // ES6的合併數組 [...arr1, ...arr2, ...arr3]
2).字符串轉數組async
[...'hello'] // [ "h", "e", "l", "l", "o" ]
1).對象的key爲可變時,使用括號
let obj = { [propKey]: true, ['abc']: 123 };
2).Object.is判斷值是否嚴格相等,與===行爲基本一致
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true Object.is('foo', 'foo')// true Object.is({}, {})// false
3).Object.assign方法用於對象的合併(淺拷貝)
var target = { a: 1, b: 1 }; var source1 = { b: 2, c: 2 }; var source2 = { c: 3 }; Object.assign(target, source1, source2); target // {a:1, b:2, c:3}
4).Object.keys()
返回一個數組,成員是參數對象自身的(不含繼承的)全部可遍歷屬性的鍵名。
5).Object.values
返回一個數組,成員是參數對象自身的(不含繼承的)全部可遍歷屬性的鍵值。
var obj = { foo: "bar", baz: 42 }; Object.values(obj) // ["bar", 42]
6).Object.entries
返回一個數組,成員是參數對象自身的(不含繼承的)全部可遍歷屬性的鍵值對數組。
var obj = { foo: 'bar', baz: 42 }; Object.entries(obj) // [ ["foo", "bar"], ["baz", 42] ]
1).基本用法
//Set.prototype.size:返回Set實例的成員總數。 s.size // 2 add(value):添加某個值,返回Set結構自己。 delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。 has(value):返回一個布爾值,表示該值是否爲Set的成員。 clear():清除全部成員,沒有返回值。 s.add(1).add(2).add(2); s.has(1) // true s.delete(2); Array.from方法能夠將Set結構轉爲數組。 var items = new Set([1, 2, 3, 4, 5]); var array = Array.from(items);
2).遍歷方法
keys():返回鍵名的遍歷器 values():返回鍵值的遍歷器 entries():返回鍵值對的遍歷器 forEach():使用回調函數遍歷每一個成員,用於對每一個成員執行某種操做,沒有返回值。 let set = new Set(['red', 'green', 'blue']); for (let item of set.keys()) { console.log(item); } for (let item of set.values()) { console.log(item); } /**遍歷value默認等於 for (let x of set) { console.log(x); } 或者 let values = [...set]; */ for (let item of set.entries()) { console.log(item); } let set = new Set([1, 2, 3]); set.forEach((value, key) => console.log(value * 2) )
3).去除數組的重複值
let arr = [3, 5, 2, 2, 5, 5]; let unique = [...new Set(arr)];
4).數組的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}
5).實現並集、交集和差集
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 並集 let union = new Set([...a, ...b]); // Set {1, 2, 3, 4} // 交集 let intersect = new Set([...a].filter(x => b.has(x))); // set {2, 3} // 差集 let difference = new Set([...a].filter(x => !b.has(x))); // Set {1}
1).遍歷方法
keys():返回鍵名的遍歷器。 values():返回鍵值的遍歷器。 entries():返回全部成員的遍歷器。 forEach():遍歷Map的全部成員。 let map = new Map([ ['F', 'no'], ['T', 'yes'], ]); for (let key of map.keys()) { console.log(key); } // "F" // "T" for (let value of map.values()) { console.log(value); } // "no" // "yes" for (let item of map.entries()) { console.log(item[0], item[1]); } // "F" "no" // "T" "yes" // 或者 for (let [key, value] of map.entries()) { console.log(key, value); } // 等同於使用map.entries() for (let [key, value] of map) { console.log(key, value); }
2).遍歷和過濾
//合數組的map方法、filter方法,能夠實現Map的遍歷和過濾(Map自己沒有map和filter方法)。 let map0 = new Map() .set(1, 'a') .set(2, 'b') .set(3, 'c'); let map1 = new Map( [...map0].filter(([k, v]) => k < 3) ); // 產生Map結構 {1 => 'a', 2 => 'b'} let map2 = new Map( [...map0].map(([k, v]) => [k * 2, '_' + v]) ); // 產生Map結構 {2 => '_a', 4 => '_b', 6 => '_c'}
3).map與其餘類型之間的相互轉換
http://es6.ruanyifeng.com/#docs/set-map
1).基本用法
//1.數組遍歷(能夠代替數組實例的forEach方法) var arr = ['a', 'b', 'c', 'd']; for (let a in arr) { console.log(a); // 0 1 2 3 獲取key } for (let a of arr) { console.log(a); // a b c d 獲取value } //2.遍歷map var engines = new Set(["a":"Gecko","b":"Trident", "c":"Webkit", "d":"Webkit"]); for (var [key,value] of engines) { } //3.遍歷set var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]); for (var e of engines) { } //4.遍歷對象 var es6 = { edition: 6, committee: "TC39", standard: "ECMA-262" }; //不能直接使用for..of,使用Object.keys方法將對象的鍵名生成一個數組,而後遍歷這個數組。 for (var key of Object.keys(someObject)) { console.log(key + ": " + someObject[key]); } //5.遍歷Generator函數 function *foo() { yield 1; yield 2; yield 3; yield 4; yield 5; return 6; } for (let v of foo()) { console.log(v); } // 1 2 3 4 5
2).與其餘遍歷語法的比較
http://es6.ruanyifeng.com/#docs/iterator
Generator函數是一個普通函數,可是有兩個特徵。一是,function關鍵字與函數名之間有一個星號;二是,函數體內部使用yield語句,定義不一樣的內部狀態。
yield語句與return語句既有類似之處,也有區別。類似之處在於,都能返回緊跟在語句後面的那個表達式的值。區別在於每次遇到yield,函數暫停執行,下一次再從該位置繼續向後執行,而return語句不具有位置記憶的功能。一個函數裏面,只能執行一次(或者說一個)return語句,可是能夠執行屢次(或者說多個)yield語句。
yield句自己沒有返回值,或者說老是返回undefined。next方法能夠帶一個參數,該參數就會被看成上一個yield語句的返回值。
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); //必須調用next,纔會執行下一個語句,yield是暫緩的意思 hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
//除了for...of循環之外,擴展運算符(...)、解構賦值和Array.from方法內部調用的 function* numbers () { yield 1 yield 2 return 3 yield 4 } // 擴展運算符 [...numbers()] // [1, 2] // Array.from 方法 Array.from(numbers()) // [1, 2] // 解構賦值 let [x, y] = numbers(); x // 1 y // 2 // for...of 循環 for (let n of numbers()) { console.log(n) } // 1 // 2
//Generater函數內部,調用另外一個Generator函數,默認狀況下是沒有效果的。這個時候須要yield*調用 function* bar() { yield 'x'; yield* foo(); yield 'y'; } // 等同於 function* bar() { yield 'x'; yield 'a'; yield 'b'; yield 'y'; }
能夠簡寫成下面的形式: let obj = { * myGeneratorMethod() { ··· } }; 完整形式: let obj = { myGeneratorMethod: function* () { // ··· } }
1).普通暫緩執行
//Generator函數能夠不用yield語句,這時就變成了一個單純的暫緩執行函數。 function* f() { console.log('執行了!') } var generator = f(); setTimeout(function () { generator.next() }, 2000);
2).切換UI狀態
function* loadUI() { showLoadingScreen(); yield loadUIDataAsynchronously(); hideLoadingScreen(); } var loader = loadUI(); // 加載UI loader.next() // 卸載UI loader.next()
3).多任務按順序執行
function* longRunningTask(value1) { try { var value2 = yield step1(value1); var value3 = yield step2(value2); var value4 = yield step3(value3); var value5 = yield step4(value4); // Do something with value4 } catch (e) { // Handle any error from step1 through step4 } } function scheduler(task) { var taskObj = task.next(task.value); // 若是Generator函數未結束,就繼續調用 if (!taskObj.done) { task.value = taskObj.value scheduler(task); } } scheduler(longRunningTask(initialValue));
var promise = new Promise(function(resolve, reject) { // ... some code if (/* 異步操做成功 */){ resolve(value); } else { reject(error); } });
promise.then((sucessMsg) => console.log(sucessMsg)) .catch((errMsg) => console.log(errMsg))
Promise.all方法用於將多個Promise實例,包裝成一個新的Promise實例。當所有promise都完成的時候就完成,其中一個失敗即整個失敗
// 生成一個Promise對象的數組 var promises = [2, 3, 5, 7, 11, 13].map(function (id) { return getJSON("/post/" + id + ".json"); }); Promise.all(promises).then(function (posts) { // ... }).catch(function(reason){ // ... });
Promise.race方法一樣是將多個Promise實例,包裝成一個新的Promise實例。當其中一個率先有狀態,即整個都轉狀態。
var p = Promise.race([p1,p2,p3]);
Promise對象的回調鏈,無論以then方法或catch方法結尾,要是最後一個方法拋出錯誤,都有可能沒法捕捉到(由於Promise內部的錯誤不會冒泡到全局)。所以,咱們能夠提供一個done方法,老是處於回調鏈的尾端,保證拋出任何可能出現的錯誤。
asyncFunc() .then(f1) .catch(r1) .then(f2) .done();
finally方法用於指定無論Promise對象最後狀態如何,都會執行的操做。它與done方法的最大區別,它接受一個普通的回調函數做爲參數,該函數無論怎樣都必須執行。
server.listen(0) .then(function () { // run test })//關閉服務器 .finally(server.stop);
ES6誕生之前,異步編程的方法,大概有下面四種。
ES7新添Async函數
1).含義
async函數就是Generator函數的語法糖。 Generator函數: var readFile = function (fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileName, function(error, data) { if (error) reject(error); resolve(data); }); }); }; var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }; Async函數: var asyncReadFile = async function (){ var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }; 1.async函數就是將Generator函數的星號(*)替換成async,將yield替換成await,僅此而已。 2.async自帶執行器,因此調用只需直接asybcReadFile();
2).基本用法
async function main() { try { var val1 = await firstStep(); var val2 = await secondStep(val1); var val3 = await thirdStep(val1, val2); console.log('Final: ', val3); } catch (err) { console.error(err); } } 1.避免出現這個問題,應該使用try..catch async function f() { await Promise.reject('出錯了'); await Promise.resolve('hello world'); // 不會執行 } 2.當有多個await的時候,能夠都放在try上
3).但願多個操做同時執行
async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results); } // 或者使用下面的寫法 //不能使用forEach,其表明三個db.post同時執行,不是相繼 async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = []; for (let promise of promises) { results.push(await promise); } console.log(results); }
4).使用注意
多個await命令後面的異步操做,若是不存在繼發關係,最好讓它們同時觸發。 必須等foo完成,才能執行bar執行,太耗時 let foo = await getFoo(); let bar = await getBar(); //可更改兩種寫法,getFoo和getBar都是同時觸發,這樣就會縮短程序的執行時間。 // 寫法一 let [foo, bar] = await Promise.all([getFoo(), getBar()]); // 寫法二 let fooPromise = getFoo(); let barPromise = getBar(); let foo = await fooPromise; let bar = await barPromise;
/** * 回調函數測試方法 * * @param callback * 被回調的方法 */ function testCallback(callback) { alert('come in!'); callback(); } /** * 被回調的函數 */ function a() { alert('a'); } /** * 開始測試方法 */ function start() { testCallback(a); }
//rn監聽鍵盤 DeviceEventEmitter.addListener(‘keyboardWillShow‘, this.updateKeyboardSpace) DeviceEventEmitter.addListener(‘keyboardWillHide‘, this.resetKeyboardSpace) updateKeyboardSpace: function (frames) { const keyboardSpace = frames.endCoordinates.height//獲取鍵盤高度 this.setState({ keyboardSpace: keyboardSpace, }) },
//rn接收發送通知 DeviceEventEmitter.emit('ClickPopTicketView'); DeviceEventEmitter.addListener('ClickPopTicketView',() => { this._setModalVisible(false) });
fetch(url, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `uid=${userinfo.uid}&sec=${userinfo.sec}&wishkey=${this.props.searchTitle}` }) .then((response) => response.text()) .then((responseText) => { this.setState({isShowLodding:false}); console.log("code:"+responseText.code ); let response = JSON.parse(responseText); console.log("response:"+response); if(response.code == "200"){ MyAppTool.showAlert("添加成功"); return; } MyAppTool.showAlert("添加失敗"); }) .catch((err) => { MyAppTool.showAlert("添加失敗"); });