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

2018-08-07 15:23 更新

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


JavaScript 語言精粹

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

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

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

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

JavaScript 之美

繼承

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

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

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 都足夠靈活,拼拼湊湊,上面那些東西都能“模擬”著用。

說到?jīng)]有類的這個(gè)問題,很多人總是要糾正其他人關(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)能解決大部分問題。剩下的小部分問題,肯定是設(shè)計(jì)錯(cuò)誤。:)

參見:

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

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

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

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

控制流

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

基本運(yùn)算符

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

計(jì)算型屬性

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

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

運(yùn)算符重載

類型轉(zhuǎn)換

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

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

相等比較

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

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

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

嵌套類型

隨便弄。

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

拓展

當(dāng)無法接觸一個(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 方面的庫,時(shí)不時(shí)就去 stub 原生 http 庫的方法,0.11 時(shí)的 node.js 完全不按章法出牌,所以很多這些庫都出現(xià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ì)量高的庫,并用質(zhì)量高的方式拼湊起來。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)