鍍金池/ 教程/ Android/ <a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
Launch mode 和 Intent flags專題
Canvas &amp; Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
Memory leak專題
React基礎
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再強轉是一定會失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關系型數(shù)據(jù)庫設計范式
《App研發(fā)錄》一書
REST API設計
Google IO 2015摘要
自定義View/ViewGroup以及高性能實現(xiàn)自定義UI
安卓系統(tǒng)點擊事件處理
《50 Android Hacks》一書
Building Apps with Content Sharing
Flux基礎
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機制
Java對象內存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(<a rel="nofollow" href="http://develop
Futurice公司安卓團隊的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項目架構
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設計模式解析與實戰(zhàn)》一書
Rx在Android中的最佳實踐
函數(shù)調用時,傳遞參數(shù)應該是不可變的(Immutable)
ProGuard
面向對象六大原則(SOLID+)
深入理解Java虛擬機
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測試驅動開發(fā)/安卓測試驗證
暗時間:學會正確思考
技術筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動效專題
Feed系統(tǒng)的設計
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點子
WebRTC

<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">

迭代器和for-of循環(huán)

  • 不要用for-in循環(huán)遍歷數(shù)組,它是用于遍歷普通對象的各個屬性的key的;
  • for-of循環(huán)可以用來遍歷數(shù)組,沒有for-in的缺陷,也沒有forEach的缺陷:無法break, continue, return;
  • for-in循環(huán)用來遍歷對象屬性,for-of循環(huán)用來遍歷數(shù)據(jù):例如數(shù)組中的值;
  • for-of還支持其他集合的遍歷(Map, Set),也能用于字符串遍歷(視其為Unicode字符數(shù)組);

    for (var value of myArray) {
      console.log(value);
    }
    
    var uniqueWords = new Set(words);
    for (var word of uniqueWords) {
      console.log(word);
    }
    
    for (var [key, value] of phoneBookMap) {
      console.log(key + "'s phone number is: " + value);
    }
  • for-of循環(huán)語句通過方法調用(迭代器方法)來遍歷各種集合
  • 迭代器對象

    • 擁有[Symbol.iterator]()的對象被稱為可迭代的
    • 迭代器對象可以是任意具有.next()方法的對象
    • for-of循環(huán)將重復調用這個方法,每次循環(huán)調用一次
    var zeroesForeverIterator = {
    [Symbol.iterator]: function () {
      return this;
      },
      next: function () {
      return {done: false, value: 0};
    }
    };

生成器 Generators

function* quips(name) {
  yield "你好 " + name + "!";
  yield "希望你能喜歡這篇介紹ES6的譯文";
  if (name.startsWith("X")) {
    yield "你的名字 " + name + "  首字母是X,這很酷!";
  }
  yield "我們下次再見!";
}
  • 普通函數(shù)使用function聲明,而生成器函數(shù)使用function*聲明。
  • 在生成器函數(shù)內部,有一種類似return的語法:關鍵字yield。二者的區(qū)別是,普通函數(shù)只可以return一次,而生成器函數(shù)可以yield多次(當然也可以只yield一次)。在生成器的執(zhí)行過程中,遇到yield表達式立即暫停,后續(xù)可恢復執(zhí)行狀態(tài)。
  • 這就是普通函數(shù)和生成器函數(shù)之間最大的區(qū)別,普通函數(shù)不能自暫停,生成器函數(shù)可以。
  • 執(zhí)行效果:
> var iter = quips("jorendorff");
  [object Generator]
> iter.next()
  { value: "你好 jorendorff!", done: false }
> iter.next()
  { value: "希望你能喜歡這篇介紹ES6的譯文", done: false }
> iter.next()
  { value: "我們下次再見!", done: false }
> iter.next()
  { value: undefined, done: true }
  • 調用一個生成器時,它并非立即執(zhí)行,而是返回一個已暫停的生成器對象,以后對其每調用一次.next()方法,函數(shù)調用將其自身解凍并一直運行到下一個yield表達式,再次暫停。
  • 調用最后一個iter.next()時,我們最終抵達生成器函數(shù)的末尾,所以返回結果中done的值為true
  • 每當生成器執(zhí)行yield語句,生成器的堆棧結構(本地變量、參數(shù)、臨時值、生成器內部當前的執(zhí)行位置)被移出堆棧。然而,生成器對象保留了對這個堆棧結構的引用(備份),所以稍后調用.next()可以重新激活堆棧結構并且繼續(xù)執(zhí)行。
  • 值得特別一提的是,生成器不是線程,當生成器運行時,它和調用者處于同一線程中,擁有確定的連續(xù)執(zhí)行順序,永不并發(fā)。
  • 與系統(tǒng)線程不同的是,生成器只有在其函數(shù)體內標記為yield的點才會暫停。
  • 生成器的作用
    • 生成器是迭代器:所有的生成器都有內建.next()[Symbol.iterator]()方法的實現(xiàn)。你只須編寫循環(huán)部分的行為。
    • 使任意對象可迭代。編寫生成器函數(shù)遍歷這個對象,運行時yield每一個值。然后將這個生成器函數(shù)作為這個對象的[Symbol.iterator]方法。
    • 簡化數(shù)組構建函數(shù)。
      • 獲取異常尺寸的結果。例如無限長的數(shù)組。
      • 重構復雜循環(huán)。
      • 構建與迭代相關的工具。
    • lazy計算。僅當需要時進行計算。
  • .next可選參數(shù)
  • .return
  • .throw
  • yield*

模板字符串

function authorize(user, action) {
  if (!user.hasPrivilege(action)) {
    throw new Error(
      `用戶 ${user.name} 未被授權執(zhí)行 ${action} 操作。`);
  }
}
  • 反撇號(`)基礎知識
    • 模板占位符中的代碼可以是任意JavaScript表達式,所以函數(shù)調用、算數(shù)運算等這些都可以作為占位符使用,你甚至可以在一個模板字符串中嵌套另一個,我稱之為模板套構(template inception)。
    • 如果這兩個值都不是字符串,可以按照常規(guī)將其轉換為字符串。例如:如果action是一個對象,將會調用它的.toString()方法將其轉換為字符串值。
    • 如果你需要在模板字符串中書寫反撇號、${,你必須使用反斜杠將其轉義。
    • 模板字符串可以多行書寫,模板字符串中所有的空格、新行、縮進,都會原樣輸出在生成的字符串中。
  • 反撇號的未來
    • 它們不會為你自動轉義特殊字符
    • 它們無法很好地與國際化庫相配合
    • 它們不能替代模板引擎的地位

不定參數(shù)和默認參數(shù)

  • 以前的版本中有“神奇的arguments對象”,ES6引入了與其他語言類似的不定參數(shù)語法:
function containsAll(haystack, ...needles) {
  for (var needle of needles) {
    if (haystack.indexOf(needle) === -1) {
      return false;
    }
  }
  return true;
}
  • 如果沒有額外的參數(shù),不定參數(shù)就是一個空數(shù)組,它永遠不會是undefined。
  • 默認參數(shù)也與c++類似,但有幾點需要注意
    • 默認值表達式在函數(shù)調用時自左向右求值,這一點與Python不同。這也意味著,默認表達式可以使用該參數(shù)之前已經(jīng)填充好的其它參數(shù)值。
    • 傳遞undefined值等效于不傳值,將使用定義的默認值
    • 沒有默認值的參數(shù)隱式默認為undefined
  • 停止使用arguments

解構(Destructuring)

  • 數(shù)組與迭代器的解構

    [ variable1, variable2, ..., variableN ] = array;
    • 可以對任意深度的嵌套數(shù)組進行解構
    • 可以在對應位留空來跳過被解構數(shù)組中的某些元素

      var [,,third] = ["foo", "bar", "baz"];
    • 還可以通過“不定參數(shù)”模式捕獲數(shù)組中的所有尾隨元素
    • 當訪問空數(shù)組或越界訪問數(shù)組時,對其解構與對其索引的行為一致,最終得到的結果都是:undefined
    • 數(shù)組解構賦值的模式同樣適用于任意迭代器

      function* fibs() {
        var a = 0;
        var b = 1;
        while (true) {
          yield a;
          [a, b] = [b, a + b];
        }
      }
      var [first, second, third, fourth, fifth, sixth] = fibs();
      console.log(sixth);
      // 5
  • 對象的解構

    var robotA = { name: "Bender" };
    var { name: nameA } = robotA;
    console.log(nameA);
    // "Bender"
    
    var { foo, bar } = { foo: "lorem", bar: "ipsum" };
    console.log(foo);
    // "lorem"
    
    var { missing } = {};
    console.log(missing);
    // undefined
    • 首先指定被綁定的屬性,然后緊跟一個要解構的變量。
    • 當屬性名與變量名一致時,可以通過一種實用的句法簡寫。
    • 可以隨意嵌套并進一步組合對象解構
    • 解構一個未定義的屬性時,得到的值為undefined
  • 解構值不是對象、數(shù)組或迭代器

    var {blowUp} = null;
    // TypeError: null has no properties(null沒有屬性)
    
    var {wtf} = NaN;
    console.log(wtf);
    // undefined
    • 當你嘗試解構null或undefined時,你會得到一個類型錯誤
    • 可以解構其它原始類型,例如:布爾值、數(shù)值、字符串,但是你將得到undefined
  • 當你要解構的屬性未定義時你可以提供一個默認值:

    var [missing = true] = [];
    console.log(missing);
    // true
  • 解構的實際應用
    • 函數(shù)參數(shù)定義:函數(shù)接收一個對象,將不同的實際參數(shù)作為對象屬性,以避免讓API使用者記住多個參數(shù)的使用順序。
    • 配置對象參數(shù):通過默認值實現(xiàn)
    • 與ES6迭代器協(xié)議協(xié)同使用:for (var [key, value] of map) { //... }
    • 多重返回值

箭頭函數(shù)(Arrow Functions)

符號 含義
<!-- 單行注釋
--> “趨向于”操作符
<= 小于等于
=> 這又是什么?
  • 箭頭函數(shù):=>,用于lambda語法
  • 使用了塊語句的箭頭函數(shù)不會自動返回值,你需要使用return語句將所需值返回。
  • 當使用箭頭函數(shù)創(chuàng)建普通對象時,你總是需要將對象包裹在小括號里。
    • puppy => {}會被解析為沒有任何行為并返回undefined的箭頭函數(shù)。
  • 箭頭函數(shù)沒有它自己的this

    • 通過object.method()語法調用的方法使用非箭頭函數(shù)定義,這些函數(shù)需要從調用者的作用域中獲取一個有意義的this值。
    • 其它情況全都使用箭頭函數(shù)。
    • 箭頭函數(shù)不會獲取它們自己的arguments對象
    • ES6的方法語法

      // ES6
      {
        ...
        addAll: function addAll(pieces) {
          _.each(pieces, piece => this.add(piece));
        },
        ...
      }
      
      // ===>>>
      
      // ES6的方法語法
      {
        ...
        addAll(pieces) {
          _.each(pieces, piece => this.add(piece));
        },
        ...
      }

Symbols

// 創(chuàng)建一個獨一無二的symbol
var isMoving = Symbol("isMoving");
...
if (!element[isMoving]) {
  smoothAnimations(element);
}
element[isMoving] = true;
  • Symbol是JavaScript的第七種原始類型:Undefined 未定義,Null 空值,Boolean 布爾類型,Number 數(shù)字類型,String 字符串類型,Object 對象類型
  • 以symbol為鍵的屬性屬性與數(shù)組元素類似,不能被類似obj.name的點號法訪問,你必須使用方括號訪問這些屬性。
  • 只有當isMoving在當前作用域中時才會生效
  • JavaScript中最常見的對象檢查的特性會忽略symbol鍵,例如:for-in循環(huán),Object.keys(obj),Object.getOwnPropertyNames(obj)
  • Object.getOwnPropertySymbols(obj)可以列出對象的symbol鍵;
  • Reflect.ownKeys(obj),會同時返回字符串鍵和symbol鍵
  • symbol被創(chuàng)建后就不可變更,你不能為它設置屬性(在嚴格模式下嘗試設置屬性會得到TypeError的錯誤)。他們可以用作屬性名稱,這些性質與字符串類似。
  • 每一個symbol都獨一無二,不與其它symbol等同,即使二者有相同的描述也不相等
  • symbol不能被自動轉換為字符串,這和語言中的其它類型不同。嘗試拼接symbol與字符串將得到TypeError錯誤。通過String(sym)或sym.toString()可以顯示地將symbol轉換為一個字符串。
  • 獲取symbol的三種方法
    • 調用Symbol()
    • 調用Symbol.for(string),如果同一個描述的symbol已經(jīng)存在,將返回已存在的symbol對象
    • 使用標準定義的symbol,例如:Symbol.iterator。標準根據(jù)一些特殊用途定義了少許的幾個symbol。

集合

  • 已經(jīng)有了一種類似哈希表的東西:對象(Object)。
  • 作為查詢表使用的對象,不能既支持方法又保證避免沖突。
  • 因而,要么得用Object.create(null)而非直接寫{},要么得小心地避免把Object.prototype.toString之類的內置方法名作為鍵名來存儲數(shù)據(jù)。
  • 對象的鍵名總是字符串(當然,ES6 中也可以是Symbol)而不能是另一個對象。
  • 沒有有效的獲知屬性個數(shù)的方法。
  • 純粹的對象不可遍歷,也就是,它們不能配合for-of循環(huán)或...操作符等語法。
  • 集合數(shù)據(jù)的訪問,不能再通過屬性方式了,只能通過暴露出來的接口(get等)。
  • Set, Map, WeakMap, WeakSet

代理(Proxy)

  • 對象的14種內部方法。
  • var proxy = new Proxy(target, handler);
  • 代理的行為很簡單:將代理的所有內部方法轉發(fā)至目標。簡單來說,如果調用proxy.[[Enumerate]](),就會返回target.[[Enumerate]]()
  • 句柄對象的方法可以覆寫任意代理的內部方法。

類(Class),繼承

...

  • 實例屬性,方法?
  • 靜態(tài)屬性,方法?
  • prototype?

letconst

  • ES6之前,只有兩種作用域:全局,函數(shù),沒有代碼塊作用域
  • var是函數(shù)作用域
  • 變量提升(hoisting)
  • ES6引入了新的作用域:代碼塊作用域;letconst都是這一作用域;

模塊

上一篇:REST API設計下一篇:WebRTC