成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

ECMAScript 5.1 實(shí)用特性概覽

xiao7cn / 2651人閱讀

摘要:返回一個(gè)由原數(shù)組中的每個(gè)元素調(diào)用一個(gè)指定方法后的返回值組成的新數(shù)組。方法測(cè)試數(shù)組中的某些元素是否通過(guò)了指定函數(shù)的測(cè)試,返回值非常實(shí)用的功能,判斷數(shù)組中是否某元素符合特定條件。

ECMAScript 5發(fā)布于2009年12月。ECMAscript 5.1版(下文稱ES5)發(fā)布于2011年6月,,并且成為ISO國(guó)際標(biāo)準(zhǔn)(ISO/IEC 16262:2011)

http://www.ecma-international...

ECMAScript 5.1 是ECMAScript(基于JavaScript的規(guī)范)標(biāo)準(zhǔn)最新修正。 與HTML5規(guī)范進(jìn)程本質(zhì)類(lèi)似,ES5通過(guò)對(duì)現(xiàn)有JavaScript方法添加語(yǔ)句和原生ECMAScript對(duì)象做合并實(shí)現(xiàn)標(biāo)準(zhǔn)化。
實(shí)用特性 Object Object.defineProperty()
該方法直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)已經(jīng)存在的屬性, 并返回這個(gè)對(duì)象。Object.defineProperties()與其一樣,只是可以同時(shí)定義多個(gè)屬性。

該方法允許精確添加或修改對(duì)象的屬性。常用的場(chǎng)景

定義settergetter。 (在ES6中已經(jīng)有了更好的定義方法)

定義對(duì)象屬性是否可枚舉enumerable

可枚舉的屬性鍵值能夠被for inObject.keys獲得。

最常見(jiàn)的例子就是,[]數(shù)組中索引屬性是可枚舉的,而標(biāo)準(zhǔn)成員方法就是不可枚舉的。

~! 這也是為什么我們不要使用for in遍歷數(shù)組的原因,因?yàn)榭赡苡幸恍┳玖拥纳舷挛拇a,為數(shù)組添加了一個(gè)可枚舉的方法,因此我們?cè)跀U(kuò)展一個(gè)特殊對(duì)象屬性時(shí)特別需要特別關(guān)注這一點(diǎn)

Object.keys()

把對(duì)象的返回一個(gè)包括對(duì)象可枚舉鍵值的數(shù)組。

Object.keys和語(yǔ)句 for in 的功能十分相似,經(jīng)常是一些細(xì)心的javascript開(kāi)發(fā)者的討論熱點(diǎn)?;叵肽荅S5還不完全兼容的年代, for in 承擔(dān)了遍歷對(duì)象鍵值的任務(wù)。

但是兩者實(shí)際上是不一樣的!

for in會(huì)遍歷對(duì)象原型鏈上所有的屬性,包括繼承下來(lái)的屬性,而 Object.keys 只會(huì)遍歷對(duì)象本身自己擁有的屬性,因此在一些場(chǎng)景下 Object.keys 更快,所以在很多場(chǎng)景下我們都應(yīng)該優(yōu)先使用Object.keys 。

var a = {a1:1,a2:2,a3:3};
var b = {b1:1,b2:2,b3:3};
b.__proto__ = a;
for(var key in b) {
   console.log(key); //b1,b2,b3,a1,a2,a3
}

Object.keys(b); //b1,b2,b3

參考:why-is-object-keys-faster-than-hasownproperty

而且由于該方法返回的是一個(gè)數(shù)組,因此我們也能很好的結(jié)合數(shù)組方法去處理對(duì)象中的數(shù)據(jù)

var obj = { a:"1", b:"2", c:"3" };
var values = Object.keys(obj).map(function(key){return obj[key]}); // 1,2,3
Object.freeze()Object.isFrozen
方法可以凍結(jié)一個(gè)對(duì)象。凍結(jié)對(duì)象是指那些不能添加新的屬性,不能修改已有屬性的值,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫(xiě)性的對(duì)象。也就是說(shuō),這個(gè)對(duì)象永遠(yuǎn)是不可變的。該方法返回被凍結(jié)的對(duì)象。

注意的是這個(gè)方法只會(huì)凍結(jié)被傳入的對(duì)象,而不會(huì)凍結(jié)對(duì)象key值所引用的對(duì)象。

var obj = {a: {b: "c" }};

Object.freeze(obj);
obj.a = 123; //不能成功賦值,但也不會(huì)報(bào)錯(cuò),只會(huì)靜默失敗
obj.a.b = "d"; //能成功賦值 => {a: {b: "d"}}

類(lèi)似的方法還有Object.seal(obj)Object.preventExtensions(obj)

Object.freeze引入不可變數(shù)據(jù)概念,但是由于實(shí)際開(kāi)發(fā)中對(duì)性能的憂慮,實(shí)際很少被用到。

如果有場(chǎng)景需要避免對(duì)象使用者修改對(duì)象,Object.freeze將是一個(gè)很好的方法。而且由于數(shù)組[]也是一種對(duì)象,同樣也可以為通過(guò)該方法凍結(jié)數(shù)組。

Array

對(duì)于數(shù)組標(biāo)準(zhǔn)API的擴(kuò)展可以說(shuō)是ES5.1中的重頭戲,這些核心API今天和未來(lái)都將為我們帶來(lái)便利和啟發(fā), 這里列舉和介紹一些常用的標(biāo)準(zhǔn)API。

Array.isArray()
Array.isArray() 方法用來(lái)判斷某個(gè)值是否為數(shù)組。如果是,則返回 true,否則返回 false。

javascript有六種原始數(shù)據(jù)類(lèi)型primitive,包括undefined,object,function,boolean,number,string

其中object包括四種能通過(guò)語(yǔ)法糖構(gòu)造的形態(tài){},null,/w+/(正則表達(dá)式),[](數(shù)組)

對(duì)于后三種特殊objectnull可以使用xxx === null,正則表達(dá)式可以通過(guò)xxx instanceof RegExp判斷,而數(shù)組大多數(shù)時(shí)候似乎可以通過(guò)xxx instanceof Array判斷。

但是數(shù)組的情況仍然比較特殊,主要是數(shù)組在iframe中被傳遞時(shí)的場(chǎng)景,xxx instanceof Array會(huì)出現(xiàn)誤判。這種情況較為罕見(jiàn),相關(guān)資料參考:

Difference between using Array.isArray and instanceof Array

Determining with absolute accuracy whether or not a JavaScript object is an array

盡管xxx instanceof ArrayArray.isArray()大多數(shù)時(shí)候表現(xiàn)是一致的,但是我們?nèi)匀粦?yīng)該使用更加完備健壯的后者。

注意的是該方法并不能判斷一些很像數(shù)組的對(duì)象ArrayLike,例如querySelectorAll返回的ElementsList,通過(guò)ES6(ECMAScript 2015)引入的Array.from我們可以將其轉(zhuǎn)換成為標(biāo)準(zhǔn)數(shù)組

[...].forEach(fn)
讓數(shù)組的每一項(xiàng)都執(zhí)行一次給定的函數(shù),返回值為undefined

大多數(shù)時(shí)候該方法是語(yǔ)句for(var i=0;i的替代,在解決作用域變量提升的時(shí)候forEach是一個(gè)很好的方法。

對(duì)于大規(guī)模的數(shù)組處理,forEach性能比for語(yǔ)句要慢很多,而且有沒(méi)有額外的產(chǎn)出,筆者覺(jué)得大多數(shù)時(shí)候比較雞肋。但是forEach仍然可能算是讀過(guò)的代碼中使用頻率較高的數(shù)組方法之一。

[...].map(fn)
返回一個(gè)由原數(shù)組中的每個(gè)元素調(diào)用一個(gè)指定方法后的返回值組成的新數(shù)組。

map方法實(shí)際上是把一個(gè)數(shù)組映射成為另外一個(gè)數(shù)組

功能雖然簡(jiǎn)單,和forEach很像,但因?yàn)槟芊祷匦碌臄?shù)組而變得十分實(shí)用(失之毫厘,差之千里)。

對(duì)于任何一個(gè)數(shù)組集合,都可以使用map進(jìn)行映射操作,實(shí)現(xiàn)很豐富的功能,而且保證代碼的可讀性,該API也十分受開(kāi)發(fā)者歡迎。

**

var arr = ["a","b","c"]
var arrToUpperCase = arr.map(function(ele,index){return ele.toUpperCase()});
// ["A","B","C"]
[...].filter(fn)
方法使用指定的函數(shù)測(cè)試所有元素,并返回一個(gè)包含所有通過(guò)測(cè)試的元素的新數(shù)組。

同樣也是十分實(shí)用的方法,有時(shí)候會(huì)看到不熟悉的小伙伴會(huì)使用for和新數(shù)組push實(shí)現(xiàn)類(lèi)似的功能。

var alinks = docuement.querySelector("ul a");
var alinksValid = arrayFrom(alinks).filter(function(a){
    return a.getAttribute("href")[0]!=="#"
})

function arrayFrom(arrayLike){
    //... Array.from polyfill
}

/* 
[
   
   ,
   ,
]
*/
[...].some(fn)
方法測(cè)試數(shù)組中的某些元素是否通過(guò)了指定函數(shù)的測(cè)試,返回boolen值

非常實(shí)用的功能,判斷數(shù)組中是否某元素符合特定條件。如果傳入的方法校驗(yàn)為true則余下的元素都不會(huì)繼續(xù)遍歷,不會(huì)有冗余的元素訪問(wèn)。

var arr = [
   {name:"xiaoA"}
   ,{name:"xiaoB"}
   ,{haha:">_<"} 
   ,{name:"xiaoB"} //不會(huì)被訪問(wèn),已經(jīng)跳出
]

arr.some(function(ele){return !!ele.haha}) // true

該方法有很多用途

數(shù)組元素進(jìn)行一些靈活的校驗(yàn)

選擇數(shù)組中第一個(gè)符合條件的元素

for continue break組合相比,.some方法提供更好的可讀性和靈活性。

[...].every(fn)

some類(lèi)似,但作用是檢查所有元素是否符合條件,與some互為補(bǔ)充。大多數(shù)場(chǎng)景下都可以用some實(shí)現(xiàn)相關(guān)的判斷,使用頻率不高。

[...].reduce()[...].reduceRight()
方法接收一個(gè)函數(shù)作為累加器(accumulator),數(shù)組中的每個(gè)值(從左到右)開(kāi)始合并,最終為一個(gè)值。

最靈活的方法,能夠?qū)崿F(xiàn)非常豐富的功能。

reducereduceRight作用一樣,不同的是分別是從左右方向開(kāi)始累加

reduce(fn,initialValue)方法第二個(gè)參數(shù)為初始值initialValue,會(huì)傳入累加方法的第一次調(diào)用時(shí)的第一個(gè)參數(shù)中,默認(rèn)是數(shù)組的第一個(gè)元素

累加運(yùn)算

作為累加器,數(shù)值計(jì)算可以說(shuō)是最普通的使用方法。

[1,2,3].reduce(function(a,b){return a+b}); // 1+2+3 => 6
數(shù)組去重
[1,2,2,3,3,3].reduce(function(arr,curr){
    if (arr.some(equal(curr))) return arr;
    arr.push(curr);
    return arr;
},[]); // [1,2,3]

function equal(value){
    return function(target){return value===target}
}
對(duì)象K-V倒置
var obj = { a:1, b:2, c:3 }
Object.keys(obj).reduce(function(_obj,key){
    _obj[obj[key]] = key;
    return _obj;
},{}) // {1:"a", 2:"b", 3:"c"}

...更多

數(shù)組加工管道

map、filterreduce都能返回一個(gè)數(shù)組,因此我們可以讓其通過(guò)鏈?zhǔn)?/b>組合成為數(shù)組加工的管道。

[...].map(fn).filter(fn).reduce(fn)
JSON

兩個(gè)JSON方法都很常用了~

JSON.parse()
根據(jù)rfc4627標(biāo)準(zhǔn)解析JSON文本。

注意parse如果結(jié)果錯(cuò)誤時(shí)會(huì)拋出異常,阻塞當(dāng)次事件循環(huán)中接下來(lái)的代碼。所以通常需要進(jìn)行try catch進(jìn)行防御性校驗(yàn)

function JSONparseSafe(str) {
    try {
       return JSON.parse(str);
    } catch(e) {
       console.warn(str,e);
    }
    return {};
}

補(bǔ)充:該方法有第二個(gè)參數(shù)

JSON.parse(text[, reviver])

reviver 可選 一個(gè)函數(shù),用來(lái)轉(zhuǎn)換解析出的屬性值。

JSON.stringify()
把對(duì)象序列化成為JSON格式字符串

很常用了~,和JSON.parse()一樣會(huì)拋出異常,筆者認(rèn)為同樣需要進(jìn)行try catch進(jìn)行防御性校驗(yàn)

注意該方法還有第二和第三個(gè)參數(shù)的

JSON.stringify(value[, replacer [, space]])

replacer

如果該參數(shù)是一個(gè)函數(shù),則在序列化過(guò)程中,被序列化的值的每個(gè)屬性都會(huì)經(jīng)過(guò)該函數(shù)的轉(zhuǎn)換和處理;如果該參數(shù)是一個(gè)數(shù)組,則只有包含在這個(gè)數(shù)組中的屬性名才會(huì)被序列化到最終的 JSON 字符串中。關(guān)于該參數(shù)更詳細(xì)的解釋和示例,請(qǐng)參考使用原生的 JSON 對(duì)象一文。

space

指定縮進(jìn)用的空白字符串,用于美化輸出(pretty-print)。

序列化循環(huán)嵌套對(duì)象(circular structure)
var obj = { a:1, b:2 };
obj.self = obj;
// JSON.stringify(obj)
// Uncaught TypeError: Converting circular structure to JSON(…)

// 總所周知,JSON.stringify在序列化循環(huán)對(duì)象時(shí)會(huì)拋出異常
// 這時(shí)我們可以使用這樣來(lái)解決循環(huán)對(duì)象的問(wèn)題
JSON.stringify(obj ,function(key,value){
    if (key && value === obj) return "{[circular]}"
    return value
}) //"{"a":1,"b":2,"self":"{[circular]}"}"
String "string".trim()
方法會(huì)刪除一個(gè)字符串兩端的空白字符。在這個(gè)字符串里的空格包括所有的空格字符
("     aa     ").trim() //"aa"

方法雖然簡(jiǎn)單,但是那些還用正則替換實(shí)現(xiàn)同樣的功能的同學(xué)好自為之吧<_<

Date

Date.now

Date.prototype.toISOString

保留關(guān)鍵字

雖然在ES5時(shí)代,ES6的具體標(biāo)準(zhǔn)特性還沒(méi)有定稿,但是已經(jīng)定義一些"未來(lái)"會(huì)被使用的保留的關(guān)鍵字,在完全實(shí)現(xiàn)ES5標(biāo)準(zhǔn)的瀏覽器/JS引擎中關(guān)鍵字是不能作為字面量(literal)名的,否則將會(huì)報(bào)錯(cuò)。這些關(guān)鍵字包括:

class

extend

super

enum

import

export

var class = "abc" // Uncaught SyntaxError: Unexpected token =

嗯,沒(méi)錯(cuò)我們將(已經(jīng))在ES6中用上了他們。

兼容性與性能 影響

雖然如今再談這些"老掉牙"的方法,在如今這個(gè)言必及ES6的時(shí)代略顯落伍,但是ES5作為javascript發(fā)展中的重要一環(huán),我們?nèi)匀挥斜匾ナ煜ず土私馑?/p>

隨著Web的發(fā)展,前端開(kāi)發(fā)者對(duì)javascript數(shù)據(jù)處理能力的訴求越來(lái)越強(qiáng)烈,以至于誕生了后來(lái)如jQueryunderscore等廣泛使用的工具庫(kù)。

ECMAScript 5的到來(lái)也正是響應(yīng)這一訴求,通過(guò)對(duì)js標(biāo)準(zhǔn)庫(kù)的擴(kuò)展,極大的增強(qiáng)了js的處理數(shù)據(jù)的能力,尤其是面對(duì)js中[](數(shù)組)和{}(對(duì)象/哈希表)為核心的復(fù)合數(shù)據(jù)類(lèi)型時(shí)。標(biāo)準(zhǔn)API抹平了不同工具庫(kù)對(duì)同一個(gè)功能的實(shí)現(xiàn)差異,同時(shí)也提高了代碼的可讀性。

ECMAScript 5的API設(shè)計(jì)也吸收了其他類(lèi)型編程語(yǔ)言中實(shí)用思想,例如管道(pipeline)、無(wú)副作用(no side effects)、數(shù)據(jù)不可變(immumable)等概念,更后來(lái)引入的Stream(pipe(...).pipe(...))和Promise(then(...).then(...))也能看到這些影子。

還促進(jìn)了實(shí)用工具庫(kù)的完善,例如后來(lái)的lodashramda等工具庫(kù)。

ES6也是朝著同樣的方向?qū)s進(jìn)行完善。

有了這些工具,開(kāi)發(fā)者最終能從數(shù)據(jù)處理繁雜的邏輯中解放出來(lái),去關(guān)注那些用戶關(guān)注的部分(界面、核心邏輯等)

兼容性
http://kangax.github.io/compa...

作為javascript標(biāo)準(zhǔn)庫(kù),ES5的特性已經(jīng)被主流瀏覽器完全支持,包括桌面端移動(dòng)端Node.js中都可以放心使用。
(即使你的客戶還在使用IE5、IE7、IE8,大多數(shù)也能使用es5-polyfill進(jìn)行兼容)

性能

對(duì)某些標(biāo)準(zhǔn)API帶來(lái)潛在性能損耗的猜疑確實(shí)使得相當(dāng)多小伙伴望而卻步,但是我們?nèi)匀粦?yīng)該去了解這些標(biāo)準(zhǔn)的API,學(xué)習(xí)他們的設(shè)計(jì)思想,即便在一些性能要求較高的場(chǎng)景中,我們?nèi)匀荒軌蛞詷?biāo)準(zhǔn)作為參考,設(shè)計(jì)出優(yōu)雅的可讀性高的方法,而在大部分的場(chǎng)景中我認(rèn)為應(yīng)該合理去使用它們,享受標(biāo)準(zhǔn)完善帶來(lái)的紅利。

這樣能以一個(gè)更好地準(zhǔn)備,擁抱未來(lái)更多的新特性。

相關(guān)鏈接

JavaScript 標(biāo)準(zhǔn)庫(kù) - MDN

Optimization-killers - bluebird (JavaScript性能優(yōu)化技巧)

Composers and audiences (譯文)

Enjoy!

~ 當(dāng)我們?yōu)?b>ES6的特性感到興奮的同時(shí), 我們已經(jīng)知曉如何應(yīng)用ES5了嗎?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86477.html

相關(guān)文章

  • ECMAScript 5.1 實(shí)用特性概覽

    摘要:返回一個(gè)由原數(shù)組中的每個(gè)元素調(diào)用一個(gè)指定方法后的返回值組成的新數(shù)組。方法測(cè)試數(shù)組中的某些元素是否通過(guò)了指定函數(shù)的測(cè)試,返回值非常實(shí)用的功能,判斷數(shù)組中是否某元素符合特定條件。 ECMAScript 5發(fā)布于2009年12月。ECMAscript 5.1版(下文稱ES5)發(fā)布于2011年6月,,并且成為ISO國(guó)際標(biāo)準(zhǔn)(ISO/IEC 16262:2011) http://www.ecma...

    bang590 評(píng)論0 收藏0
  • es6

    摘要:只要上述版權(quán)通知版權(quán)許可和免責(zé)聲明均包含在所有此類(lèi)副本和衍生物中。它應(yīng)用于網(wǎng)景后來(lái)所有的瀏覽器中以及微軟之后的版本中。年月,這份標(biāo)準(zhǔn)采用快速程序提交給,并被核準(zhǔn)成為國(guó)際標(biāo)準(zhǔn)。標(biāo)準(zhǔn)第三版在年月會(huì)議上通過(guò)并在年月作為標(biāo)準(zhǔn)發(fā)布。 ECSA-262標(biāo)準(zhǔn)第六版/2015年6月 ECMAScript 2015語(yǔ)言規(guī)范 這是 ECMA-262 第六版,ECMAScript 2015 語(yǔ)言規(guī)范 HTM...

    blair 評(píng)論0 收藏0
  • javascript如何判斷變量的數(shù)據(jù)類(lèi)型

    摘要:除和外,所有的數(shù)據(jù)類(lèi)型都是可以轉(zhuǎn)化為對(duì)象,而如果是對(duì)象,就肯定有構(gòu)造函數(shù)。特性因?yàn)楹蜎](méi)有構(gòu)造函數(shù),因此不能用此方法來(lái)判斷。由于同一條原型繼承鏈上的各個(gè)對(duì)象的構(gòu)造函數(shù)都不一樣,因此,此方法可以區(qū)分開(kāi)繼承鏈上的各個(gè)自定義數(shù)據(jù)類(lèi)型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...

    曹金海 評(píng)論0 收藏0
  • ES6-前世今生(0)

    摘要:更新了個(gè)版本,最新正式版是語(yǔ)言的下一代標(biāo)準(zhǔn),早已在年月正式發(fā)布。基本不支持移動(dòng)端瀏覽器對(duì)的支持情況版起便可以支持的新特性。比較通用的工具方案有,,,等。 1、ECMAScript是什么? 和 JavaScript 有著怎樣的關(guān)系? 1996 年 11 月,Netscape 創(chuàng)造了javascript并將其提交給了標(biāo)準(zhǔn)化組織 ECMA,次年,ECMA 發(fā)布 262 號(hào)標(biāo)準(zhǔn)文件(ECMA-...

    LeviDing 評(píng)論0 收藏0
  • [ ES6 ] 一. ECMAScript 6 相關(guān)學(xué)習(xí)資源

    摘要:瀏覽器兼容性列表可以看到還是全線飄紅的和支持特新列表?yè)?jù)此在和上使用這些新特新待補(bǔ)充二相關(guān)教程最重要的產(chǎn)品規(guī)格書(shū),什么教程也脫離不了這里的標(biāo)準(zhǔn),英文好的還是多看點(diǎn)。 一. ES6新特性相關(guān) es6features : 經(jīng)典的ES6新特性預(yù)覽,github 逼近 10k star . ES6新特性概覽 :同樣也很全面的特性介紹的中文版。 瀏覽器兼容性列表 :可以看到還是全線飄紅的~~~ ...

    Towers 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<