国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES規(guī)范解讀之自增操作符

junnplus / 3105人閱讀

摘要:對于這種疑問,我們只能求助給出官方解釋后自增操作符從上的算法描述,我們能夠清晰的得知,后自增操作符是先自增賦值,然后返回自增前的值,這樣的一個順序。

ES規(guī)范解讀之自增操作符

原文:https://github.com/kuitos/kuitos.github.io/issues/24
幾個月前,不知道什么緣由跟同事討論了起js里自增操作符(i++)的問題,現(xiàn)將前因后果整理出來,傳于世人?

事情起源于這樣一段代碼

var i = 0;
i = i++;
console.log(i);

來,都來說說答案是啥?
結(jié)果是0
換一種形式,或許大家不會有多少疑問

var i = 0;
var a = i++;
console.log(a); // 0

沒錯,這也是我們初學自增操作符的經(jīng)典例子,對這結(jié)果還有疑問請自覺面壁。。。
遙想當年學習自增操作符的口訣大致是,i++ 是先用后自增,++i 是先自增再用
那么按照這個思路,上面的代碼解析流程應該是這樣的

var i =0;
i = i;
i = i + 1;

可惜結(jié)果并不是這樣的
按照犀牛書上的描述,后增量(post increment)操作符的特點是

它對操作數(shù)進行增量計算,但返回未作增量計算的(unincremented)值。

但是書上并沒有告訴我們,先做增量計算再返回之前的值,還是返回之前的值再做增量計算。
對于這種疑問,我們只能求助ecmascript給出官方解釋:

Postfix Increment Operator(后自增操作符)

The production PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ is evaluated as follows:

Evaluate LeftHandSideExpression.

Call GetValue(Result(1)).

Call ToNumber(Result(2)).

Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).

Call PutValue(Result(1), Result(4)).

Return Result(3).

從es上的算法描述,我們能夠清晰的得知,后自增操作符是先自增賦值,然后返回自增前的值,這樣的一個順序。
到這里還不算完。
既然i=i++這種操作最后i還是為原始值,也就是這段代碼不會有任何實際意義,那么js引擎有沒有可能針對性的做優(yōu)化,從而避免不必要的自增運算?(如果你用的是IDE,IDE會提示你這是一段無用的代碼)
也就是說,我們?nèi)绾未_定,執(zhí)行引擎一定做了兩步操作:

i = i + 1; return iBeforeIncrease = 0;

i = iBeforeIncrease;

還是執(zhí)行引擎可能會針對性的優(yōu)化,只做一步操作:

i = iBeforeIncrease;

當我在想怎么去確定這一點時,松波給出了解決方案,用Object.observe()方法?。?!(該方法是ES7提案中的新api,不過chrome早早的實現(xiàn)了)

var obj = {i:0};
Object.observe(obj, function(changes){
    console.log(changes);
});
obj.i = obj.i++;

代碼放到chrome中跑一下,可以看到,改變觸發(fā)了兩次,也就是i做了兩次修改操作
另外firefox中也提供了一個類似的api,Object.prototype.watch,有興趣的同學可以試試用這個方式來驗證一下。

順便抖個機靈,自增操作是非原子性操作,是非線程安全的,多線程環(huán)境下共用變量使用自增操作符是會有問題的(前端同學們別急,ES7會為我們帶來js多線程編程體驗?)。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86003.html

相關(guān)文章

  • lodash源碼分析之baseFindIndex中的運算符優(yōu)先級

    摘要:從表中可以看到,比較運算符的優(yōu)先級為,而三元表達式條件運算符的優(yōu)化級為,因此可以確定比較運算符的優(yōu)先級要比三元表達式的要高,循環(huán)條件其實等價于第二種寫法。從上表中也可以看出前綴自增比比較運算符的優(yōu)化級要高。 我悟出權(quán)力本來就是不講理的——蟑螂就是海米;也悟出要造反,內(nèi)心必須強大到足以承受任何后果才行。——北島《城門開》 本文為讀 lodash 源碼的第十篇,后續(xù)文章會更新到這個倉庫中...

    Meathill 評論0 收藏0
  • 從 ++[[]][+[]]+[+[]]==10? 深入淺出弱類型 JS 的隱式轉(zhuǎn)換

    摘要:與此相對,強類型語言的類型之間不一定有隱式轉(zhuǎn)換。三為什么是弱類型弱類型相對于強類型來說類型檢查更不嚴格,比如說允許變量類型的隱式轉(zhuǎn)換,允許強制類型轉(zhuǎn)換等等。在中,加性運算符有大量的特殊行為。 從++[[]][+[]]+[+[]]==10?深入淺出弱類型JS的隱式轉(zhuǎn)換 本文純屬原創(chuàng)? 如有雷同? 純屬抄襲? 不甚榮幸! 歡迎轉(zhuǎn)載! 原文收錄在【我的GitHub博客】,覺得本文寫的不算爛的...

    miya 評論0 收藏0
  • ES規(guī)范解讀之賦值作符&屬性訪問器

    摘要:那么什么是基礎(chǔ)對象組件呢,舉兩個例子我們再來看看屬性訪問器,就是括號操作符及點號操作符都做了什么屬性訪問器也就是說括號跟點號對解釋器而言是一樣的。 ES規(guī)范解讀之賦值操作符&屬性訪問器 原文:https://github.com/kuitos/kuitos.github.io/issues/24事情起源于某天某妹子同事在看angular文檔中關(guān)于Scope的說明Understandin...

    funnyZhang 評論0 收藏0
  • ECMAScript 2018 標準導讀

    摘要:標準對象,語義由本規(guī)范定義的對象。三個冒號作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因為帶來的問題,基本上是占著茅坑不拉屎的行為導致。以數(shù)組測試操作為例,標準中的描述如下相對于來說,規(guī)范中增加了對的處理。 前言 本文是對《ECMAScript 2018 Language Specification》的解讀。本文是對標準的概述性導讀,不是對 ES2018特性的詳細描述,也不會針對某個技術(shù)...

    MiracleWong 評論0 收藏0
  • JavaScript深入之從ECMAScript規(guī)范解讀this

    摘要:深入系列第六篇,本篇我們追根溯源,從規(guī)范解讀在函數(shù)調(diào)用時到底是如何確定的。因為我們要從規(guī)范開始講起。規(guī)范類型包括和。下一篇文章深入之執(zhí)行上下文深入系列深入系列目錄地址。如果有錯誤或者不嚴謹?shù)牡胤?,請?wù)必給予指正,十分感謝。 JavaScript深入系列第六篇,本篇我們追根溯源,從 ECMAScript5 規(guī)范解讀 this 在函數(shù)調(diào)用時到底是如何確定的。 前言 在《JavaScript...

    TIGERB 評論0 收藏0

發(fā)表評論

0條評論

junnplus

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<