Node.js 14:《js 中的那些最佳實(shí)踐》

2018-08-07 15:23 更新

這個(gè)章節(jié)需要大家?guī)兔ρa(bǔ)充,一次性想不完那么多


JavaScript 語(yǔ)言精粹

http://book.douban.com/subject/3590768/

這本書很薄,只有 155 頁(yè),但該講的幾乎都講了。大家想辦法搞來(lái)看看吧(我總不能很沒節(jié)操地給個(gè)電子版 PDF 鏈接在這里吧)。

js 這門語(yǔ)言,水很淺。沒有太復(fù)雜的地方可以鉆,但特么的坑又多。

上面的那本書是一定要看的。這本書專注在講 js 語(yǔ)法,其他 js 的書都過(guò)多地涉及了瀏覽器知識(shí)。

JavaScript 之美

繼承

js 前端不懂有什么好辦法,后端的話,很方便。

用 node 官方的 util 庫(kù),下面是直接從官網(wǎng)摘抄來(lái)的:

var util = require("util");
var events = require("events");

function MyStream() {
    events.EventEmitter.call(this);
}

util.inherits(MyStream, events.EventEmitter);

MyStream.prototype.write = function(data) {
    this.emit("data", data);
}

var stream = new MyStream();

console.log(stream instanceof events.EventEmitter); // true
console.log(MyStream.super_ === events.EventEmitter); // true

stream.on("data", function(data) {
    console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"

js 是面向?qū)ο蟮模鞘恰盎谠偷拿嫦驅(qū)ο蟆?,沒有類。沒有多重繼承,沒有接口。沒有結(jié)構(gòu)體,沒有枚舉類型。

但它的字面量哈希和 function 都足夠靈活,拼拼湊湊,上面那些東西都能“模擬”著用。

說(shuō)到?jīng)]有類的這個(gè)問(wèn)題,很多人總是要糾正其他人關(guān)于 js 原型的理解的。我覺得這是沒有必要的?;谠陀植皇呛芘1?,ES6不是照樣給出了 class 關(guān)鍵字嗎。不管類還是原型都是為了抽象,爛的東西始終爛,不好理解的始終不好理解。

最近學(xué)習(xí) ios 的 swift,看見里面有不少相比 objc 舒服的改進(jìn)。比如 objc 的“方法調(diào)用”,學(xué)的是 smalltalk 那一套,那不叫方法調(diào)用,而是消息傳遞。結(jié)果 swift 里面不照樣是方法調(diào)用的形式?

callback hell

用 eventproxy 和 async 已經(jīng)能解決大部分問(wèn)題。剩下的小部分問(wèn)題,肯定是設(shè)計(jì)錯(cuò)誤。:)

參見:

數(shù)據(jù)類型

寫 js 很少去定義類。Object 的便利在多數(shù)其他語(yǔ)言需要定義類的場(chǎng)景下都能直接用。

js 中,用好 Number,String,Array,Object 和 Function 就夠了。有時(shí)用用 RegExp。

用于 js 這門語(yǔ)言本身的殘廢,大多數(shù)時(shí)候都采用“約定勝于配置”的思想來(lái)交互合作。

控制流

很常規(guī),C 語(yǔ)言那套。

基本運(yùn)算符

C 語(yǔ)言那套。二進(jìn)制操作并不會(huì)降低效率,V8 很聰明的。

計(jì)算型屬性

也就是幫一個(gè)對(duì)象的屬性定義 get 和 set 方法,通過(guò) obj.value 和 obj.value= 的形式來(lái)調(diào)用。

koa(http://koajs.com/ ) 把這套玩得爐火純青。

運(yùn)算符重載

無(wú)

類型轉(zhuǎn)換

手動(dòng)幫你需要轉(zhuǎn)換的類型的類定義 .toxxx 方法,比如 .toString,.toJSON,toNumber。

js 的隱式類型轉(zhuǎn)換用一次坑一次。

相等比較

在 js 中,務(wù)必使用 === 三個(gè)等于號(hào)來(lái)比較對(duì)象,或者自定義方法來(lái)比較,不要使用 ==。

我最近做一個(gè)項(xiàng)目,從數(shù)據(jù)庫(kù)中取出的數(shù)據(jù),雖然應(yīng)該是字符型的,但有時(shí)它們是 String 的表示,有時(shí)是 Number 的表示。為了省事,會(huì)有人直接用 == 來(lái)對(duì)它們進(jìn)行比較。這種時(shí)候,建議在比較時(shí),把它們都轉(zhuǎn)成 String 類型,然后用=== 來(lái)比較。

比如 var x = 31243; var y = '31243',比較時(shí),這么做:String(x) === String(y)

嵌套類型

隨便弄。

function 構(gòu)造函數(shù)、閉包、字面量哈希,都可以混在一起寫,多少層都行,無(wú)限制。

拓展

當(dāng)無(wú)法接觸一個(gè)類的源碼,又想幫這個(gè)類新增方法的時(shí)候。操作它的 prototype 就好了。但不推薦!

函數(shù)式編程

js 中,匿名函數(shù)非常的方便,有效利用函數(shù)式編程的特性可以使人寫代碼時(shí)心情愉悅。

使用 lodash:https://lodash.com/docs

泛型

類型都經(jīng)常忽略還泛型!every parammeter is 泛型 in js

權(quán)限控制

類定義中,沒有 public private 等關(guān)鍵詞,都靠約定。而且經(jīng)常有人突破約定。

有些 http 方面的庫(kù),時(shí)不時(shí)就去 stub 原生 http 庫(kù)的方法,0.11 時(shí)的 node.js 完全不按章法出牌,所以很多這些庫(kù)都出現(xiàn)兼容性問(wèn)題。

設(shè)計(jì)模式

《解密設(shè)計(jì)模式-王垠》

https://github.com/alsotang/node-lessons/blob/master/lesson14/%E8%A7%A3%E5%AF%86%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%8E%8B%E5%9E%A0.md

構(gòu)建大型項(xiàng)目

從 npm 上面尋找質(zhì)量高的庫(kù),并用質(zhì)量高的方式拼湊起來(lái)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)