摘要:本文是系列的第二篇,前一篇走馬觀花概要介紹了,這一篇標(biāo)題之所以叫舊瓶新酒,是想介紹那些原來就被廣泛使用的對象,例如,對這些對象擴(kuò)展了一些很有用的新方法。用于監(jiān)聽取消監(jiān)聽數(shù)組的變化,指定回調(diào)函數(shù)。在中已被建議撤銷。
本文是 ES6 系列的第二篇,前一篇《ES6 走馬觀花》概要介紹了ES6,這一篇標(biāo)題之所以叫“舊瓶新酒”,是想介紹那些原來就被廣泛使用的JS對象,例如String、Array,ES6對這些JS對象擴(kuò)展了一些很有用的新方法。本文會介紹一些個人覺得很有用的方法,并不會覆蓋所有ES6新增方法。
本文將介紹以下JS對象:
String
Number
Array
Object
這里有ES6特性的兼容對比表格,方面大家查看本文提及的ES6特性在各個運(yùn)行環(huán)境的兼容情況。
String Unicode 表示法1) Unicode 表示法
JavaScript允許采用uxxxx形式表示一個字符,支持u0000—uFFFF之間的字符,對于超過uFFFF的字符,使用兩個字節(jié)的形式:
"uD842uDFB7" // "?"
ES6 在此基礎(chǔ)上做了改進(jìn),引入大括號來表示一個碼點(diǎn)(code point)
"u{20BB7}" // "?" "u0041" // "A" "u{41}" // "A"
除此之外,還擴(kuò)展了String.prototype.codePointAt()和String.fromCodePoint()方法,可以識別超出uFFFF的碼點(diǎn)。
2) codePointAt()
以前通過charCodeAt()獲取字符碼點(diǎn),但是對超出uFFFF的雙字節(jié)字符則會出錯,只能獲取第一個字節(jié)的碼點(diǎn),ES6新增了codePointAt()方法來獲取字符的unicode碼點(diǎn),可以正確識別雙字節(jié)的字符。
"?".charCodeAt(0) // 55362 "?".charCodeAt(0).toString(16) // "d842" "?".codePointAt(0) // 134071 "?".codePointAt(0).toString(16) // "20bb7"
3) String.fromCodePoint()
此方法用于從碼點(diǎn)返回對應(yīng)字符,支持識別雙字節(jié)字符。
String.fromCodePoint(0x20bb7) // "?"遍歷器接口
ES6 的字符串實(shí)現(xiàn)了 Iterator 遍歷器接口,因此可以用 for...of 循環(huán)遍歷字符串。
for (let codePoint of "foo") { console.log(codePoint) } // "f" // "o" // "o"
與普通 for 循環(huán)最大的不同是,for...of 循環(huán)遍歷的單位是字符碼點(diǎn)(code point),而 for 循環(huán)遍歷的單位是字符單元(code unit)
var text = String.fromCodePoint(0x20BB7); for (let i = 0; i < text.length; i++) { console.log(text[i]); } // " " // " " for (let i of text) { console.log(i); } // "?"實(shí)用方法
1) includes()
以前無法直接判斷一個字符串是否另一個字符串的子字符串,只能通過indexOf()方法來判斷。
"hello world".indexOf("hello") // 0 "hello world".indexOf("es6") // -1
在 ES6 中可以直接使用includes()直接判斷。
"hello world".includes("hello") // true "hello world".includes("es6") // false
includes() 還可以接收第二個參數(shù),表示從第幾位開始檢索
"hello world".includes("hello", 1) // false
2) startsWith(), endsWith()
在ES6中還可以直接判斷一個字符串是否以某個特定子串開頭,或是否以某個特定子串結(jié)尾。
以前只能用String.prototype.indexOf()和RegExp.prototype.test()判斷:
"hello world".indexOf("hello") // 0 /world$/.test("hello world") // true
在ES6中可以這么寫
"hello world".startsWith("hello") // true "hello world".endsWith("world") // true
startsWith() 和 endsWith() 還可以接收第二個參數(shù),表示從第幾位開始檢索
"hello world".startsWith("world", 6) // true "hello world".endsWith("hello", 5) // true
3) repeat()
此方法返回一個新字符串,表示將原字符串重復(fù)n次。
"hello".repeat(2) // "hellohello"Number 二進(jìn)制和八進(jìn)制
ES6 里可以用0b前綴表示二進(jìn)制,用0o表示八進(jìn)制
console.log(0b1100) // 12 console.log(0o1100) // 576指數(shù)運(yùn)算
ES6 新增了指數(shù)運(yùn)算符 **
console.log(2 ** 4) // 16 console.log(Math.pow(2, 4)) // 16Number.isFinite()
Number.isFinite() 與全局函數(shù) isFinite() 的區(qū)別是,只判斷數(shù)值,所有非數(shù)值均返回false,而isFinite() 會先將非數(shù)值的值轉(zhuǎn)為數(shù)值
Number.isFinite(16) // true Number.isFinite("16") // false isFinite(16) // true isFinite("16") // true Number.isFinite(Infinity) // falseNumber.isNaN()
與 Number.isFinite() 類似,Number.isNaN() 值判斷數(shù)值,所有非數(shù)值均返回false
Number.isNaN(NaN) // true Number.isNaN("a") // false isNaN("a") // trueNumber.parseInt(), Number.parseFloat()
Number.parseInt(), Number.parseFloat()與全局函數(shù)parseInt(), parseFloat()作用相同,放到 Number 對象的靜態(tài)方法,目的是逐步減少全局性方法,使得語言逐步模塊化。
Number.isInteger()Number.isInteger() 用來判斷一個值是否為整數(shù)。
Number.isInteger(16) // true Number.isInteger(16.2) // false Number.isInteger("16") // falseNumber.EPSILON
由于 Javascript 的浮點(diǎn)運(yùn)算不是精確的,存在誤差。Number.EPSILON 表示一個極小常量,當(dāng)浮點(diǎn)運(yùn)算的誤差小于這個常量時,就認(rèn)為浮點(diǎn)運(yùn)算結(jié)果是正確的。
0.1 + 0.2 // 0.30000000000000004 0.1 + 0.2 - 0.3 < Number.EPSILON // trueNumber.isSafeInteger()
用 Number.isSafeInteger() 函數(shù)判斷整數(shù)是否在-2^53到2^53之間,因?yàn)镴avaScript能夠準(zhǔn)確表示的整數(shù)范圍在-2^53到2^53之間。
Number.isSafeInteger(16) // true Number.isSafeInteger(2 ** 54) // falseArray Array.from()
Array.from() 用于將對象轉(zhuǎn)換為數(shù)組。
例如將字符串轉(zhuǎn)為數(shù)組:
Array.from("hello") // ["h", "e", "l", "l", "o"]
例如將DOM的NodeList轉(zhuǎn)為數(shù)組:
var elm = document.querySelectorAll("div"); Array.from(elm).forEach(function (div) { // do something });
Array.from() 函數(shù)還可以接受第二個參數(shù),用于處理數(shù)組的每個元素。
Array.from("123", (x) => x * x) // [1, 4, 9]Array.of()
Array.of 用于構(gòu)造一個新數(shù)組,可以取代 new Array()。因?yàn)楫?dāng) new Array() 一個參數(shù)和多個參數(shù)時,行為不一致。
new Array(3) // [ , , ] new Array(3, 2, 1) // [3, 2, 1] Array.of(3) // [3] Array.of(3, 2, 1) // [3, 2, 1]Array.observe
用于監(jiān)聽(取消監(jiān)聽)數(shù)組的變化,指定回調(diào)函數(shù)。在ES7中已被建議撤銷。
find(), findIndex()find() 遍歷數(shù)組直到找到符合條件的元素,返回該元素,若找不到則返回undefined。findIndex() 用法跟 find() 類似,但返回值是元素的位置,若找不到則返回-1
["hello", "world", "es6"].find(function(item) { if(item === "world") { return true; } }); // "world" [1, 0, 2].findIndex(function(item) { if(item === 0) { return true; } }); // 1
find()和findIndex() 還可以接收第二個參數(shù),用于指定回調(diào)函數(shù)的 this 上下文
entries(), keys(), values()這三個方法都返回一個遍歷器對象,用于遍歷數(shù)組。entries()用于遍歷數(shù)組鍵值對,keys()用于遍歷數(shù)組下標(biāo),values()用于遍歷數(shù)組的值。
for (let index of ["a", "b"].keys()) { console.log(index); } // 0 // 1 for (let elem of ["a", "b"].values()) { console.log(elem); } // "a" // "b" for (let [index, elem] of ["a", "b"].entries()) { console.log(index, elem); } // 0 "a" // 1 "b"Object Object 的簡潔表示法
直接寫變量
{x, y} // 等同于 { x: x, y: y }
直接寫函數(shù)
{ say() { console.log("I am ES6"); } } // 等同于 { say: function() { console.log("I am ES6"); } }屬性名表達(dá)式
ES6 支持在字面量定義對象時使用表達(dá)式作為屬性名。
var world = "es6"; var obj = { hello: 1, [world]: 2 }; // {hello: 1, es6: 2}Object.assign()
Object.assign() 方法拷貝一個對象屬性到目標(biāo)對象上。
Object.assign({}, {a: 1}) // {a: 1} Object.assign({a: 1}, {a: 2}) // {a: 2}
對于嵌套的對象,Object.assign的處理方法是替換,而不是添加。
var target = { a: { b: "hello", c: "world" } }; var source = { a: { b: "es6" } }; Object.assign(target, source); // { a: { b: "es6" } }參考
ECMAScript 6 入門
ES6 Strings (and Unicode, ?) in Depth
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86220.html
摘要:我們將用戶可以看到的可以交互的前端稱為頁面。只有外觀和數(shù)據(jù)的頁面,只能稱為靜態(tài)頁面,顯然我們?nèi)粘J褂玫母嗍莿討B(tài)頁面,這就需要在靜態(tài)頁面上加上變的因素,我們也稱之為行為。在介紹靜態(tài)頁面往動態(tài)頁面的轉(zhuǎn)換時,需要先介紹一個重要概念驅(qū)動。 頁面 一個完整的程序模塊由一個前端頁面和多個后端服務(wù)組成,然后使用后端服務(wù)的 URL 將前端和后端關(guān)聯(lián)起來。我們將用戶可以看到的、可以交互的前端稱為頁面。...
摘要:如今,通過這面鏡子,我們也發(fā)現(xiàn),市場中的各家已經(jīng)逐漸分野,其中有三個現(xiàn)象很值得關(guān)注。數(shù)據(jù)報(bào)告顯示,阿里云已經(jīng)在全球市場份額中排名第三,僅次于和微軟。5月4日晚,阿里發(fā)布了2018財(cái)年的Q4季報(bào)和全年財(cái)報(bào),整體增勢迅猛,2018財(cái)年?duì)I收為2502.66億元,同比增長了58%。每到阿里發(fā)布財(cái)報(bào)的時候,很多人都會把目光聚焦到阿里云業(yè)務(wù)上,為什么呢?阿里云已經(jīng)連續(xù)11個季度保持了三位數(shù)營收增長的紀(jì)錄...
摘要:進(jìn)入當(dāng)前程序的學(xué)習(xí)系統(tǒng)的所有樣本稱作輸入,并組成輸入空間。結(jié)束語注意這篇文章僅僅是我接下來的機(jī)器學(xué)習(xí)系列的第一篇,后續(xù)還會有更多的內(nèi)容。 往期回顧:統(tǒng)計(jì)學(xué)習(xí)方法第...
摘要:之前關(guān)于的作用域賦值參數(shù)傳遞,我們接連談了幾篇文章全菊變量和菊部變量關(guān)于函數(shù)參數(shù)傳遞,人都錯了可變對象與不可變對象今天我們依然要就相關(guān)話題繼續(xù)下去。這是由于它們是不可變對象,不存在被修改的可能,所以拷貝和賦值是一樣的。 之前關(guān)于 Python 的作用域、賦值、參數(shù)傳遞,我們接連談了幾篇文章: 全菊變量和菊部變量 關(guān)于函數(shù)參數(shù)傳遞,80%人都錯了 可變對象與不可變對象 今天我們依然要...
摘要:使用新特性開發(fā)微信小程序國際化與本地化新特性國際化與本地化新增了很多對于國際化的支持,比如時間格式,貨幣格式,數(shù)字格式等。 ECMAScript 6(簡稱ES6)是JavaScript語言的最新標(biāo)準(zhǔn)。因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。 微信小程序支持絕大部分ES6的新增特性。 使用ES6新特性開發(fā)微信小程序(1) ES6新特性:Cons...
閱讀 545·2021-10-19 11:45
閱讀 1354·2021-09-30 09:48
閱讀 1470·2021-08-16 10:56
閱讀 733·2021-07-26 23:38
閱讀 3210·2019-08-30 13:15
閱讀 2594·2019-08-30 12:45
閱讀 1828·2019-08-29 12:14
閱讀 2074·2019-08-26 18:42