Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
. JavaScript 有哪些數(shù)據(jù)類型,它們的區(qū)別?
JavaScript 共有八種數(shù)據(jù)類型,分別是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。
其中 Symbol 和 BigInt 是 ES6 中新增的數(shù)據(jù)類型:
●Symbol 代表創(chuàng)建后獨(dú)一無二且不可變的數(shù)據(jù)類型,它主要是為了 解決可能出現(xiàn)的全局變量沖突的問題。
●BigInt 是一種數(shù)字類型的數(shù)據(jù),它可以表示任意精度格式的整數(shù),使用 BigInt 可以安全地存儲(chǔ)和操作大整數(shù),即使這個(gè)數(shù)已經(jīng)超出了 Number 能夠表示的安全整數(shù)范圍。
這些數(shù)據(jù)可以分為原始數(shù)據(jù)類型和引用數(shù)據(jù)類型:
●棧:原始數(shù)據(jù)類型(Undefined、Null、Boolean、Number、String)●堆:引用數(shù)據(jù)類型(對象、數(shù)組和函數(shù))
兩種類型的區(qū)別在于存儲(chǔ)位置的不同:
●原始數(shù)據(jù)類型直接存儲(chǔ)在棧(stack)中的簡單數(shù)據(jù)段,占據(jù)空間 小、大小固定,屬于被頻繁使用數(shù)據(jù),所以放入棧中存儲(chǔ);
●引用數(shù)據(jù)類型存儲(chǔ)在堆(heap)中的對象,占據(jù)空間大、大小不固 定。如果存儲(chǔ)在棧中,將會(huì)影響程序運(yùn)行的性能;引用數(shù)據(jù)類型在棧 中存儲(chǔ)了指針,該指針指向堆中該實(shí)體的起始地址。當(dāng)解釋器尋找引 用值時(shí),會(huì)首先檢索其在棧中的地址,取得地址后從堆中獲得實(shí)體。
堆和棧的概念存在于數(shù)據(jù)結(jié)構(gòu)和操作系統(tǒng)內(nèi)存中,在數(shù)據(jù)結(jié)構(gòu)中:●在數(shù)據(jù)結(jié)構(gòu)中,棧中數(shù)據(jù)的存取方式為先進(jìn)后出。
●堆是一個(gè)優(yōu)先隊(duì)列,是按優(yōu)先級來進(jìn)行排序的,優(yōu)先級可以按照大 小來規(guī)定。
在操作系統(tǒng)中,內(nèi)存被分為棧區(qū)和堆區(qū):
●棧區(qū)內(nèi)存由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的 值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
●堆區(qū)內(nèi)存一般由開發(fā)者分配釋放,若開發(fā)者不釋放,程序結(jié)束時(shí)可 能由垃圾回收機(jī)制回收。
2. 數(shù)據(jù)類型檢測的方式有哪些
(1)typeof
其中數(shù)組、對象、null 都會(huì)被判斷為 object,其他判斷都正確。
(2)instanceof
instanceof 可以正確判斷對象的類型,其內(nèi)部運(yùn)行機(jī)制是判斷在其 原型鏈中能否找到該類型的原型。
可以看到,instanceof 只能正確判斷引用數(shù)據(jù)類型,而不能判斷其 本數(shù)據(jù)類型。instanceof 運(yùn)算符可以用來測試一個(gè)對象在其原型鏈 中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性。
(3) constructor
constructor 有兩個(gè)作用,一是判斷數(shù)據(jù)的類型,二是對象實(shí)例通過 constrcutor 對象訪問它的構(gòu)造函數(shù)。需要注意,如果創(chuàng)建一個(gè)對象 來改變它的原型,constructor 就不能用來判斷數(shù)據(jù)類型了:
(4)Object.prototype.toString.call()
Object.prototype.toString.call() 使用 Object 對象的原型方法 toString 來判斷數(shù)據(jù)類型:
同樣是檢測對象 obj 調(diào)用 toString 方法,obj.toString()的結(jié)果和 Object.prototype.toString.call(obj)的結(jié)果不一樣,這是為什 么?
這是因?yàn)?toString 是 Object 的原型方法,而 Array、function 等類 型作為 Object 的實(shí)例,都重寫了 toString 方法。不同的對象類型調(diào) 用 toString 方法時(shí),根據(jù)原型鏈的知識(shí),調(diào)用的是對應(yīng)的重寫之后
的 toString 方法(function 類型返回內(nèi)容為函數(shù)體的字符串,Array 類型返回元素組成的字符串…),而不會(huì)去調(diào)用 Object 上原型 toString 方法(返回對象的具體類型),所以采用 obj.toString() 不能得到其對象類型,只能將 obj 轉(zhuǎn)換為字符串類型;因此,在想要 得到對象的具體類型時(shí),應(yīng)該調(diào)用 Object 原型上的 toString 方法。
3. null 和 undefined 區(qū)別
首先 Undefined 和 Null 都是基本數(shù)據(jù)類型,這兩個(gè)基本數(shù)據(jù)類型 分別都只有一個(gè)值,就是 undefined 和 null。
undefined 代表的含義是未定義,null 代表的含義是空對象。一般 變量聲明了但還沒有定義的時(shí)候會(huì)返回 undefined,null 主要用于 賦值給一些可能會(huì)返回對象的變量,作為初始化。
undefined 在 JavaScript 中不是一個(gè)保留字,這意味著可以使用 undefined 來作為一個(gè)變量名,但是這樣的做法是非常危險(xiǎn)的,它會(huì) 影響對 undefined 值得判斷。我們可以通過一些方法獲得安全的 undefined 值,比如說 void 0。
當(dāng)對這兩種類型使用 typeof 進(jìn)行判斷時(shí),Null 類型化會(huì)返回“object”,這是一個(gè)歷史遺留的問題。當(dāng)使用雙等號(hào)對兩種類型的 值進(jìn)行比較時(shí)會(huì)返回 true,使用三個(gè)等號(hào)時(shí)會(huì)返回 false。
4. intanceof 操作符的實(shí)現(xiàn)原理及實(shí)現(xiàn)
instanceof 運(yùn)算符用于判斷構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn) 在對象的原型鏈中的任何位置。
5. 如何獲取安全的 undefined 值?
因?yàn)?undefined 是一個(gè)標(biāo)識(shí)符,所以可以被當(dāng)作變量來使用和賦值,但是這樣會(huì)影響 undefined 的正常判斷。表達(dá)式 void ___ 沒有返 回值,因此返回結(jié)果是 undefined。void 并不改變表達(dá)式的結(jié)果,只是讓表達(dá)式不返回值。因此可以用 void 0 來獲得 undefined。
6. Object.is() 與比較操作符 “===”、“==” 的區(qū)別?
使用雙等號(hào)(==)進(jìn)行相等判斷時(shí),如果兩邊的類型不一致,則會(huì)進(jìn) 行強(qiáng)制類型轉(zhuǎn)化后再進(jìn)行比較。
使用三等號(hào)(===)進(jìn)行相等判斷時(shí),如果兩邊的類型不一致時(shí),不 會(huì)做強(qiáng)制類型準(zhǔn)換,直接返回 false。
使用 Object.is 來進(jìn)行相等判斷時(shí),一般情況下和三等號(hào)的判斷相 同,它處理了一些特殊的情況,比如 -0 和 +0 不再相等,兩個(gè) NaN 是相等的。
7. 什么是 JavaScript 中的包裝類型?
在 JavaScript 中,基本類型是沒有屬性和方法的,但是為了便于操 作基本類型的值,在調(diào)用基本類型的屬性或方法時(shí) JavaScript 會(huì)在 后臺(tái)隱式地將基本類型的值轉(zhuǎn)換為對象,如:
在 訪 問 'abc'.length 時(shí) , JavaScript 將 'abc' 在 后 臺(tái) 轉(zhuǎn) 換 成 String('abc'),然后再訪問其 length 屬性。
JavaScript 也可以使用 Object 函數(shù)顯式地將基本類型轉(zhuǎn)換為包裝類 型:
也可以使用 valueOf 方法將包裝類型倒轉(zhuǎn)成基本類型:
看看如下代碼會(huì)打印出什么:
答案是什么都不會(huì)打印,因?yàn)殡m然包裹的基本類型是 false,但是 false 被包裹成包裝類型后就成了對象,所以其非值為 false,所以 循環(huán)體中的內(nèi)容不會(huì)運(yùn)行。
8. 為什么會(huì)有 BigInt 的提案?
JavaScript 中 Number.MAX_SAFE_INTEGER 表示最?安全數(shù)字,計(jì)算 結(jié)果是 9007199254740991,即在這個(gè)數(shù)范圍內(nèi)不會(huì)出現(xiàn)精度丟失(?數(shù)除外)。但是?旦超過這個(gè)范圍,js 就會(huì)出現(xiàn)計(jì)算不準(zhǔn)確的情況,這在?數(shù)計(jì)算的時(shí)候不得不依靠?些第三?庫進(jìn)?解決,因此官?提 出了 BigInt 來解決此問題。
9. 如何判斷一個(gè)對象是空對象
使用 JSON 自帶的.stringify 方法來判斷:
使用 ES6 新增的方法 Object.keys()來判斷:
10. const 對象的屬性可以修改嗎
const 保證的并不是變量的值不能改動(dòng),而是變量指向的那個(gè)內(nèi)存地 址不能改動(dòng)。對于基本類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),其值 就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。
但對于引用類型的數(shù)據(jù)(主要是對象和數(shù)組)來說,變量指向數(shù)據(jù)的 內(nèi)存地址,保存的只是一個(gè)指針,const 只能保證這個(gè)指針是固定不 變的,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。
11. 如果 new 一個(gè)箭頭函數(shù)的會(huì)怎么樣
箭頭函數(shù)是 ES6 中的提出來的,它沒有 prototype,也沒有自己的 this 指向,更不可以使用 arguments 參數(shù),所以不能 New 一個(gè)箭頭函數(shù)。
new 操作符的實(shí)現(xiàn)步驟如下:
1.創(chuàng)建一個(gè)對象
2.將構(gòu)造函數(shù)的作用域賦給新對象(也就是將對象的__proto__屬性 指向構(gòu)造函數(shù)的 prototype 屬性)
3.指向構(gòu)造函數(shù)中的代碼,構(gòu)造函數(shù)中的 this 指向該對象(也就是 為這個(gè)對象添加屬性和方法)
4.返回新的對象
所以,上面的第二、三步,箭頭函數(shù)都是沒有辦法執(zhí)行的。
12. 箭頭函數(shù)的 this 指向哪??
箭頭函數(shù)不同于傳統(tǒng) JavaScript 中的函數(shù),箭頭函數(shù)并沒有屬于??的 this,它所謂的 this 是捕獲其所在上下?的 this 值,作為??的 this 值,并且由于沒有屬于??的 this,所以是不會(huì)被 new 調(diào)?的,這個(gè)所謂的 this 也不會(huì)被改變。
可以?Babel 理解?下箭頭函數(shù):
轉(zhuǎn)化后:
13. 擴(kuò)展運(yùn)算符的作用及使用場景
(1)對象擴(kuò)展運(yùn)算符
對象的擴(kuò)展運(yùn)算符(...)用于取出參數(shù)對象中的所有可遍歷屬性,拷 貝到當(dāng)前對象之中。
上述方法實(shí)際上等價(jià)于:
Object.assign 方法用于對象的合并,將源對象(source)的所有可 枚舉屬性,復(fù)制到目標(biāo)對象(target)。Object.assign 方法的第一 個(gè)參數(shù)是目標(biāo)對象,后面的參數(shù)都是源對象。(如果目標(biāo)對象與源對 象有同名屬性,或多個(gè)源對象有同名屬性,則后面的屬性會(huì)覆蓋前面 的屬性)。
同樣,如果用戶自定義的屬性,放在擴(kuò)展運(yùn)算符后面,則擴(kuò)展運(yùn)算符 內(nèi)部的同名屬性會(huì)被覆蓋掉。
利用上述特性就可以很方便的修改對象的部分屬性。在 redux 中的 reducer 函數(shù)規(guī)定必須是一個(gè)純函數(shù),reducer 中的 state 對象要求 不能直接修改,可以通過擴(kuò)展運(yùn)算符把修改路徑的對象都復(fù)制一遍,然后產(chǎn)生一個(gè)新的對象返回。
需要注意:擴(kuò)展運(yùn)算符對對象實(shí)例的拷貝屬于淺拷貝。
(2)數(shù)組擴(kuò)展運(yùn)算符
數(shù)組的擴(kuò)展運(yùn)算符可以將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列,且每 次只能展開一層數(shù)組。
下面是數(shù)組的擴(kuò)展運(yùn)算符的應(yīng)用:
將數(shù)組轉(zhuǎn)換為參數(shù)序列
復(fù)制數(shù)組
要記住:擴(kuò)展運(yùn)算符(…)用于取出參數(shù)對象中的所有可遍歷屬性,拷 貝到當(dāng)前對象之中,這里參數(shù)對象是個(gè)數(shù)組,數(shù)組里面的所有對象都 是基礎(chǔ)數(shù)據(jù)類型,將所有基礎(chǔ)數(shù)據(jù)類型重新拷貝到新的數(shù)組中。
合并數(shù)組
如果想在數(shù)組內(nèi)合并數(shù)組,可以這樣:
擴(kuò)展運(yùn)算符與解構(gòu)賦值結(jié)合起來,用于生成數(shù)組
需要注意:如果將擴(kuò)展運(yùn)算符用于數(shù)組賦值,只能放在參數(shù)的最后一 位,否則會(huì)報(bào)錯(cuò)。
將字符串轉(zhuǎn)為真正的數(shù)組
任何 Iterator 接口的對象,都可以用擴(kuò)展運(yùn)算符轉(zhuǎn)為真正的數(shù)組
比較常見的應(yīng)用是可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為數(shù)組:
用于替換 es5 中的 Array.prototype.slice.call(arguments)寫法。使用 Math 函數(shù)獲取數(shù)組中特定的值
14. Proxy 可以實(shí)現(xiàn)什么功能?
在 Vue3.0 中通過 Proxy 來替換原本的 Object.defineProperty 來實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。
Proxy 是 ES6 中新增的功能,它可以用來自定義對象中的操作。
代表需要添加代理的對象,handler 用來自定義對象中的操作,比如 可以用來自定義 set 或者 get 函數(shù)。
下面來通過 Proxy 來實(shí)現(xiàn)一個(gè)數(shù)據(jù)響應(yīng)式:
在上述代碼中,通過自定義 set 和 get 函數(shù)的方式,在原本的邏輯 中插入了我們的函數(shù)邏輯,實(shí)現(xiàn)了在對對象任何屬性進(jìn)行讀寫時(shí)發(fā)出 通知。
當(dāng)然這是簡單版的響應(yīng)式實(shí)現(xiàn),如果需要實(shí)現(xiàn)一個(gè) Vue 中的響應(yīng)式,需要在 get 中收集依賴,在 set 派發(fā)更新,之所以 Vue3.0 要使用 Proxy 替換原本的 API 原因在于 Proxy 無需一層層遞歸為每個(gè)屬 性添加代理,一次即可完成以上操作,性能上更好,并且原本的實(shí)現(xiàn) 有一些數(shù)據(jù)更新不能監(jiān)聽到,但是 Proxy 可以完美監(jiān)聽到任何方式 的數(shù)據(jù)改變,唯一缺陷就是瀏覽器的兼容性不好。
15. 常用的正則表達(dá)式有哪些?
16. 對 JSON 的理解
JSON 是一種基于文本的輕量級的數(shù)據(jù)交換格式。它可以被任何的編 程語言讀取和作為數(shù)據(jù)格式來傳遞。
在項(xiàng)目開發(fā)中,使用 JSON 作為前后端數(shù)據(jù)交換的方式。在前端通過 將一個(gè)符合 JSON 格式的數(shù)據(jù)結(jié)構(gòu)序列化為
JSON 字符串,然后將它傳遞到后端,后端通過 JSON 格式的字符串 解析后生成對應(yīng)的數(shù)據(jù)結(jié)構(gòu),以此來實(shí)現(xiàn)前后端數(shù)據(jù)的一個(gè)傳遞。
因?yàn)?JSON 的語法是基于 js 的,因此很容易將 JSON 和 js 中的對 象弄混,但是應(yīng)該注意的是 JSON 和 js 中的對象不是一回事,JSON 中對象格式更加嚴(yán)格,比如說在 JSON 中屬性值不能為函數(shù),不能出 現(xiàn) NaN 這樣的屬性值等,因此大多數(shù)的 js 對象是不符合 JSON 對 象的格式的。
在 js 中提供了兩個(gè)函數(shù)來實(shí)現(xiàn) js 數(shù)據(jù)結(jié)構(gòu)和 JSON 格式的轉(zhuǎn)換 處理,
JSON.stringify 函數(shù),通過傳入一個(gè)符合 JSON 格式的數(shù)據(jù)結(jié)構(gòu),將其轉(zhuǎn)換為一個(gè) JSON 字符串。如果傳入的數(shù)據(jù)結(jié)構(gòu)不符合 JSON 格 式,那么在序列化的時(shí)候會(huì)對這些值進(jìn)行對應(yīng)的特殊處理,使其符合 規(guī)范。在前端向后端發(fā)送數(shù)據(jù)時(shí),可以調(diào)用這個(gè)函數(shù)將數(shù)據(jù)對象轉(zhuǎn)化 為 JSON 格式的字符串。
JSON.parse() 函數(shù),這個(gè)函數(shù)用來將 JSON 格式的字符串轉(zhuǎn)換為一 個(gè) js 數(shù)據(jù)結(jié)構(gòu),如果傳入的字符串不是標(biāo)準(zhǔn)的 JSON 格式的字符串 的話,將會(huì)拋出錯(cuò)誤。當(dāng)從后端接收到 JSON 格式的字符串時(shí),可以 通過這個(gè)方法來將其解析為一個(gè) js 數(shù)據(jù)結(jié)構(gòu),以此來進(jìn)行數(shù)據(jù)的訪 問。
17. JavaScript 腳本延遲加載的方式有哪些?
延遲加載就是等頁面加載完成之后再加載 JavaScript 文件。 js 延 遲加載有助于提高頁面加載速度。
一般有以下幾種方式:
defer 屬性:給 js 腳本添加 defer 屬性,這個(gè)屬性會(huì)讓腳本的加 載與文檔的解析同步解析,然后在文檔解析完成后再執(zhí)行這個(gè)腳本文 件,這樣的話就能使頁面的渲染不被阻塞。多個(gè)設(shè)置了 defer 屬性
的腳本按規(guī)范來說最后是順序執(zhí)行的,但是在一些瀏覽器中可能不是 這樣。
async 屬性:給 js 腳本添加 async 屬性,這個(gè)屬性會(huì)使腳本異步 加載,不會(huì)阻塞頁面的解析過程,但是當(dāng)腳本加載完成后立即執(zhí)行 js 腳本,這個(gè)時(shí)候如果文檔沒有解析完成的話同樣會(huì)阻塞。多個(gè) async 屬性的腳本的執(zhí)行順序是不可預(yù)測的,一般不會(huì)按照代碼的順序依次 執(zhí)行。
動(dòng)態(tài)創(chuàng)建 DOM 方式:動(dòng)態(tài)創(chuàng)建 DOM 標(biāo)簽的方式,可以對文檔的加載 事件進(jìn)行監(jiān)聽,當(dāng)文檔加載完成后再動(dòng)態(tài)的創(chuàng)建 script 標(biāo)簽來引入 js 腳本。
使用 setTimeout 延遲方法:設(shè)置一個(gè)定時(shí)器來延遲加載 js 腳本文 件
讓 JS 最后加載:將 js 腳本放在文檔的底部,來使 js 腳本盡可能 的在最后來加載執(zhí)行。
18. 什么是 DOM 和 BOM?
DOM 指的是文檔對象模型,它指的是把文檔當(dāng)做一個(gè)對象,這個(gè)對象 主要定義了處理網(wǎng)頁內(nèi)容的方法和接口。
BOM 指的是瀏覽器對象模型,它指的是把瀏覽器當(dāng)做一個(gè)對象來對待,這個(gè)對象主要定義了與瀏覽器進(jìn)行交互的法和接口。BOM 的核心是 window,而 window 對象具有雙重角色,它既是通過 js 訪問瀏覽器 窗口的一個(gè)接口,又是一個(gè) Global(全局)對象。這意味著在網(wǎng)頁 中定義的任何對象,變量和函數(shù),都作為全局對象的一個(gè)屬性或者方 法存在。window 對象含有 location 對象、navigator 對象、screen
對象等子對象,并且 DOM 的最根本的對象 document 對象也是 BOM 的 window 對象的子對象。
19. escape、encodeURI、encodeURIComponent 的區(qū)別
encodeURI 是對整個(gè) URI 進(jìn)行轉(zhuǎn)義,將 URI 中的非法字符轉(zhuǎn)換為合 法字符,所以對于一些在 URI 中有特殊意義的字符不會(huì)進(jìn)行轉(zhuǎn)義。
encodeURIComponent 是對 URI 的組成部分進(jìn)行轉(zhuǎn)義,所以一些特殊 字符也會(huì)得到轉(zhuǎn)義。
escape 和 encodeURI 的作用相同,不過它們對于 unicode 編碼為 0xff 之外字符的時(shí)候會(huì)有區(qū)別,escape 是直接在字符的 unicode 編碼前加上 %u,而 encodeURI 首先會(huì)將字符轉(zhuǎn)換為 UTF-8 的格式,再在每個(gè)字節(jié)前加上 %。
20. 對 AJAX 的理解,實(shí)現(xiàn)一個(gè) AJAX 請求
AJAX 是 Asynchronous JavaScript and XML 的縮寫,指的是通過 JavaScript 的 異步通信,從服務(wù)器獲取 XML 文檔從中提取數(shù)據(jù),再更新當(dāng)前網(wǎng)頁的對應(yīng)部分,而不用刷新整個(gè)網(wǎng)頁。
創(chuàng)建 AJAX 請求的步驟:
創(chuàng)建一個(gè) XMLHttpRequest 對象。
在這個(gè)對象上使用 open 方法創(chuàng)建一個(gè) HTTP 請求,open 方法所需 要的參數(shù)是請求的方法、請求的地址、是否異步和用戶的認(rèn)證信息。
在發(fā)起請求前,可以為這個(gè)對象添加一些信息和監(jiān)聽函數(shù)。比如說可 以通過 setRequestHeader 方法來為請求添加頭信息。還可以為這個(gè) 對象添加一個(gè)狀態(tài)監(jiān)聽函數(shù)。一個(gè) XMLHttpRequest 對象一共有 5 個(gè)狀態(tài),當(dāng)它的狀態(tài)變化時(shí)會(huì)觸發(fā) onreadystatechange 事件,可以
通過設(shè)置監(jiān)聽函數(shù),來處理請求成功后的結(jié)果。當(dāng)對象的 readyState 變?yōu)?4 的時(shí)候,代表服務(wù)器返回的數(shù)據(jù)接收完成,這個(gè)時(shí)候可以通 過判斷請求的狀態(tài),如果狀態(tài)是 2xx 或者 304 的話則代表返回正常。
這個(gè)時(shí)候就可以通過 response 中的數(shù)據(jù)來對頁面進(jìn)行更新了。
當(dāng)對象的屬性和監(jiān)聽函數(shù)設(shè)置完成后,最后調(diào)用 sent 方法來向服務(wù) 器發(fā)起請求,可以傳入?yún)?shù)作為發(fā)送的數(shù)據(jù)體。
使用 Promise 封裝 AJAX:
21. 什么是尾調(diào)用,使用尾調(diào)用有什么好處?
尾調(diào)用指的是函數(shù)的最后一步調(diào)用另一個(gè)函數(shù)。代碼執(zhí)行是基于執(zhí)行 棧的,所以當(dāng)在一個(gè)函數(shù)里調(diào)用另一個(gè)函數(shù)時(shí),會(huì)保留當(dāng)前的執(zhí)行上 下文,然后再新建另外一個(gè)執(zhí)行上下文加入棧中。使用尾調(diào)用的話,因?yàn)橐呀?jīng)是函數(shù)的最后一步,所以這時(shí)可以不必再保留當(dāng)前的執(zhí)行上 下文,從而節(jié)省了內(nèi)存,這就是尾調(diào)用優(yōu)化。但是 ES6 的尾調(diào)用優(yōu) 化只在嚴(yán)格模式下開啟,正常模式是無效的。
22. ES6 模塊與 CommonJS 模塊有什么異同?
ES6 Module 和 CommonJS 模塊的區(qū)別:
CommonJS 是對模塊的淺拷?,ES6 Module 是對模塊的引?,即 ES6 Module 只存只讀,不能改變其值,也就是指針指向不能變,類似 const;
import 的接?是 read-only(只讀狀態(tài)),不能修改其變量值。 即 不能修改其變量的指針指向,但可以改變變量內(nèi)部指針指向,可以對 commonJS 對重新賦值(改變指針指向),但是對 ES6 Module 賦值會(huì) 編譯報(bào)錯(cuò)。
ES6 Module 和 CommonJS 模塊的共同點(diǎn):
CommonJS 和 ES6 Module 都可以對引?的對象進(jìn)?賦值,即對對象內(nèi) 部屬性的值進(jìn)?改變。
23. for...in 和 for...of 的區(qū)別
for…of 是 ES6 新增的遍歷方式,允許遍歷一個(gè)含有 iterator 接口 的數(shù)據(jù)結(jié)構(gòu)(數(shù)組、對象等)并且返回各項(xiàng)的值,和 ES3 中的 for…in 的區(qū)別如下
for…of 遍歷獲取的是對象的鍵值,for…in 獲取的是對象的鍵名;
for… in 會(huì)遍歷對象的整個(gè)原型鏈,性能非常差不推薦使用,而 for … of 只遍歷當(dāng)前對象不會(huì)遍歷原型鏈;
對于數(shù)組的遍歷,for…in 會(huì)返回?cái)?shù)組中所有可枚舉的屬性(包括原 型鏈上可枚舉的屬性),for…of 只返回?cái)?shù)組的下標(biāo)對應(yīng)的屬性值;
總結(jié):for...in 循環(huán)主要是為了遍歷對象而生,不適用于遍歷數(shù)組;for...of 循環(huán)可以用來遍歷數(shù)組、類數(shù)組對象,字符串、Set、Map 以 及 Generator 對象。
24. ajax、axios、fetch 的區(qū)別
(1)AJAX
Ajax 即“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML),是指一種創(chuàng)建交互式應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。它是一種在 無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。通過在 后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對網(wǎng)頁的某部分進(jìn)行 更新。傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整 個(gè)網(wǎng)頁頁面。其缺點(diǎn)如下:
本身是針對 MVC 編程,不符合前端 MVVM 的浪潮
基于原生 XHR 開發(fā),XHR 本身的架構(gòu)不清晰
不符合關(guān)注分離(Separation of Concerns)的原則
配置和調(diào)用方式非常混亂,而且基于事件的異步模型不友好。
(2)Fetch
fetch 號(hào)稱是 AJAX 的替代品,是在 ES6 出現(xiàn)的,使用了 ES6 中的 promise 對象。Fetch 是基于 promise 設(shè)計(jì)的。Fetch 的代碼結(jié)構(gòu)比
起 ajax 簡單多。fetch 不是 ajax 的進(jìn)一步封裝,而是原生 js,沒有 使用 XMLHttpRequest 對象。
fetch 的優(yōu)點(diǎn):
語法簡潔,更加語義化
基于標(biāo)準(zhǔn) Promise 實(shí)現(xiàn),支持 async/await
更加底層,提供的 API 豐富(request, response)
脫離了 XHR,是 ES 規(guī)范里新的實(shí)現(xiàn)方式
fetch 的缺點(diǎn):
fetch 只對網(wǎng)絡(luò)請求報(bào)錯(cuò),對 400,500 都當(dāng)做成功的請求,服務(wù)器 返回 400,500 錯(cuò)誤碼時(shí)并不會(huì) reject,只有網(wǎng)絡(luò)錯(cuò)誤這些導(dǎo)致請 求不能完成時(shí),fetch 才會(huì)被 reject。
fetch 默 認(rèn) 不 會(huì) 帶 cookie , 需 要 添 加 配 置 項(xiàng) :fetch(url, {credentials: 'include'})
fetch 不 支 持 abort , 不 支 持 超 時(shí) 控 制 , 使 用 setTimeout 及 Promise.reject 的實(shí)現(xiàn)的超時(shí)控制并不能阻止請求過程繼續(xù)在后臺(tái) 運(yùn)行,造成了流量的浪費(fèi)
fetch 沒有辦法原生監(jiān)測請求的進(jìn)度,而 XHR 可以
(3)Axios
Axios 是一種基于 Promise 封裝的 HTTP 客戶端,其特點(diǎn)如下:瀏覽器端發(fā)起 XMLHttpRequests 請求
node 端發(fā)起 http 請求
支持 Promise API
監(jiān)聽請求和返回
對請求和返回進(jìn)行轉(zhuǎn)化
取消請求
自動(dòng)轉(zhuǎn)換 json 數(shù)據(jù)
客戶端支持抵御 XSRF 攻擊
25. 對原型、原型鏈的理解
在 JavaScript 中是使用構(gòu)造函數(shù)來新建一個(gè)對象的,每一個(gè)構(gòu)造函 數(shù)的內(nèi)部都有一個(gè) prototype 屬性,它的屬性值是一個(gè)對象,這個(gè) 對象包含了可以由該構(gòu)造函數(shù)的所有實(shí)例共享的屬性和方法。當(dāng)使用 構(gòu)造函數(shù)新建一個(gè)對象后,在這個(gè)對象的內(nèi)部將包含一個(gè)指針,這個(gè) 指針指向構(gòu)造函數(shù)的 prototype 屬性對應(yīng)的值,在 ES5 中這個(gè)指針 被稱為對象的原型。一般來說不應(yīng)該能夠獲取到這個(gè)值的,但是現(xiàn)在 瀏覽器中都實(shí)現(xiàn)了 __proto__ 屬性來訪問這個(gè)屬性,但是最好不要 使用這個(gè)屬性,因?yàn)樗皇且?guī)范中規(guī)定的。ES5 中新增了一個(gè) Object.getPrototypeOf() 方法,可以通過這個(gè)方法來獲取對象的原 型。
當(dāng)訪問一個(gè)對象的屬性時(shí),如果這個(gè)對象內(nèi)部不存在這個(gè)屬性,那么 它就會(huì)去它的原型對象里找這個(gè)屬性,這個(gè)原型對象又會(huì)有自己的原 型,于是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一 般來說都是 Object.prototype 所以這就是新建的對象為什么能夠 使用 toString() 等方法的原因。
特點(diǎn):JavaScript 對象是通過引用來傳遞的,創(chuàng)建的每個(gè)新對象實(shí) 體中并沒有一份屬于自己的原型副本。當(dāng)修改原型時(shí),與之相關(guān)的對 象也會(huì)繼承這一改變。
26. 原型鏈的終點(diǎn)是什么?如何打印出原型鏈的終點(diǎn)?
由于 Object 是構(gòu)造函數(shù),原型鏈終點(diǎn) Object.prototype.__proto__,而 Object.prototype.__proto__=== null // true,所以,原型鏈 的終點(diǎn)是 null。原型鏈上的所有原型都是對象,所有的對象最終都 是由 Object 構(gòu)造的,而 Object.prototype 的下一級是
Object.prototype.__proto__。
27. 對作用域、作用域鏈的理解
1)全局作用域和函數(shù)作用域
(1)全局作用域
最外層函數(shù)和最外層函數(shù)外面定義的變量擁有全局作用域
所有未定義直接賦值的變量自動(dòng)聲明為全局作用域
所有 window 對象的屬性擁有全局作用域
全局作用域有很大的弊端,過多的全局作用域變量會(huì)污染全局命名空 間,容易引起命名沖突。
(2)函數(shù)作用域
函數(shù)作用域聲明在函數(shù)內(nèi)部的變零,一般只有固定的代碼片段可以訪 問到
作用域是分層的,內(nèi)層作用域可以訪問外層作用域,反之不行 2)塊級作用域
使用 ES6 中新增的 let 和 const 指令可以聲明塊級作用域,塊級作用 域可以在函數(shù)中創(chuàng)建也可以在一個(gè)代碼塊中的創(chuàng)建(由{ }包裹的代 碼片段)
let 和 const 聲明的變量不會(huì)有變量提升,也不可以重復(fù)聲明
在循環(huán)中比較適合綁定塊級作用域,這樣就可以把聲明的計(jì)數(shù)器變量 限制在循環(huán)內(nèi)部。
作用域鏈:
在當(dāng)前作用域中查找所需變量,但是該作用域沒有這個(gè)變量,那這個(gè) 變量就是自由變量。如果在自己作用域找不到該變量就去父級作用域 查找,依次向上級作用域查找,直到訪問到 window 對象就被終止,這一層層的關(guān)系就是作用域鏈。
作用域鏈的作用是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有 序訪問,通過作用域鏈,可以訪問到外層環(huán)境的變量和函數(shù)。
作用域鏈的本質(zhì)上是一個(gè)指向變量對象的指針列表。變量對象是一個(gè) 包含了執(zhí)行環(huán)境中所有變量和函數(shù)的對象。作用域鏈的前端始終都是 當(dāng)前執(zhí)行上下文的變量對象。全局執(zhí)行上下文的變量對象(也就是全 局對象)始終是作用域鏈的最后一個(gè)對象。
當(dāng)查找一個(gè)變量時(shí),如果當(dāng)前執(zhí)行環(huán)境中沒有找到,可以沿著作用域 鏈向后查找。
28. 對 this 對象的理解
this 是執(zhí)行上下文中的一個(gè)屬性,它指向最后一次調(diào)用這個(gè)方法的 對象。在實(shí)際開發(fā)中,this 的指向可以通過四種調(diào)用模式來判斷。
第一種是函數(shù)調(diào)用模式,當(dāng)一個(gè)函數(shù)不是一個(gè)對象的屬性時(shí),直接作 為函數(shù)來調(diào)用時(shí),this 指向全局對象。
第二種是方法調(diào)用模式,如果一個(gè)函數(shù)作為一個(gè)對象的方法來調(diào)用時(shí),this 指向這個(gè)對象。
第三種是構(gòu)造器調(diào)用模式,如果一個(gè)函數(shù)用 new 調(diào)用時(shí),函數(shù)執(zhí)行 前會(huì)新創(chuàng)建一個(gè)對象,this 指向這個(gè)新創(chuàng)建的對象。
第四種是 apply 、 call 和 bind 調(diào)用模式,這三個(gè)方法都可以顯 示的指定調(diào)用函數(shù)的 this 指向。其中 apply 方法接收兩個(gè)參數(shù):一個(gè)是 this 綁定的對象,一個(gè)是參數(shù)數(shù)組。call 方法接收的參數(shù),第一個(gè)是 this 綁定的對象,后面的其余參數(shù)是傳入函數(shù)執(zhí)行的參數(shù)。
也就是說,在使用 call() 方法時(shí),傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉 出來。bind 方法通過傳入一個(gè)對象,返回一個(gè) this 綁定了傳入對 象的新函數(shù)。這個(gè)函數(shù)的 this 指向除了使用 new 時(shí)會(huì)被改變,其 他情況下都不會(huì)改變。
這四種方式,使用構(gòu)造器調(diào)用模式的優(yōu)先級最高,然后是 apply、call 和 bind 調(diào)用模式,然后是方法調(diào)用模式,然后是函數(shù)調(diào)用模式。
29. call() 和 apply() 的區(qū)別?
它們的作用一模一樣,區(qū)別僅在于傳入?yún)?shù)的形式的不同。
apply 接受兩個(gè)參數(shù),第一個(gè)參數(shù)指定了函數(shù)體內(nèi) this 對象的指向,第二個(gè)參數(shù)為一個(gè)帶下標(biāo)的集合,這個(gè)集合可以為數(shù)組,也可以為類 數(shù)組,apply 方法把這個(gè)集合中的元素作為參數(shù)傳遞給被調(diào)用的函數(shù)。
call 傳入的參數(shù)數(shù)量不固定,跟 apply 相同的是,第一個(gè)參數(shù)也是 代表函數(shù)體內(nèi)的 this 指向,從第二個(gè)參數(shù)開始往后,每個(gè)參數(shù)被依 次傳入函數(shù)。
30. 異步編程的實(shí)現(xiàn)方式?
JavaScript 中的異步機(jī)制可以分為以下幾種:
回調(diào)函數(shù) 的方式,使用回調(diào)函數(shù)的方式有一個(gè)缺點(diǎn)是,多個(gè)回調(diào)函 數(shù)嵌套的時(shí)候會(huì)造成回調(diào)函數(shù)地獄,上下兩層的回調(diào)函數(shù)間的代碼耦 合度太高,不利于代碼的可維護(hù)。
Promise 的方式,使用 Promise 的方式可以將嵌套的回調(diào)函數(shù)作為 鏈?zhǔn)秸{(diào)用。但是使用這種方法,有時(shí)會(huì)造成多個(gè) then 的鏈?zhǔn)秸{(diào)用,可能會(huì)造成代碼的語義不夠明確。
generator 的方式,它可以在函數(shù)的執(zhí)行過程中,將函數(shù)的執(zhí)行權(quán)轉(zhuǎn) 移出去,在函數(shù)外部還可以將執(zhí)行權(quán)轉(zhuǎn)移回來。當(dāng)遇到異步函數(shù)執(zhí)行 的時(shí)候,將函數(shù)執(zhí)行權(quán)轉(zhuǎn)移出去,當(dāng)異步函數(shù)執(zhí)行完畢時(shí)再將執(zhí)行權(quán) 給轉(zhuǎn)移回來。因此在 generator 內(nèi)部對于異步操作的方式,可以以 同步的順序來書寫。使用這種方式需要考慮的問題是何時(shí)將函數(shù)的控 制權(quán)轉(zhuǎn)移回來,因此需要有一個(gè)自動(dòng)執(zhí)行 generator 的機(jī)制,比如 說 co 模塊等方式來實(shí)現(xiàn) generator 的自動(dòng)執(zhí)行。
async 函數(shù) 的方式,async 函數(shù)是 generator 和 promise 實(shí)現(xiàn)的 一個(gè)自動(dòng)執(zhí)行的語法糖,它內(nèi)部自帶執(zhí)行器,當(dāng)函數(shù)內(nèi)部執(zhí)行到一個(gè) await 語句的時(shí)候,如果語句返回一個(gè) promise 對象,那么函數(shù)將 會(huì)等待 promise 對象的狀態(tài)變?yōu)?resolve 后再繼續(xù)向下執(zhí)行。因此 可以將異步邏輯,轉(zhuǎn)化為同步的順序來書寫,并且這個(gè)函數(shù)可以自動(dòng) 執(zhí)行。
31. 對 Promise 的理解
Promise 是異步編程的一種解決方案,它是一個(gè)對象,可以獲取異步 操作的消息,他的出現(xiàn)大大改善了異步編程的困境,避免了地獄回調(diào),它比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更合理和更強(qiáng)大。
所謂 Promise,簡單說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束 的事件(通常是一個(gè)異步操作)的結(jié)果。從語法上說,Promise 是一 個(gè)對象,從它可以獲取異步操作的消息。Promise 提供統(tǒng)一的 API,各種異步操作都可以用同樣的方法進(jìn)行處理。
(1)Promise 的實(shí)例有三個(gè)狀態(tài):
Pending(進(jìn)行中)
Resolved(已完成)
Rejected(已拒絕)
當(dāng)把一件事情交給 promise 時(shí),它的狀態(tài)就是 Pending,任務(wù)完成了 狀態(tài)就變成了 Resolved、沒有完成失敗了就變成了 Rejected。
(2)Promise 的實(shí)例有兩個(gè)過程:
pending -> fulfilled : Resolved(已完成)
pending -> rejected:Rejected(已拒絕)
注意:一旦從進(jìn)行狀態(tài)變成為其他狀態(tài)就永遠(yuǎn)不能更改狀態(tài)了。
Promise 的特點(diǎn):
對象的狀態(tài)不受外界影響。promise 對象代表一個(gè)異步操作,有三種 狀態(tài),pending(進(jìn)行中)、fulfilled(已成功)、rejected(已失 敗)。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他 操作都無法改變這個(gè)狀態(tài),這也是 promise 這個(gè)名字的由來——“承 諾”;
一旦狀態(tài)改變就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。promise 對象的狀態(tài)改變,只有兩種可能:從 pending 變?yōu)?fulfilled,從 pending 變?yōu)?rejected。這時(shí)就稱為 resolved(已定型)。如果改 變已經(jīng)發(fā)生了,你再對 promise 對象添加回調(diào)函數(shù),也會(huì)立即得到這 個(gè)結(jié)果。這與事件(event)完全不同,事件的特點(diǎn)是:如果你錯(cuò)過 了它,再去監(jiān)聽是得不到結(jié)果的。
Promise 的缺點(diǎn):
無法取消 Promise,一旦新建它就會(huì)立即執(zhí)行,無法中途取消。
如果不設(shè)置回調(diào)函數(shù),Promise 內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。
當(dāng)處于 pending 狀態(tài)時(shí),無法得知目前進(jìn)展到哪一個(gè)階段(剛剛開始 還是即將完成)。
總結(jié):
Promise 對象是異步編程的一種解決方案,最早由社區(qū)提出。Promise 是一個(gè)構(gòu)造函數(shù),接收一個(gè)函數(shù)作為參數(shù),返回一個(gè) Promise 實(shí)例。一個(gè) Promise 實(shí)例有三種狀態(tài),分別是 pending、resolved 和 rejected,分別代表了進(jìn)行中、已成功和已失敗。實(shí)例的狀態(tài)只能由 pending 轉(zhuǎn)變 resolved 或者 rejected 狀態(tài),并且狀態(tài)一經(jīng)改變,就凝固了,無法再被改變了。
狀態(tài)的改變是通過 resolve() 和 reject() 函數(shù)來實(shí)現(xiàn)的,可以在 異步操作結(jié)束后調(diào)用這兩個(gè)函數(shù)改變 Promise 實(shí)例的狀態(tài),它的原 型上定義了一個(gè) then 方法,使用這個(gè) then 方法可以為兩個(gè)狀態(tài)的 改變注冊回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)屬于微任務(wù),會(huì)在本輪事件循環(huán)的 末尾執(zhí)行。
注意:在構(gòu)造 Promise 的時(shí)候,構(gòu)造函數(shù)內(nèi)部的代碼是立即執(zhí)行的
32. Promise 解決了什么問題
在工作中經(jīng)常會(huì)碰到這樣一個(gè)需求,比如我使用 ajax 發(fā)一個(gè) A 請求 后,成功后拿到數(shù)據(jù),需要把數(shù)據(jù)傳給 B 請求;那么需要如下編寫代 碼:
上面的代碼有如下缺點(diǎn):
后一個(gè)請求需要依賴于前一個(gè)請求成功后,將數(shù)據(jù)往下傳遞,會(huì)導(dǎo)致 多個(gè) ajax 請求嵌套的情況,代碼不夠直觀。
如果前后兩個(gè)請求不需要傳遞參數(shù)的情況下,那么后一個(gè)請求也需要 前一個(gè)請求成功后再執(zhí)行下一步操作,這種情況下,那么也需要如上 編寫代碼,導(dǎo)致代碼不夠直觀。
Promise 出現(xiàn)之后,代碼變成這樣:
這樣代碼看起了就簡潔了很多,解決了地獄回調(diào)的問題。
33. 對 async/await 的理解
async/await 其實(shí)是 Generator 的語法糖,它能實(shí)現(xiàn)的效果都能用 then 鏈來實(shí)現(xiàn),它是為優(yōu)化 then 鏈而開發(fā)出來的。從字面上來看,async 是“異步”的簡寫,await 則為等待,所以很好理解 async 用 于申明一個(gè) function 是異步的,而 await 用于等待一個(gè)異步方法 執(zhí)行完成。當(dāng)然語法上強(qiáng)制規(guī)定 await 只能出現(xiàn)在 asnyc 函數(shù)中,先 來看看 async 函數(shù)返回了什么:
所以,async 函數(shù)返回的是一個(gè) Promise 對象。async 函數(shù)(包含 函數(shù)語句、函數(shù)表達(dá)式、Lambda 表達(dá)式)會(huì)返回一個(gè) Promise 對象,如果在函數(shù)中 return 一個(gè)直接量,async 會(huì)把這個(gè)直接量通過 Promise.resolve() 封裝成 Promise 對象。
async 函數(shù)返回的是一個(gè) Promise 對象,所以在最外層不能用 await 獲取其返回值的情況下,當(dāng)然應(yīng)該用原來的方式:then() 鏈 來處理這個(gè) Promise 對象,就像這樣:
那如果 async 函數(shù)沒有返回值,又該如何?很容易想到,它會(huì)返回 Promise.resolve(undefined)。
聯(lián)想一下 Promise 的特點(diǎn)——無等待,所以在沒有 await 的情況下 執(zhí)行 async 函數(shù),它會(huì)立即執(zhí)行,返回一個(gè) Promise 對象,并且,絕不會(huì)阻塞后面的語句。這和普通返回 Promise 對象的函數(shù)并無二 致。
注意:Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的簡寫,可以用于快速封裝字面量對象或其他對象,將 其封裝成 Promise 實(shí)例。
34. async/await 的優(yōu)勢
單一的 Promise 鏈并不能發(fā)現(xiàn) async/await 的優(yōu)勢,但是,如果需 要處理由多個(gè) Promise 組成的 then 鏈的時(shí)候,優(yōu)勢就能體現(xiàn)出來 了(很有意思,Promise 通過 then 鏈來解決多層回調(diào)的問題,現(xiàn)在 又用 async/await 來進(jìn)一步優(yōu)化它)。
假設(shè)一個(gè)業(yè)務(wù),分多個(gè)步驟完成,每個(gè)步驟都是異步的,而且依賴于 上一個(gè)步驟的結(jié)果。仍然用 setTimeout 來模擬異步操作:
現(xiàn)在用 Promise 方式來實(shí)現(xiàn)這三個(gè)步驟的處理:
輸出結(jié)果 result 是 step3() 的參數(shù) 700 + 200 = 900。doIt() 順 序執(zhí)行了三個(gè)步驟,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 計(jì)算的結(jié)果一致。
如果用 async/await 來實(shí)現(xiàn)呢,會(huì)是這樣:
結(jié)果和之前的 Promise 實(shí)現(xiàn)是一樣的,但是這個(gè)代碼看起來是不是
清晰得多,幾乎跟同步代碼一樣
35. async/await 對比 Promise 的優(yōu)勢
代碼讀起來更加同步,Promise 雖然擺脫了回調(diào)地獄,但是 then 的
鏈?zhǔn)秸{(diào)?也會(huì)帶來額外的閱讀負(fù)擔(dān)
Promise 傳遞中間值?常麻煩,?async/await?乎是同步的寫法,?常優(yōu)雅
錯(cuò)誤處理友好,async/await 可以?成熟的 try/catch,Promise 的 錯(cuò)誤捕獲?常冗余
調(diào)試友好,Promise 的調(diào)試很差,由于沒有代碼塊,你不能在?個(gè)返 回表達(dá)式的箭頭函數(shù)中設(shè)置斷點(diǎn),如果你在?個(gè).then 代碼塊中使?調(diào)試器的步進(jìn)(step-over)功能,調(diào)試器并不會(huì)進(jìn)?后續(xù)的.then 代 碼塊,因?yàn)檎{(diào)試器只能跟蹤同步代碼的每?步。
36. 對象創(chuàng)建的方式有哪些?
一般使用字面量的形式直接創(chuàng)建對象,但是這種創(chuàng)建方式對于創(chuàng)建大
量相似對象的時(shí)候,會(huì)產(chǎn)生大量的重復(fù)代碼。但 js 和一般的面向?qū)?/span>
象的語言不同,在 ES6 之前它沒有類的概念。但是可以使用函數(shù)來
進(jìn)行模擬,從而產(chǎn)生出可復(fù)用的對象創(chuàng)建方式,常見的有以下幾種:
(1)第一種是工廠模式,工廠模式的主要工作原理是用函數(shù)來封裝 創(chuàng)建對象的細(xì)節(jié),從而通過調(diào)用函數(shù)來達(dá)到復(fù)用的目的。但是它有一 個(gè)很大的問題就是創(chuàng)建出來的對象無法和某個(gè)類型聯(lián)系起來,它只是 簡單的封裝了復(fù)用代碼,而沒有建立起對象和類型間的關(guān)系。
(2)第二種是構(gòu)造函數(shù)模式。js 中每一個(gè)函數(shù)都可以作為構(gòu)造函數(shù),只要一個(gè)函數(shù)是通過 new 來調(diào)用的,那么就可以把它稱為構(gòu)造函數(shù)。執(zhí)行構(gòu)造函數(shù)首先會(huì)創(chuàng)建一個(gè)對象,然后將對象的原型指向構(gòu)造函數(shù) 的 prototype 屬性,然后將執(zhí)行上下文中的 this 指向這個(gè)對象,最后再執(zhí)行整個(gè)函數(shù),如果返回值不是對象,則返回新建的對象。因 為 this 的值指向了新建的對象,因此可以使用 this 給對象賦值。構(gòu)造函數(shù)模式相對于工廠模式的優(yōu)點(diǎn)是,所創(chuàng)建的對象和構(gòu)造函數(shù)建 立起了聯(lián)系,因此可以通過原型來識(shí)別對象的類型。但是構(gòu)造函數(shù)存 在一個(gè)缺點(diǎn)就是,造成了不必要的函數(shù)對象的創(chuàng)建,因?yàn)樵?js 中函 數(shù)也是一個(gè)對象,因此如果對象屬性中如果包含函數(shù)的話,那么每次 都會(huì)新建一個(gè)函數(shù)對象,浪費(fèi)了不必要的內(nèi)存空間,因?yàn)楹瘮?shù)是所有 的實(shí)例都可以通用的。
(3)第三種模式是原型模式,因?yàn)槊恳粋€(gè)函數(shù)都有一個(gè) prototype 屬性,這個(gè)屬性是一個(gè)對象,它包含了通過構(gòu)造函數(shù)創(chuàng)建的所有實(shí)例 都能共享的屬性和方法。因此可以使用原型對象來添加公用屬性和方 法,從而實(shí)現(xiàn)代碼的復(fù)用。這種方式相對于構(gòu)造函數(shù)模式來說,解決 了函數(shù)對象的復(fù)用問題。但是這種模式也存在一些問題,一個(gè)是沒有 辦法通過傳入?yún)?shù)來初始化值,另一個(gè)是如果存在一個(gè)引用類型如 Array 這樣的值,那么所有的實(shí)例將共享一個(gè)對象,一個(gè)實(shí)例對引用 類型值的改變會(huì)影響所有的實(shí)例。
(4)第四種模式是組合使用構(gòu)造函數(shù)模式和原型模式,這是創(chuàng)建自 定義類型的最常見方式。因?yàn)闃?gòu)造函數(shù)模式和原型模式分開使用都存 在一些問題,因此可以組合使用這兩種模式,通過構(gòu)造函數(shù)來初始化 對象的屬性,通過原型對象來實(shí)現(xiàn)函數(shù)方法的復(fù)用。這種方法很好的 解決了兩種模式單獨(dú)使用時(shí)的缺點(diǎn),但是有一點(diǎn)不足的就是,因?yàn)槭?用了兩種不同的模式,所以對于代碼的封裝性不夠好。
(5)第五種模式是動(dòng)態(tài)原型模式,這一種模式將原型方法賦值的創(chuàng) 建過程移動(dòng)到了構(gòu)造函數(shù)的內(nèi)部,通過對屬性是否存在的判斷,可以 實(shí)現(xiàn)僅在第一次調(diào)用函數(shù)時(shí)對原型對象賦值一次的效果。這一種方式 很好地對上面的混合模式進(jìn)行了封裝。
(6)第六種模式是寄生構(gòu)造函數(shù)模式,這一種模式和工廠模式的實(shí) 現(xiàn)基本相同,我對這個(gè)模式的理解是,它主要是基于一個(gè)已有的類型,在實(shí)例化時(shí)對實(shí)例化的對象進(jìn)行擴(kuò)展。這樣既不用修改原來的構(gòu)造函 數(shù),也達(dá)到了擴(kuò)展對象的目的。它的一個(gè)缺點(diǎn)和工廠模式一樣,無法 實(shí)現(xiàn)對象的識(shí)別。
37. 對象繼承的方式有哪些?
(1)第一種是以原型鏈的方式來實(shí)現(xiàn)繼承,但是這種實(shí)現(xiàn)方式存在 的缺點(diǎn)是,在包含有引用類型的數(shù)據(jù)時(shí),會(huì)被所有的實(shí)例對象所共享,容易造成修改的混亂。還有就是在創(chuàng)建子類型的時(shí)候不能向超類型傳 遞參數(shù)。
(2)第二種方式是使用借用構(gòu)造函數(shù)的方式,這種方式是通過在子 類型的函數(shù)中調(diào)用超類型的構(gòu)造函數(shù)來實(shí)現(xiàn)的,這一種方法解決了不 能向超類型傳遞參數(shù)的缺點(diǎn),但是它存在的一個(gè)問題就是無法實(shí)現(xiàn)函 數(shù)方法的復(fù)用,并且超類型原型定義的方法子類型也沒有辦法訪問到。
(3)第三種方式是組合繼承,組合繼承是將原型鏈和借用構(gòu)造函數(shù) 組合起來使用的一種方式。通過借用構(gòu)造函數(shù)的方式來實(shí)現(xiàn)類型的屬 性的繼承,通過將子類型的原型設(shè)置為超類型的實(shí)例來實(shí)現(xiàn)方法的繼 承。這種方式解決了上面的兩種模式單獨(dú)使用時(shí)的問題,但是由于我 們是以超類型的實(shí)例來作為子類型的原型,所以調(diào)用了兩次超類的構(gòu) 造函數(shù),造成了子類型的原型中多了很多不必要的屬性。
(4)第四種方式是原型式繼承,原型式繼承的主要思路就是基于已 有的對象來創(chuàng)建新的對象,實(shí)現(xiàn)的原理是,向函數(shù)中傳入一個(gè)對象,然后返回一個(gè)以這個(gè)對象為原型的對象。這種繼承的思路主要不是為 了實(shí)現(xiàn)創(chuàng)造一種新的類型,只是對某個(gè)對象實(shí)現(xiàn)一種簡單繼承,ES5 中定義的 Object.create() 方法就是原型式繼承的實(shí)現(xiàn)。缺點(diǎn)與原 型鏈方式相同。
(5)第五種方式是寄生式繼承,寄生式繼承的思路是創(chuàng)建一個(gè)用于 封裝繼承過程的函數(shù),通過傳入一個(gè)對象,然后復(fù)制一個(gè)對象的副本,然后對象進(jìn)行擴(kuò)展,最后返回這個(gè)對象。這個(gè)擴(kuò)展的過程就可以理解 是一種繼承。這種繼承的優(yōu)點(diǎn)就是對一個(gè)簡單對象實(shí)現(xiàn)繼承,如果這 個(gè)對象不是自定義類型時(shí)。缺點(diǎn)是沒有辦法實(shí)現(xiàn)函數(shù)的復(fù)用。
(6)第六種方式是寄生式組合繼承,組合繼承的缺點(diǎn)就是使用超類 型的實(shí)例做為子類型的原型,導(dǎo)致添加了不必要的原型屬性。寄生式 組合繼承的方式是使用超類型的原型的副本來作為子類型的原型,這 樣就避免了創(chuàng)建不必要的屬性。
38. 哪些情況會(huì)導(dǎo)致內(nèi)存泄漏
以下四種情況會(huì)造成內(nèi)存的泄漏:
意外的全局變量:由于使用未聲明的變量,而意外的創(chuàng)建了一個(gè)全局 變量,而使這個(gè)變量一直留在內(nèi)存中無法被回收。
被遺忘的計(jì)時(shí)器或回調(diào)函數(shù):設(shè)置了 setInterval 定時(shí)器,而忘記 取消它,如果循環(huán)函數(shù)有對外部變量的引用的話,那么這個(gè)變量會(huì)被 一直留在內(nèi)存中,而無法被回收。
脫離 DOM 的引用:獲取一個(gè) DOM 元素的引用,而后面這個(gè)元素被刪 除,由于一直保留了對這個(gè)元素的引用,所以它也無法被回收。
閉包:不合理的使用閉包,從而導(dǎo)致某些變量一直被留在內(nèi)存當(dāng)中。
者:靛藍(lán)工房 文章轉(zhuǎn)自78DM
原標(biāo)題:一起來做模型之“MG艾比安篇”,淺談打磨作用與金屬色/偽電鍍應(yīng)用,因標(biāo)題字?jǐn)?shù)限制有刪減
又來到了一起來做模型的系列欄目了。本次我選用了萬代MG1/100 “艾比安高達(dá)”作為素體對象進(jìn)行制作。最主要就是這個(gè)堆積了很久想盡快清理了它。
本次的制作中,在基礎(chǔ)修整部分,我將會(huì)把重點(diǎn)放在塑料零件的表面打磨基礎(chǔ)理論,介紹打磨的作用、手法、常用工具介紹;
而在涂裝上我打算做成金屬+電鍍色效果,因此我會(huì)重點(diǎn)介紹金屬色的使用手法,金屬色上覆蓋透明色的操作要領(lǐng)。
上一期的水性漆使用中沒想到引起了各位的熱烈討論,而就像是命運(yùn)開玩笑一般,在我發(fā)帖的三天后就在貼吧上出了個(gè)瓜,某位玩家因?yàn)檫^分相信水性漆而導(dǎo)致了患病。確實(shí)是有點(diǎn)諷刺。但也證明了涂料安全性的論點(diǎn)。
而金屬漆的毒性可以說是在同系列的涂料中最強(qiáng)烈的。而出于保命以及不為各位玩家?guī)念^,本次的制作只使用我個(gè)人相信的日本漆進(jìn)行制作。
說白了就是郡士GX系以及SM系金屬色。但不管使用什么涂料,也請各位做好完善的個(gè)人防護(hù)再來制作模型。
那么事不宜遲,我們現(xiàn)在就來開始制作艾比安吧。
本次制作中除了模型套件以外,主要將使用水口鉗、筆刀、銼刀、鷹嘴刻線刀、砂紙、面相筆、GX系以及SM系金屬色。同時(shí)還準(zhǔn)備好GX系列透明色。
我這次要做的正是電鍍風(fēng)格涂裝。這種涂裝的作品對模型的表面處理要求非常高,任何瑕疵都會(huì)在光澤面下表露無遺。這是對作者基本功的一次考驗(yàn)。
第一部分:零件水口及分模線的打磨方法。
制作模型的第一步,依舊還是水口打磨。雖然關(guān)于水口打磨每一期都有說,都是老調(diào)重彈。但考慮到很多人沒看前幾期,而且打磨又是本次的重點(diǎn)之一,我還是簡略說說吧。
我在這里選用了武裝的一個(gè)圓形零件進(jìn)行操作展示。
首先,我們先把零件裁剪下來。初步裁剪的時(shí)候需要注意水口應(yīng)留有較多的距離,以保障零件的表面完整。
接著我們使用水口鉗逐點(diǎn)逐點(diǎn)地剪除水口。注意采用逐步貼近零件多次修剪的方法,可以防止一下裁剪太多而導(dǎo)致的缺肉風(fēng)險(xiǎn)。
請勿太過相信網(wǎng)紅們一刀流的制作方法。那種偷懶性質(zhì)的做法會(huì)增加損壞零件的風(fēng)險(xiǎn)。如果你有足夠留意萬代或者壽屋的模型說明書前面的注意事項(xiàng),就會(huì)發(fā)現(xiàn)日本的模型生產(chǎn)商也是建議你采用這種逐步剪切的方法的。
因?yàn)槭菆A弧型外表的零件,水口鉗是無法完全剪除干凈的。但也無妨,像圖中這樣裁剪到呈現(xiàn)切線貼近圓弧邊緣就可以了。
接下來我們使用筆刀切除水口兩端多余的凸角。同樣注意不需要切除太多以防止缺肉。
最后,我會(huì)對疊砂紙但不折平,使用圓角按壓在零件表面,以畫圈的形式打磨水口位置。
考慮到這是涂裝的模型作品。砂紙我是使用1000目的直接打磨便能滿足制作需求。
砂紙打磨完成后,可以看到水口已經(jīng)完全消失,零件表面是規(guī)則而平整的圓弧外形。
使用砂紙打磨弧形的零件表面的時(shí)候,可以像圖中這種,對疊砂紙但不折平,然后以圓角按壓在零件表面。砂紙的圓角具有充足彈性,當(dāng)按壓到零件上時(shí)會(huì)因擠壓而形成適配弧面的角度。這樣的打磨小技巧可以幫助各位快速而高效地打磨弧面,不用擔(dān)心磨壞弧度
像這樣的操作,僅使用水口鉗、筆刀、砂紙,基本能滿足全部的水口打磨。
但如果水口出現(xiàn)的位置是平面的話,我們還能結(jié)合銼刀來提高操作的便利性與效率性。
這是背包上的零件,剛好是直線邊緣位置上存在水口的理想示范。
同樣地,我先使用水口鉗大概修剪了水口。因?yàn)槭窃谄矫嫔系乃凇?な克阢Q鋒利的單刃結(jié)構(gòu)幾乎僅需一刀就能把水口去除。
接著使用筆刀將殘余的水口痕跡修剪去除。
然后我們使用銼刀按壓在水口出現(xiàn)的平面上來回拖行兩三遍,水口就已經(jīng)完全消失不見。我手上的這把是郡士的細(xì)目型銼刀,刀身上呈現(xiàn)層紋的切割片結(jié)構(gòu),就像是剃須刀那樣。操作時(shí)只需要注意用力方向,零件表面上的凸起瑕疵很容易就會(huì)被削除而且在零件表面上留下的痕跡很少,是打磨水口時(shí)非常好用的輔助型工具。我們在很多日本模型博主的視頻里面都能發(fā)現(xiàn)他們在使用這款銼刀處理水口(例如宇宙戰(zhàn)艦大和號(hào)的日本相關(guān)模型制作視頻),強(qiáng)烈建議各位嘗試。
最后僅需要使用砂紙打磨表面就完成了操作。因?yàn)橐呀?jīng)是使用銼刀預(yù)打磨了一遍,所以砂紙打磨時(shí)候的操作壓力很低,很容易就可以打磨平滑。由此可見,配合銼刀與砂紙來進(jìn)行水口打磨,效率性非常高,也能節(jié)約砂紙的損耗。
換句話說,花幾十塊買一把銼刀,可以節(jié)省好幾年里面幾百塊的砂紙錢。
這是翅膀狀零件,可以看到在零件中央有著一道貫穿水口的分模線,非常扎眼必須要完全去除。
去除的方法也是非常簡便,只需要使用1000目砂紙來回打磨,耐心地重復(fù)操作就能去除干凈。如果覺得僅用砂紙打磨的操作壓力很大,當(dāng)然也可以配合銼刀使用。
這是打磨前后的效果對比。可見這道分模線的存在是非常顯眼的。打磨去除是制作中必要的操作,可不能馬虎處理。
像這種水口伴隨分模線的瑕疵,在塑料模型中比比皆是,像圖中的紅色裝甲零件上便能再次發(fā)現(xiàn)。
我們采用相同的手法進(jìn)行處理,就能得到平滑統(tǒng)一的零件表面。
面積較大的塑料零件很可能還會(huì)有波紋。就像圖片紅色零件反光面上出現(xiàn)的弧形層紋。這是塑料在注模時(shí)流動(dòng)而帶入的瑕疵,波紋較深的位置放任不管也有可能會(huì)透過漆面表露出來,因此同樣需要處理干凈。
這里只需要使用1000目砂紙直接對零件表面采用按壓式打磨就能完全去除波紋瑕疵。
有時(shí)水口出現(xiàn)的位置還會(huì)出現(xiàn)模具開合而產(chǎn)生的高低斷層面,一個(gè)零件上存在三種瑕疵也確實(shí)是讓人頭痛。
但不管是什么瑕疵,沒有銼刀+砂紙?zhí)幚聿涣说模@里同樣通過打磨的手法完全去除。
如此不斷重復(fù),我們就能把塑料零件上的水口、分模線、波紋面完全去除干凈了。
階段總結(jié):
水口處理確實(shí)是千古不變的恒定話題。要處理好水口其實(shí)能使用的工具或者方法無非也就那么兩三種。
關(guān)于水口鉗,當(dāng)然是性能好的會(huì)省事很多。常見的,本人津津樂道的恐怕就是田宮的神手。但這個(gè)價(jià)格太貴且耐用性太差,其實(shí)性價(jià)比并不高。我個(gè)人會(huì)推薦用本文中的這一把郡士單刃鉗。150左右的價(jià)格跟田宮金牌相近,還略微便宜少許。而使用性能上比田宮金牌要好,耐用性也要比田宮的產(chǎn)品更強(qiáng)更耐操。性價(jià)比確實(shí)是很不錯(cuò)的,因此是我的個(gè)人推薦。
而銼刀則應(yīng)該選用層紋型的銼刀。這種多排刀片的結(jié)構(gòu)跟我們用的剃須刀相似,使用方向正確,就會(huì)去除表面凸起的異物但不會(huì)傷到皮膚,在模型制作中也是同理。如果只是打磨水口就不需要使用顆粒型的銼刀了,這個(gè)更加偏向于整形改造,打磨的壓力比層紋型的高。
至于砂紙嘛,就不做討論了,選用合適目數(shù)的就好。對比田宮的砂紙,郡士的砂紙打磨的手感較為生澀,但耐用性更強(qiáng)。田宮的砂紙打磨順滑性更好,但耐用性較差更換頻率更密。所以各位就按照自己的喜好與經(jīng)濟(jì)狀況選擇吧。
第二部分:縮膠的產(chǎn)生與打磨處理方法
縮膠,是塑料在凝固硬化時(shí)體積收縮而產(chǎn)生的自然現(xiàn)象。通常在面積較大,或厚度較高的零件上會(huì)出現(xiàn)得尤為明顯。
如果是消光涂裝的模型,縮膠的位置往往不會(huì)十分明顯,因?yàn)楣饩€在漫反射下有一定的遮瑕作用。但如果是光澤面的作品,縮膠會(huì)因反光差異而被展露出來。在制作金屬色涂裝、偽電鍍涂裝這種光澤模型時(shí),縮膠需要打磨干凈才能盡善盡美。
這是上文中打磨過水口的零件,一眼看上去表面平整規(guī)則。
倘若你對表面進(jìn)行打磨,就會(huì)發(fā)現(xiàn)表面上有兩處圓點(diǎn)型的凹陷。這就是縮膠了。
面對這種輕微的縮膠,我們只需要使用1000目砂紙按壓表面進(jìn)行打磨就可以完全去除。
像這樣,表面經(jīng)過打磨后縮膠已經(jīng)完全消失,且零件的邊緣線尤為銳利,這都是對零件進(jìn)行充分打磨而帶來的好處。
以翅膀零件來舉例,可以看到縮膠的位置更為明顯。而且縮膠內(nèi)陷的造型非常規(guī)則。翻過背后,我們就能發(fā)現(xiàn)縮膠的位置跟零件內(nèi)部的固定框架、組合樁等完全匹配。
因?yàn)榱慵胶瘢湛s越大,縮膠就越是明顯。剛好內(nèi)部框架、組合樁等位置厚度要比空缺位置大,因此縮膠就全都集中在這些位置上了。
這塊零件的表面還有不少的細(xì)節(jié)刻線。在打磨縮膠的時(shí)候可能會(huì)把刻線也一起磨掉,因此在打磨去除縮膠前,我們需要先對刻線進(jìn)行加深操作。
圖中我使用的是郡士的鷹嘴刻線刀,選用了0.15mm寬度的刀頭。這個(gè)尺寸與原零件的線寬完全一致,只需要簡單地勾拉幾次就能完成加深。
然后就是使用1000目砂紙對零件按壓打磨。因?yàn)檫@個(gè)零件的面積較大,縮膠分布廣,所以打磨操作需要很有耐心,多花時(shí)間才能完成。
經(jīng)過數(shù)次打磨,縮膠位置已經(jīng)完全去除干凈了。
這是肩甲上的零件。經(jīng)過表面打磨可以看到其實(shí)表面也是存在較為明顯的縮膠情況。
階段總結(jié):
縮膠,是廣泛存在于塑料零件上的瑕疵。尤其出現(xiàn)在組合樁等厚度較大的位置。而對模型零件的表面進(jìn)行打磨,原本難以發(fā)現(xiàn)的縮膠就能輕易地發(fā)現(xiàn),從而進(jìn)行修正。
同時(shí),經(jīng)過打磨之后的零件表面會(huì)出現(xiàn)很多細(xì)小的打磨坑紋。如果我們使用1000目砂紙進(jìn)行打磨,那么打磨后的坑紋也是會(huì)在1000目或以下。我們涂裝前噴涂的1000目水補(bǔ)土可以完美地填補(bǔ)坑紋,并且形成卡扣結(jié)構(gòu),以物理形式令漆面更加牢固地附著在零件表面,不易掉漆或者磨花。
綜上所述,總結(jié)全件打磨對制作模型所帶來的好處:
1、 去除例如水口、分模線、飛邊、落差、波紋等塑料瑕疵;
2、 去除縮膠等表面缺陷。
3、 物理層面上增強(qiáng)水補(bǔ)土對零件的附著力。
說到縮膠打磨,可能就會(huì)有朋友問:“為什么不用牙膏補(bǔ)土填平后再打磨”之類的問題。
確實(shí),使用牙膏補(bǔ)土填平打磨也是很常見的方法。可是牙膏補(bǔ)土本身的收縮性也很強(qiáng),打磨過程中掉落的可能性也有,用起來需要注意的事情也很多,用不好也會(huì)適得其反。
再考慮到我這里邊幅有限,關(guān)于牙膏補(bǔ)土填補(bǔ),或者AB補(bǔ)土填補(bǔ)空缺的操作,就讓我日后再開一期詳談吧。
第三部分:線條的強(qiáng)化加深操作。
以小腿裝甲為例。此零件左右兩端均有一段由斜角狀細(xì)節(jié)產(chǎn)生的90°夾角高低線。這種細(xì)節(jié)線位沒有規(guī)則線槽,在涂裝后難以進(jìn)行滲線,因此我們需要進(jìn)行加深刻畫。
我使用郡士的0.15mm寬度的鷹嘴刻線刀,以夾角為輔助在高低線拉刻2~3次便能制作出一道規(guī)則的線槽。如此一來便不用擔(dān)心涂裝后無法滲線的問題了。
這是小腿接近膝蓋的零件,在紅色零件的一側(cè)存在兩道帶有斜角的高低細(xì)節(jié)線。這里同樣沒有規(guī)則線槽,需要進(jìn)行加深刻畫。可是這里的夾角太淺,無法為刻線刀提供輔助,因此我們需要使用額外的輔助措施。
這里我是用了透明硬邊膠帶進(jìn)行輔助。郡士的鷹嘴刻線刀指向性較強(qiáng),只需要稍加輔助就能順暢地完成刻線制作。
加深高低刻線之后,同樣使用1000目的砂紙將零件的表面打磨感覺,去除刻線時(shí)產(chǎn)生的多余毛刺就能完成全部操作。
圖中這是頭部的零件,我同樣使用0.15mm寬度的刀頭對刻線進(jìn)行加深操作。
0.15mm的刻線刀頭寬度幾乎能滿足這款艾比安的全部操作。由始至終都不需要替換其他刀頭。0.15mm確實(shí)是制作高達(dá)模型中常用的尺寸,建議各位常備。
如此一來,通過充分的零件打磨與加深刻線操作,我們便完成了這次MG艾比安的基礎(chǔ)修整工作。
那么接下來我們就準(zhǔn)備開始對模型進(jìn)行涂裝吧。
階段總結(jié):
關(guān)于刻線的處理,其實(shí)我在之前的“阿斯莫德·上篇”中以及“大白鵝篇”中描述得會(huì)更多更具體。所以喜歡的話可以回頭去看看。
阿斯莫德·上篇:https://bbs.78dm.net/forum/post/819276.html
大白鵝篇:https://bbs.78dm.net/forum/post/754012.html
第四部分,郡士GX及SM系列金屬色涂裝展示。
考慮到這次的涂裝是以紅色+金色+黑色為主導(dǎo)配色風(fēng)格,因此我特意準(zhǔn)備了郡士GX202金屬紅、GX212金屬桃紅、SM207超級黃金色等涂料進(jìn)行展示。而噴涂的設(shè)備為郡士PS289型0.3噴筆,這也是模型圈子里絕大部分人的選擇。
圈子里的人常言說,涂裝金屬色最好使用黑色作為底漆進(jìn)行涂裝。事實(shí)真的如傳言那樣嗎?我來驗(yàn)證一番。
在開始涂裝模型之前,我先準(zhǔn)備了一些黑色以及白色的塑料勺子來模擬黑白兩種底色。我們先一起來對比下不同的底色對金屬色的影響吧。
這里先用郡士SM208超級鋁合金色作為示范。這個(gè)顏色跟銀色較為接近,以此作為銀色系的代表。
在黑底下涂裝時(shí),顯色的金屬質(zhì)感比白底的更為顯著,同時(shí)色澤也更為潔白。由此看來使用銀色系的涂料時(shí),黑底確實(shí)具有更好的表現(xiàn)效果。
接著我們使用SM207超級金為示范,這也能作為金色系的標(biāo)準(zhǔn)代表了。
在黑底時(shí)涂裝此金色涂料,金色的光感更好,且金屬質(zhì)感也更為明確。使用白底的話在金屬質(zhì)感上有輕微的削弱情況。因此黑底對金色系涂裝有提高作用的結(jié)論也是成立的。
接著我們使用GX202金屬紅作為示范。這款金屬紅可以說是除金銀二色以外的金屬一般色的典型代表了。
在黑底涂裝時(shí),金屬紅出現(xiàn)了發(fā)灰發(fā)暗的情況,金屬質(zhì)感有輕微的提高但紅色的飽和度卻出現(xiàn)不足。而在白底時(shí),涂層色調(diào)紅潤,飽和度更高顏色更為鮮艷,發(fā)色更為理想。看來金屬紅還是要使用白底為好。
最后我使用GX212金屬桃紅色做示范。這個(gè)顏色比金屬紅要淺,是介乎于金屬紅與銀之間的一種涂料。
圖片上可以看出,使用黑底時(shí)桃紅色缺飽和的情況更加明顯,涂層漆面出現(xiàn)了更為明顯的偏灰的情況。而在白底時(shí),涂層顯色情況與涂料瓶蓋的示范色幾乎一致。由此看來白底確實(shí)更適合金屬桃紅色的發(fā)色。
關(guān)于金屬色的底色選擇總結(jié):
其實(shí)嘛,金屬色的底色是需要根據(jù)想要的效果來做選擇的,不能以一概論來選擇黑色。
黑色的底色,更能激發(fā)金屬色的金屬質(zhì)感,但卻會(huì)對彩色金屬色造成發(fā)灰發(fā)暗的情況。
白色的底色,更能還原彩色金屬色的色彩,但對金屬質(zhì)感的表達(dá)提升不明顯。
以銀色為例,我們看待銀色首先就是金屬質(zhì)感。因?yàn)殂y色自身沒有彩色的色感,所以缺飽和的問題在銀色上并不能反映出來,甚至可能還會(huì)覺得適當(dāng)?shù)娜憋柡停绞呛谩R虼嗽?/span>銀色涂裝上確實(shí)是使用黑色的底色是最好的選擇。
以金色為例,使用白色做底色與黑色做底色,在實(shí)際中表達(dá)的差異性其實(shí)并沒有很顯著。如果模型作品最終是放在光線良好的攝影棚中拍攝,相信沒有人能看出白色底色與黑色底色的區(qū)別,這是大實(shí)話。但金色同樣是更為追求金屬質(zhì)感的色種,因此我也是推薦各位使用黑色做底色。
以金屬紅/藍(lán)/綠為例。以黑色作為底色確實(shí)會(huì)更能激發(fā)金屬質(zhì)感,但缺飽和的問題將會(huì)很嚴(yán)重,令顏色偏黑、發(fā)灰,效果強(qiáng)差人意。用白色作底色時(shí),金屬紅/藍(lán)/綠(以下統(tǒng)稱金屬彩色系)的發(fā)色會(huì)更加鮮艷,飽和度更高,更能還原色彩本身應(yīng)有效果。雖然金屬質(zhì)感表達(dá)并不如銀色突出,但起碼最基本的飽和度和色澤得到保障。因此,我建議在使用金屬彩色系涂裝時(shí),采用白色作為底漆。
由此可見,網(wǎng)絡(luò)上的網(wǎng)紅說:“黑色是金屬色唯一正確的底色選擇”的這個(gè)說法我是不認(rèn)同的。我認(rèn)為必須要根據(jù)實(shí)際環(huán)境以及作品的表達(dá)效果來選擇合適的底色。所以網(wǎng)紅的說法到底有多少是親身經(jīng)驗(yàn)?還是以訛傳訛得出來的謠言?請各位根據(jù)我上文的內(nèi)容來自行判斷吧。
最后我再說一個(gè)小小的經(jīng)驗(yàn)。
由上個(gè)世紀(jì)90年代就開始做模型涂裝的鐵骨玩家圈子里,有對金屬色底漆的一個(gè)獨(dú)特理解:“銀色最好的底色是深灰色,光澤深德灰的那種。金色最好的底色是偏深的中性灰,不用太深像高達(dá)關(guān)節(jié)色那種就可以了。”
至于這個(gè)老一派的說法是真是假是不是符合各位的價(jià)值觀,就還得請各位去對比探究一下了。反正我是挺認(rèn)同的。
接下來我們開始進(jìn)行透明色涂裝。
我本次制作的艾比安,針對紅色部分是打算采用偽電鍍風(fēng)格涂裝。因此透明紅是必須的。我選擇了郡士新推出的GX121透明紅涂料。而不同的金屬色底色上使用透明紅最終呈現(xiàn)的顏色差異是怎樣的?現(xiàn)在也我們來一探究竟。
首先,我以SM208超級鋁合金以及SM207超級金來作對比。這恰好也就是我們常見的銀底與金底之間的差異了。
在SM208超級鋁合金色為底漆(即銀系底色)的時(shí)候,透明紅覆蓋紅整體呈現(xiàn)出純正的深紅色外觀,紅色調(diào)較為深邃了。如果采用不銹鋼色這種深沉的銀色,電鍍紅會(huì)呈現(xiàn)更為醇厚的質(zhì)感,非常適合深沉紅色為主的科幻模型制作。
在SM207超近金色為底漆(即金系底色)的時(shí)候,透明紅覆蓋后呈現(xiàn)出一定的橙色調(diào)。這是黃金色穿透透明紅后帶入的效果。輕微偏橙的電鍍紅色讓人感覺更為鮮艷,顏色層次更豐富且?guī)в谢馃岬母杏X,個(gè)人覺得非常適合制作新安洲、沙扎比一類的機(jī)體。
然后,我再以GX202金屬紅與GX212金屬桃紅色來作對比。同樣是覆蓋涂裝GX121透明紅來展示效果。
使用GX202金屬紅作為底色制作的電鍍紅,呈色紅潤飽和度較高。金屬紅自身的紅色色彩對透明紅產(chǎn)生了一定的補(bǔ)正,色彩飽和度比金銀底色的更高,個(gè)人覺得十分好看。
使用GX212金屬桃紅色作為底色的效果與使用銀色時(shí)候的效果較為接近。
經(jīng)對比,我個(gè)人覺得使用SM207超級金色以及GX202金屬紅做底色制作的兩種偽電鍍紅是最好看的。一個(gè)色澤鮮艷,一個(gè)飽和度極高。事實(shí)上使用金色作為底色制作電鍍紅的手法亦是圈子里絕大部分人的選擇。在這次制作中,我希望能做出與別不同的感覺,因此將使用GX202金屬紅作為底色。
關(guān)于透明色使用的階段總結(jié):
透明色是一種特殊的色種,它與不透明的實(shí)色(以下簡稱做實(shí)色)的區(qū)別在于:透明色的色度會(huì)隨厚度的增加而增加,且沒有明確的飽和上限。
以一句文言文來比喻:“水清則淺,水綠則深,水墨則淵。”換句話說,透明色的厚度越大顏色越深。
因此,我們在涂裝透明色的時(shí)候一定要把握好漆面厚度,不然就會(huì)出現(xiàn)有深淺色差。
模型的零件會(huì)存在C面、夾角、凹陷等高低落差不同的位置,倘若涂裝手法不成熟,就很容易造型漆面厚度不一而導(dǎo)致的色差問題。當(dāng)涂裝厚度過大的時(shí)候,透明漆可能出現(xiàn)邊緣積聚,而導(dǎo)致邊緣顏色深,中心顏色淺的情況。
同時(shí),如果透明色覆蓋金屬色時(shí)厚度過大,就有可能會(huì)出現(xiàn)溶解金屬色(也就是返底現(xiàn)象),導(dǎo)致金屬色局部質(zhì)感下降,令電鍍涂裝出現(xiàn)局部的質(zhì)感缺陷。
由此我們可以得出透明色的使用注意事項(xiàng):
1、注意漆面的厚度控制,防止出現(xiàn)厚度色差;
2、注意厚度控制,防止出現(xiàn)溶解底層金屬色。
所以說白了,透明色的涂裝就是要注意厚度控制。而要控制漆面厚度最有效的措施就是采用薄噴多層的技術(shù)了。請各位合理使用薄噴多層,不要盲目使用濕噴、厚噴、自流平等措施。
第五部分:模型涂裝制作。
考慮到GX202金屬紅在白色底漆時(shí)具有更高的發(fā)色效果。因此我使用了白色水補(bǔ)土來簡化制作。這里我選用了郡士的水性1000目水補(bǔ)土。這個(gè)水性水補(bǔ)土顆粒細(xì)膩,涂裝后能形成光滑平面,有助于提高漆面的平滑度。而且這款水性水補(bǔ)土的漆面韌性極強(qiáng),可以減低剮蹭掉漆的風(fēng)險(xiǎn)。
隨后,我使用GX202金屬紅對零件進(jìn)行統(tǒng)一涂裝。GX202金屬紅的覆蓋力在白底下非常理想,僅一層涂裝幾乎就能完全顯色。
然后我使用GX121透明紅進(jìn)行涂裝。這里我使用了薄噴多層的操作要領(lǐng)進(jìn)行制作,為的是控制透明漆的厚度。左邊零件為未涂裝GX121透明紅的金屬紅狀態(tài),中間的零件為透明紅涂裝1層時(shí)的效果,右邊零件為GX121涂裝了兩層后的效果。
GX121透明紅在薄噴兩層時(shí)能達(dá)到完全顯色的效果。
在曲面零件上可以直觀看出,涂裝GX121透明紅后,零件的質(zhì)感、色澤已經(jīng)得到了飛躍性提高。在燈光下的效果已經(jīng)可以達(dá)到偽電鍍的質(zhì)感要求,且光潔度也非常理想。
套件中黑色的零件,我直接使用了GX02光澤黑進(jìn)行涂裝。雖然看上去黑色已經(jīng)非常純正了,但其實(shí)這還有這可以提高的空間。
對于提升黑色零件的涂裝質(zhì)感,我同樣使用了GX121透明紅進(jìn)行覆蓋涂裝。
圖中左側(cè)的零件組為單純使用GX02亮光黑色涂裝的效果。而右面的零件組為GX02亮光黑上覆蓋了GX121透明紅的效果。
可以非常直觀地看到,覆蓋了GX121透明紅以后,零件的飽和度得到了顯著提高。
倘若在光線良好的環(huán)境下,通過反光我們可以發(fā)現(xiàn),在GX02亮光黑的基礎(chǔ)上覆蓋GX121透明紅的零件,其光感更好,表面更加光潔且反光質(zhì)感帶有明顯的紅調(diào)。
這個(gè)覆蓋涂裝的操作能更進(jìn)一步提升作品層次,豐富色澤,是一個(gè)實(shí)用性很強(qiáng)的技巧。
作品中金色的部分我直接使用了SM207超級黃金色來進(jìn)行涂裝。個(gè)人認(rèn)為黃金色、耀金色這些標(biāo)準(zhǔn)的金色搭配紅色使用效果非常理想。
MG套件的分件分色幾乎是完美的。但為了彰顯個(gè)人風(fēng)格,我個(gè)人增加了不少分色的地方。因?yàn)槭莻坞婂兊耐垦b,漆面比較嬌氣。以防在分色環(huán)節(jié)出現(xiàn)問題,我還是建議各位選擇可靠的遮蓋帶進(jìn)行操作以防出現(xiàn)傷害漆面的情況。我在這里使用的是郡士的遮蓋帶,當(dāng)然其實(shí)不同品牌的遮蓋帶效果都差不多,也可以用田宮或者鴨井的,大家按照自己的喜好來選擇吧。
反正,千萬不要用工業(yè)遮蓋帶就好了,容易損壞漆面。
在進(jìn)行骨架涂裝前,我會(huì)先用遮蓋帶包裹主要關(guān)節(jié)的可動(dòng)軸,防止漆面增加厚度而導(dǎo)致關(guān)節(jié)過緊。
骨架與關(guān)節(jié)位置的零件,我使用郡士GX201金屬鐵黑色進(jìn)行涂裝。這個(gè)涂料的成色效果幾乎能滿足所有科幻模型對骨架的表達(dá)要求。
艾比安高達(dá)的大腿、上臂等位置是灰色的成型色,而我在這里主要使用了SM208超級鋁合金來表達(dá)。為了能有更貼近于原設(shè)定風(fēng)格,我在SM208中額外添加了5%的GX201鐵黑色來令鋁合金色帶有一定的灰度。
多節(jié)鞭以及大劍等武裝零件,我在涂裝了SM208超級鋁合金色的基礎(chǔ)上,覆蓋涂裝了一層GX101透明黑,操作方法與紅色零件的偽電鍍涂裝完全一致。GX101透明黑更像是一種煙熏的透明色,能增加底下金屬色的暗度,但又不會(huì)影響金屬光彩。像這樣類似暗鋼色的效果也是不錯(cuò)。
什么?你說看不見我對鞭子做無縫?說什么呢,無縫又不是本次的主題,這么麻煩的東西當(dāng)然用愛無視啦。
如此一來,我們便完成了作品的基礎(chǔ)涂裝了。
第六部分:后期制作與細(xì)節(jié)優(yōu)化
當(dāng)完成了基礎(chǔ)涂裝以后,我們就需要對模型的細(xì)節(jié)位置進(jìn)行優(yōu)化處理。而面對難以遮蓋的細(xì)節(jié)我們可以采用面相筆手涂的形式來實(shí)現(xiàn)。
我在這里準(zhǔn)備了一把郡士的“丸筆2號(hào)”型面相筆來進(jìn)行筆涂補(bǔ)色操作的展示,使用的涂料為SM207超級黃金色。
首先搖勻涂料,然后打開瓶蓋后,以瓶蓋內(nèi)的小碗為容器,使用面相筆蘸取涂料。
在使用SM系列金屬色手涂時(shí),我會(huì)在不稀釋的情況下直接蘸取手涂。SM系列金屬色的涂料流動(dòng)狀態(tài)良好,適合直接手涂使用。
然后直接以面相筆在需要補(bǔ)色的位置上輕畫就能完成細(xì)節(jié)補(bǔ)色,非常簡便。而且郡士的金屬色系列就算手涂也能有很好的效果,減免了大量繁瑣的遮蓋分色工序。
這是我第一次使用郡士的面相筆,不得不說這款面相筆的手感極好,甚至超出我的預(yù)期。
全鋼筆身的相當(dāng)有分量感,筆身堅(jiān)硬不易變形且外皮還有猛男粉的透明橡膠包裹。手感非常好也不容易打滑,拿在手上感覺棒極了。且筆頭的收束性極好,也很容易清洗干凈,值得推薦。
這樣一把讓我覺得手感極佳的面相筆,售價(jià)確實(shí)不算便宜。目前淘寶上也得要好幾十塊。而在相同的價(jià)格區(qū)間我們還能買到國產(chǎn)的,一包20~30支的廉價(jià)面相筆,可以實(shí)現(xiàn)用完即棄的土豪玩法。所以到底是選擇買一把好的面相筆重復(fù)使用?還是選擇以量取勝的便宜品?那就讓各位玩家自行決定了。
倘若你選擇了購買這把郡士的面相筆,我們在使用后必須要注意清洗與保養(yǎng),不然就會(huì)產(chǎn)生損壞。清洗時(shí)可以使用藍(lán)標(biāo)稀釋液泡洗蘸有涂料的筆頭數(shù)秒,然后來回晃動(dòng)讓涂料充分溶解脫落。
隨即在紙巾上擦拭干凈就能完成清洗。
再次重申,不管面相筆性能再好,不注重清洗與保養(yǎng),筆是用不持久的,因此我們必須要在每次使用后及時(shí)清洗。
套件的噴口細(xì)小,內(nèi)部空間亦較小,使用面相筆手涂補(bǔ)色是合理的選擇。
這里我使用GX202金屬紅,以面相筆手涂制作。在使用GX系列金屬色手涂時(shí),我會(huì)適當(dāng)使用少量稀釋液,在1/0.5的比例下蘸取手涂。
當(dāng)完成了補(bǔ)色操作后,我們就能對零件進(jìn)行滲線操作。這里我使用WC01黑色滲線液。具體使用方法是使用面相筆蘸取隨即進(jìn)行縫線的滲涂。在過往幾期均有描述,這里便不再重復(fù)贅述了。
因?yàn)楸敬巫髌肥莻坞婂兺垦b。在涂裝透明色時(shí)漆面已經(jīng)非常非常光滑,所以滲線操作的壓力很低,而且也非常容易擦干凈。所以大家平常涂裝時(shí)需要注意涂裝漆面的平整度,方便后續(xù)的表面處理工序。
最后的表面處理,就是制作細(xì)節(jié)水貼了。這里準(zhǔn)備了郡士藍(lán)蓋底膠型水貼軟化劑。我以紅色零件使用一般的市售水貼進(jìn)行操作展示。
首先,我會(huì)使用藍(lán)蓋底膠型水貼軟化劑瓶蓋內(nèi)部的刷頭,點(diǎn)加少量軟化劑在零件表面。
隨即將已經(jīng)泡發(fā)好的水貼轉(zhuǎn)移到軟化劑之上。
等待約30秒作用,讓水貼充分軟化后,以棉簽吸收內(nèi)部多余的軟化劑。
等軟化劑干透,便能完成水貼的制作了。使用了水貼軟化劑后,水貼圖案能更貼服地附著在零件表面,就算是起伏、轉(zhuǎn)角的位置也不容易出現(xiàn)水貼翹起的情況。這里使用的軟化劑為底膠型軟化劑,也能促進(jìn)水貼更加牢固地粘貼在零件表面,不會(huì)輕易掉落,是水貼操作中必不可少的耗材。
最后,我們需要對模型零件涂裝透明保護(hù)漆。
因?yàn)槭枪鉂擅娴哪P停虼诉@次我選用的是郡士GX100光油。這款光油在模型制作圈子里被譽(yù)為是最好的硝基光油,沒有之一。光澤度、平整度都可圈可點(diǎn),得到玩家群體的廣泛認(rèn)可。
而近年來,圈子里面很多人開始流行使用氨基光油。據(jù)說氨基光油的效果更好而且漆面更堅(jiān)固。但是處于身體安全的角度考慮,我還是老老實(shí)實(shí)地使用專用的模型漆吧。
GX100光油具有極好的填補(bǔ)能力,涂裝后,水貼與零件表面的高度落差幾乎被完全填補(bǔ),看不出水貼的邊緣厚度。同時(shí)GX100的光澤感非常強(qiáng),原本已經(jīng)光潔的為電鍍紅涂層在其加持下有著更強(qiáng)的反光效果,已經(jīng)達(dá)到了鏡面涂裝的程度。
GX100極好的填補(bǔ)能力,也能對透明件打磨后的輕微磨痕有著良好的修補(bǔ)效果。正因GX100極好的填補(bǔ)能力,以及出眾的光澤度,令它成為了圈子里玩家們的不二之選。
最后的最后,我們僅需將零件組合,便能完成本次模型的制作。
阿宅點(diǎn)評:大佬的教程是真的強(qiáng),然后光黑之后上透明紅,這個(gè)真的挺新奇,以后要試下
者按:日前,《連線》雜志發(fā)表了一篇文章,詳細(xì)描述了Facebook早期發(fā)展的故事,內(nèi)容摘錄自《天才谷:未刪減的硅谷歷史》(Valley of Genius:The Uncensored History of Silicon Valley)一書,這本書的作者為亞當(dāng)·費(fèi)舍爾(Adam Fisher),里面描述了硅谷各家主要科技公司的創(chuàng)業(yè)史,其中有很多不為人知的故事。
每個(gè)看過《社交網(wǎng)絡(luò)》(The Social Network)電影的人都知道Facebook成立的故事。那是2004年,哈佛大學(xué)的春季學(xué)期。然而,人們往往忘記的是,F(xiàn)acebook在劍橋市只有短短幾個(gè)月的時(shí)間。當(dāng)時(shí)它叫做TheFacebook.com,是一款專門針對大學(xué)生的Friendster復(fù)制品。Friendster是一個(gè)位于硅谷的開創(chuàng)性社交網(wǎng)絡(luò)。
馬克·扎克伯格(Mark Zuckerberg)的山寨網(wǎng)站在校園里很受歡迎,所以他和幾個(gè)學(xué)校里的好友決定期末考試后搬到硅谷,在那里度過暑假,將Facebook推廣到全國的其他大學(xué)。硅谷是互聯(lián)網(wǎng)行動(dòng)的發(fā)源地。他們大概就是這么想的。
在當(dāng)時(shí)的硅谷,人們普遍認(rèn)為互聯(lián)網(wǎng)淘金熱已經(jīng)基本結(jié)束。地盤被搶走了,邊界已經(jīng)確定了。互聯(lián)網(wǎng)贏了。見鬼,三年前,繁榮就已經(jīng)破滅了。然而,沒有人會(huì)費(fèi)心把備忘錄寄給馬克·扎克伯格——因?yàn)樵谀莻€(gè)時(shí)候,扎克只是個(gè)無名小卒:一個(gè)雄心勃勃的十幾歲大學(xué)生,癡迷于電腦地下組織。他對電腦了如指掌,但除此之外,他相當(dāng)無知——當(dāng)他還在哈佛的時(shí)候,總得有人向他解釋,Napster這樣的互聯(lián)網(wǎng)網(wǎng)站實(shí)際上是企業(yè)建立的。
但是扎克伯格可以黑進(jìn)去,在那個(gè)決定命運(yùn)的夏天,他遇到了硅谷的幾個(gè)關(guān)鍵人物,他們最終將徹底改變這家公司的方向。對于2004年和2005年這兩個(gè)關(guān)鍵月份的口述史,我采訪了所有的關(guān)鍵人物,并與其他一些有洞察力的人物交談。正如你將看到的,出現(xiàn)的是一幅關(guān)于企業(yè)原始文化的畫像,它將繼續(xù)影響著現(xiàn)在的Facebook。整個(gè)企業(yè)一開始就像一種玩笑,它不是一家企業(yè),而是一個(gè)夏日“啤酒乒乓”和代碼沖刺的借口。事實(shí)上,扎克伯格的第一張名片上寫著:“我是CEO……賤人。”
2006年3月,扎克伯格在位于帕洛阿爾托的 Facebook 總部拍攝。 他的第一張名片上寫著“我是 CEO... 賤人。”圖片來源:ELENA DORFMAN/REDUX
肖恩·帕克(Sean Parker)( Napster的創(chuàng)始人之一,F(xiàn)acebook的首任總裁) :互聯(lián)網(wǎng)時(shí)代以 Napster 結(jié)束,然后是互聯(lián)網(wǎng)泡沫破裂,這導(dǎo)致了社交媒體時(shí)代的到來。
史蒂文·約翰遜(Steven Johnson )(著名作家和文化評論員) :當(dāng)時(shí),網(wǎng)絡(luò)基本上是一種文學(xué)隱喻:“頁面”——然后是頁面之間的超文本鏈接。沒有用戶的概念;這根本不是隱喻的一部分。
馬克·平卡斯(Mark Pincus)(基礎(chǔ)社交媒體專利的共同所有者):我把Napster看作為社交網(wǎng)絡(luò)的開端——專注人,而不是頁面。對我來說,這是一個(gè)突破性的時(shí)刻,因?yàn)槲铱吹交ヂ?lián)網(wǎng)可以是一個(gè)完全分布式的對等網(wǎng)絡(luò)。我們可以繞開那些大的媒體公司,并且彼此聯(lián)系。
史蒂文·約翰遜:對我來說,這真的是從21世紀(jì)初寫博客開始的。你開始把這些網(wǎng)站聚焦在一個(gè)人的觀點(diǎn)上。它突然變得可以想象,哦,也許這里還有另外一個(gè)元素,網(wǎng)絡(luò)也可以組織起來?就像我信任這五個(gè)人一樣,我想了解他們的建議。早期的博客就是這樣的。
埃文·威廉姆斯(Ev Williams)( Blogger、Twitter和Medium的創(chuàng)始人):當(dāng)時(shí)博客鏈接很重,主要是關(guān)于互聯(lián)網(wǎng)的。“我們在網(wǎng)上寫關(guān)于互聯(lián)網(wǎng)的文章,然后鏈接到更多的互聯(lián)網(wǎng),這不是很有趣嗎?”
史蒂文·約翰遜:你會(huì)把一大堆不同的聲音匯聚起來,這些聲音基本上都可以向你推薦鏈接,所以會(huì)有一個(gè)個(gè)人的過濾器。
馬克·平卡斯:2002年,雷德·霍夫曼(Reid Hoffman)和我開始了頭腦風(fēng)暴:如果互聯(lián)網(wǎng)能像一場偉大的雞尾酒會(huì),會(huì)是什么樣的呢?你可以帶著一些驚人的體驗(yàn)離開,對吧?好的體驗(yàn)是什么?好的體驗(yàn)是工作、面試、約會(huì)的機(jī)會(huì),以及公寓、房子、沙發(fā)等。
所以雷德和我開始說,“哇,這個(gè)人際網(wǎng)絡(luò)實(shí)際上可以產(chǎn)生比谷歌更有價(jià)值的東西,因?yàn)槟阍谶@個(gè)接受高度審查的社區(qū)里,彼此之間有一些相似之處,每個(gè)人都有自己出現(xiàn)在這里的理由,所以你會(huì)得到信任。”信噪比可能很高。我們稱之為Web 2.0,但沒人想聽,因?yàn)檫@是在消費(fèi)互聯(lián)網(wǎng)的冬天。
肖恩·帕克:所以在2000年到2004年間,在Facebook出現(xiàn)之前,有一種感覺就像是互聯(lián)網(wǎng)上的一切都已經(jīng)完成了。絕對的底部大概出現(xiàn)在2002年左右。PayPal在2002年上市,這是當(dāng)年唯一一家進(jìn)行IPO的消費(fèi)互聯(lián)網(wǎng)公司。所以,有一個(gè)奇怪的過渡時(shí)期,總共只有六家公司得到了資金,或者類似的資助。Plaxo就是其中之一。Plaxo是一個(gè)原始的社交網(wǎng)絡(luò)。這是一種介于兩者之間的東西:一種有腿的怪魚。
亞倫·斯蒂格(Aaron Sittig)(發(fā)明 Facebook中“Like”的平面設(shè)計(jì)師) : Plaxo 是缺失的一環(huán)。 Plaxo是第一家真正成功的病毒式增長公司。 這時(shí),我們才開始真正理解病毒式增長。
肖恩·帕克:我做過的最重要的事情是在 Plaxo 開發(fā)優(yōu)化病毒性的算法。
亞倫·斯蒂格: 病毒式增長是指使用產(chǎn)品的人將產(chǎn)品傳播給其他人的時(shí)候——就是這樣。 人們不是因?yàn)橄矚g而決定傳播產(chǎn)品。而是人們在使用產(chǎn)品做他們想做的事情的自然過程中,自然而然地將產(chǎn)品傳播給其他人。
肖恩·帕克:從最早的類社交網(wǎng)絡(luò)(可能是Napster )到Plaxo (它有點(diǎn)像一個(gè)社交網(wǎng)絡(luò),但具有許多社交網(wǎng)絡(luò)的特征),再到LinkedIn、MySpace和Friendster,再到Facebook這個(gè)現(xiàn)代化的社交網(wǎng)絡(luò),發(fā)生了很大的演變。
埃茲拉·卡拉漢(Ezra Callahan)( Facebook第一批員工之一):在21世紀(jì)初,F(xiàn)riendster獲得了所有早期用戶,擁有一個(gè)非常密集的網(wǎng)絡(luò),有很多活動(dòng),然后就達(dá)到了這個(gè)臨界點(diǎn)。
亞倫·斯蒂格:當(dāng)時(shí)正在進(jìn)行一場非常大的競賽,F(xiàn)riendster真的起飛了,看起來Friendster真的發(fā)明了一種叫做“社交網(wǎng)絡(luò)”的新東西,他們是贏家,明顯的贏家。現(xiàn)在還不完全清楚到底發(fā)生了什么,但是這個(gè)網(wǎng)站的發(fā)展開始變得越來越慢,在某個(gè)時(shí)候它就處于停滯狀態(tài)了。
埃茲拉·卡拉漢:這為 MySpace 打開了大門。
埃文·威廉姆斯:MySpace 在當(dāng)時(shí)可是個(gè)“大人物”。
肖恩·帕克:那是一個(gè)復(fù)雜的時(shí)期。MySpace很快就從Friendster手中接管了世界。他們抓住了接力棒。所以Friendster在衰落,MySpace在上升。
斯科特·馬萊特(Scott Marlette)(在Facebook上增加照片標(biāo)簽的程序員) : MySpace非常受歡迎,但后來MySpace在擴(kuò)展上也遇到了問題。
亞倫·斯蒂格:然后,F(xiàn)acebook在2004年2月推出,幾乎無人問津,也沒有引發(fā)太多談?wù)摗?/p>
達(dá)斯汀·莫斯科維茨(Dustin Moskovitz)(扎克伯格的左膀右臂):當(dāng)時(shí)有一個(gè)非常普遍的問題,現(xiàn)在看來很微不足道。根本不可能想到一個(gè)人的名字,去查他們的照片。哈佛大學(xué)的所有宿舍都有一本名為face books的個(gè)人目錄——有些是印刷的,有些是在線的,大部分只提供給那個(gè)特定宿舍的學(xué)生。所以我們決定在網(wǎng)上創(chuàng)建一個(gè)統(tǒng)一的版本,我們稱之為“Facebook”,以區(qū)別于那個(gè)版本。
扎克伯格與他的哈佛室友、達(dá)斯廷·莫斯科維茨、中心共同創(chuàng)建了 Facebook。 2004年,肖恩·帕克以總裁身份加入了公司。 這個(gè)三人組照片于2005年5月在公司的帕洛阿爾托辦公室拍攝。圖片來源:JIM WILSON/NEW YORK TIMES/REDUX
馬克·扎克伯格(Mark Zuckerberg)(Facebook 的創(chuàng)始人和現(xiàn)任首席執(zhí)行官) : 幾周之內(nèi),就有幾千人注冊了。 我們開始收到其他大學(xué)的人發(fā)來的電子郵件,要求我們在他們的學(xué)校發(fā)布。
埃茲拉·卡拉漢:Facebook最初是在常春藤聯(lián)盟推出的,并不是因?yàn)樗麄兪前谅源蟮暮⒆樱幌氚褨|西交給常青藤聯(lián)盟。而是因?yàn)樗麄冇羞@種直覺,上常春藤盟校的人更有可能和其他常春藤盟校的學(xué)生成為朋友。
亞倫·斯蒂格: Facebook在伯克利推出時(shí),把社交規(guī)則完全改變了。當(dāng)我在伯克利的時(shí)候,你會(huì)發(fā)現(xiàn),聚會(huì)就是你花了整整一周的時(shí)間和人們交談,想知道什么是有趣的,然后你必須不斷地與他們保持聯(lián)系。有了 Facebook,知道周末發(fā)生了什么是微不足道的。一切都是為你準(zhǔn)備的。
Facebook早在2004年3月就來到了硅谷中心的斯坦福大學(xué)校園。
肖恩·帕克: 我在波托拉瓦利的室友都要去斯坦福。
埃茲拉·卡拉漢:我2003年我從斯坦福大學(xué)畢業(yè),當(dāng)時(shí)我和我的四個(gè)大學(xué)朋友在校園附近租了一所房子,我們有一間額外的臥室,所以我們在斯坦福大學(xué)的幾份電子郵件列表上做了廣告,找一個(gè)室友和我們一起搬進(jìn)那所房子。我們得到了一個(gè)叫肖恩·帕克的人的回復(fù)。他最終非常隨意地和我們住在一起,我們發(fā)現(xiàn),雖然Napster成了一種文化現(xiàn)象,但并沒有給他帶來任何收入。
肖恩·帕克:我的一個(gè)室友的女朋友在使用一種產(chǎn)品,我就想,“你知道,它看起來很像Friendster或者M(jìn)ySpace。”她說,“哦,是的,但大學(xué)里沒有人使用MySpace。”MySpace有點(diǎn)粗糙。
馬克·扎克伯格:MySpace有將近三分之一的員工都在監(jiān)控上傳的色情圖片。我們幾乎沒有在這方面花費(fèi)過多少力氣。原因是人們在Facebook上使用真名。
亞當(dāng)·達(dá)安熱洛(Adam D’Angelo)(扎克伯格高中時(shí)的黑客好友):真名真的很重要。
亞倫·斯蒂格:我們很早就明白了這一點(diǎn),因?yàn)樵赪ell上,社區(qū)原則已經(jīng)確立了:你為你說的話負(fù)責(zé)。我們把它帶得比Well還遠(yuǎn)。我們總是讓一切都可以追溯到一個(gè)特定的真人。
斯圖爾特·布蘭德(Stewart Brand) (第一個(gè)重要的社交網(wǎng)站W(wǎng)ell的創(chuàng)始人) :Well本來可以走這條路,但我們沒有。這是我們犯的錯(cuò)誤之一。
馬克·扎克伯格:我認(rèn)為,對于一個(gè)可能非常復(fù)雜的技術(shù)問題來說,這是一個(gè)非常簡單的社會(huì)解決方案。
埃茲拉·卡拉漢:在早期,它是一個(gè)相當(dāng)黑客化的簡單網(wǎng)站:只是基本的網(wǎng)頁表單,F(xiàn)acebook個(gè)人資料就是這樣的。
魯奇·桑哈維(Ruchi Sanghvi)(創(chuàng)建Facebook Newsfeed的程序員) :有一張小的個(gè)人資料照片,上面寫著“這是我的個(gè)人資料”和“看看我的朋友”,下面有三四個(gè)鏈接和一到兩個(gè)其他的框。
亞倫·斯蒂格:但我對他們產(chǎn)品的專注和清晰度印象深刻。一些小細(xì)節(jié)——比如當(dāng)你去查看你的個(gè)人資料時(shí),它非常清楚地說,“這就是你”,因?yàn)楫?dāng)時(shí)的社交網(wǎng)絡(luò)非常非常難以理解。所以,這款產(chǎn)品有一種成熟性,在產(chǎn)品問世幾年并得到改進(jìn)之前,你通常不會(huì)看到這種成熟性。
肖恩·帕克:我看到了這個(gè)東西,我給Facebook上的一些電子郵件地址發(fā)了郵件,我基本上說,“我和Friendster合作了一段時(shí)間,我只是想見見你們,看看是否有什么可以談的。”然后,我們在紐約開了個(gè)會(huì)——我不知道為什么會(huì)在紐約——?jiǎng)傞_始的時(shí)候,馬克和我只是討論產(chǎn)品設(shè)計(jì)和我認(rèn)為產(chǎn)品需要什么。
亞倫·斯蒂格:我接到肖恩·帕克的電話,他說:“嘿,我在紐約。我剛剛遇到了一個(gè)非常聰明的孩子馬克·扎克伯格,他就是那個(gè)創(chuàng)建Facebook的家伙,他們說他們有一個(gè)“秘密功能”即將推出,將改變一切!但他不肯告訴我是什么。我快瘋了。我不知道是什么。你知道這件事嗎?你能想出來嗎?你覺得會(huì)是什么?”所以我們花了一點(diǎn)時(shí)間談?wù)撍覀儫o法真正弄清楚他們將會(huì)改變一切的“秘密功能”到底是什么。我們有點(diǎn)沉迷于此。
在和肖恩·帕克見面兩個(gè)月后,馬克·扎克伯格搬到硅谷,打算把宿舍項(xiàng)目變成一項(xiàng)真正的事業(yè)。陪同他的還有他的共同創(chuàng)始人兼顧問達(dá)斯汀·莫斯科維茨和幾名實(shí)習(xí)生。
馬克·扎克伯格:帕洛阿爾托是一個(gè)神話般的地方,所有的技術(shù)都來自那里。 所以我想去看看。
魯奇·桑哈維:當(dāng)我聽到Facebook搬到海灣地區(qū)時(shí),我很驚訝,我以為他們還在哈佛的宿舍里工作。
在 Facebook 早期,扎克伯格招募了哈佛大學(xué)的同學(xué)克里斯·休斯,幫助對這項(xiàng)初創(chuàng)的服務(wù)提出建議。 兩人于2004年5月在艾略特宮拍攝。圖片來源: RICK FRIEDMAN/GETTY IMAGES
埃茲拉·卡拉漢:2004年夏天,一系列重大事件發(fā)生了:肖恩在街上偶遇Facebook聯(lián)合創(chuàng)始人的傳奇故事,在幾個(gè)月前他在東海岸遇見了他們。那次會(huì)面發(fā)生在我們都搬出一直住在一起的房子一周后。肖恩和他女朋友的父母在一起。
肖恩·帕克:當(dāng)時(shí),我在屋外散步,有一群孩子朝我走來——他們都穿著連帽衫,看起來很可能是剛剛出去鬧事的吸大麻的高中生,我聽到了我的名字。我想,哦,這是巧合,我再次聽到我的名字,就像是,“肖恩,你在這里做什么?”然后,我轉(zhuǎn)過身來。
我花了大約30秒的時(shí)間才弄清楚到底發(fā)生了什么,我終于意識(shí)到這是馬克和達(dá)斯汀以及其他一些人。 所以我就說“你們來這兒干嘛?”他們說,“我們就住在那里。”我就說“這真奇怪,我也住在這里!”這真是太奇怪了。
亞倫·斯蒂格:我接到肖恩的電話,他告訴我,“嘿,你不會(huì)相信剛剛發(fā)生的事情。肖恩說:“你得過來見見這些人。馬上過來。過來見見他們!”
肖恩·帕克:我甚至不知道從那里發(fā)生了什么,這甚至不是一種特別正式的關(guān)系。
亞倫·斯蒂格:于是我過去和他們見面,我對他們作為一個(gè)團(tuán)隊(duì)的專注度印象深刻。 他們偶爾會(huì)放松一下,做自己的事情,但是大部分時(shí)間他們都是坐在餐桌旁,開著筆記本電腦。 我會(huì)每周去他們那里幾次,那里總是我能找到他們的地方,只是坐在餐桌旁,不停地工作,以保持他們的產(chǎn)品不斷增長。
馬克想做的就是,要么把產(chǎn)品做得更好,要么休息一下,放松一下,這樣你就能有足夠的精力去做更多的產(chǎn)品。就這樣。他們除了去看電影,從來沒有離開過那所房子。
埃茲拉·卡拉漢:早期的公司文化非常非常松散。感覺就像一個(gè)失控的項(xiàng)目,有著驚人的商業(yè)潛力。想象一下你的新生宿舍經(jīng)營著一家企業(yè),就是那種感覺。
馬克·扎克伯格:大多數(shù)企業(yè)都不會(huì)像這樣:一群孩子,住在房子里,做他們想做的事情,不在正常時(shí)間醒來,不進(jìn)辦公室,雇人,比如把他們帶進(jìn)你的房子,讓他們和你一起放松一下,和你一起聚會(huì),和你一起抽煙。
埃茲拉·卡拉漢:客廳是辦公室,到處都有顯示器和工作站,眼睛能看到的地方,都是白板。
當(dāng)時(shí)馬克·扎克伯格癡迷于文件共享,在硅谷暑假的宏偉計(jì)劃是讓Napster起死回生。它會(huì)再次崛起,但這一次是Facebook內(nèi)部的一個(gè)功能。它的名字是Wirehog。
亞倫·斯蒂格:Wirehog就是馬克所說的要改變一切的秘密功能。馬克已經(jīng)確信,F(xiàn)acebook之所以能真正受歡迎,并鞏固其在學(xué)校的地位,是因?yàn)樗且环N向他人發(fā)送文件的方式——主要是為了交換音樂。
馬克·平卡斯:他們內(nèi)置了一個(gè)看起來像Napster的小東西——你可以看到別人在電腦上有什么音樂文件。
埃茲拉·卡拉漢:就在這個(gè)時(shí)候,我們目睹了Napster被法庭完全禁止,娛樂業(yè)開始起訴隨意分享文件的人。互聯(lián)網(wǎng)狂野西部的時(shí)代明顯結(jié)束了。
亞倫·斯蒂格:記住,Wirehog是在Facebook頁面上無法分享照片的時(shí)候發(fā)生的,這一點(diǎn)很重要。Wirehog將成為與他人分享照片的解決方案。你可以在你的個(gè)人資料上放一個(gè)框,人們可以去那里訪問你分享的所有照片——或者你分享的任何文件。它可能是音頻文件,可能是視頻文件,也可能是他們度假的照片。
埃茲拉·卡拉漢:但歸根結(jié)底,這只是一種文件共享服務(wù)。當(dāng)我加入Facebook的時(shí)候,大多數(shù)人已經(jīng)開始意識(shí)到,除非Wirehog有一些我們沒有想到的新用途,否則這只是一種負(fù)擔(dān)。“我們總有一天會(huì)被起訴,那又有什么意義呢?”這就是我們的心態(tài)。
馬克·平克斯:我有點(diǎn)奇怪為什么肖恩還想再次接近音樂。
亞倫·斯蒂格:我的理解是,F(xiàn)acebook的一些律師認(rèn)為這是一個(gè)壞主意。就在Facebook用戶增長非常迅速的時(shí)候,這項(xiàng)關(guān)于 Wirehog 的工作就被放棄了。
埃茲拉·卡拉漢:它們(各種大學(xué))瘋狂地要求加入。現(xiàn)在還只有一百所學(xué)校,但是在全國所有的學(xué)校,大學(xué)里的每個(gè)人都已經(jīng)聽說過了。使用數(shù)量已經(jīng)瘋了。白板上的一切都是與學(xué)校下一步要推出什么東西有關(guān)。這個(gè)問題非常獨(dú)特。簡單地說,“我們?nèi)绾螖U(kuò)大規(guī)模?"
亞倫·斯蒂格: Facebook 在一所學(xué)校發(fā)布,一天之內(nèi),就會(huì)有70% 的本科生注冊。 當(dāng)時(shí),沒有什么產(chǎn)品能像 Facebook 那樣快速發(fā)展。
埃茲拉·卡拉漢:我們要成功似乎并不是不可避免的,但成功的范圍看起來越來越清晰。達(dá)斯汀已經(jīng)在談?wù)摮蔀橐患?0億美元的公司。他們從一開始就有這個(gè)雄心。他們非常自信:兩個(gè)還是19歲的趾高氣揚(yáng)的孩子。
馬克·扎克伯格:有一天,我們只是坐在一起,說:“我們不會(huì)回學(xué)校了,不是嗎?”
埃茲拉·卡拉漢:這種傲慢看上去很了不起。
大衛(wèi)·崔(David Choe)(著名涂鴉藝術(shù)家):肖恩是個(gè)瘦弱的書呆子,他說:“我要去為Facebook籌款。我要改變這些混蛋的想法。”我說,“你打算怎么做?”他把自己變成了一個(gè)“阿爾法”男性。他的發(fā)型真TM的超級鋒利。他開始每天鍛煉,曬黑了,穿了一套漂亮的西裝。他參加了這些會(huì)議,拿到了錢!
馬克·平卡斯:大概是2004年9月或10月,我在Tribe位于波特雷羅山塵土飛揚(yáng)的磚房里的辦公室——Tribe.net的想法就像Friendster加上Craigslist——我們在會(huì)議室,肖恩說他要把Facebook的人帶進(jìn)來。他把扎克帶進(jìn)來,扎克穿著一條運(yùn)動(dòng)褲,穿著阿迪達(dá)斯的人字拖,他看起來很年輕,坐在那里,雙腳放在桌子上,肖恩正在飛快地談?wù)揊acebook將要做的和關(guān)于增長的所有事情以及其他一切,我被迷住了。
因?yàn)槲以谧鯰ribe,我們沒有成功,我們已經(jīng)停滯不前了,我們正在碰壁,試圖找出如何增長,這是一個(gè)孩子,他有一個(gè)簡單的想法,他剛剛起飛!我已經(jīng)對他們的成就感到敬畏,也許還有點(diǎn)惱火。因?yàn)樗麄冏隽艘恍└唵巍⒏臁⒏俚氖虑椋缓笪矣浀眯ざ髟谖肄k公室的電腦上打開了Facebook,他開始向我展示它,而我不能夠在它上面注冊,因?yàn)橹挥写髮W(xué)生才能用,太神奇了。
人們把他們的電話號(hào)碼和家庭地址,以及關(guān)于他們自己的一切都放上去了,我簡直不敢相信!但那是因?yàn)樗麄兊玫搅诉@種信任。然后肖恩迅速組織了一輪投資,他建議扎克,我想,從彼得·蒂爾那里拿50萬美元,然后從我和雷德·霍夫曼那里各拿3.8萬美元。因?yàn)槲覀兓旧鲜俏ㄒ灰粋€(gè)在社交網(wǎng)絡(luò)上做任何事情的人。那是一個(gè)非常非常小的俱樂部。
埃茲拉·卡拉漢:到了12月,這種氣氛——我不會(huì)說這是一種更專業(yè)的氣氛,但是馬克和達(dá)斯汀一起工作的所有孩子要么回到學(xué)校,要么回到斯坦福,工作對他們來說變得更加嚴(yán)肅了。他們比第一個(gè)夏天工作得多。我們要到2005年2月才搬進(jìn)辦公室。就在我們簽租約的時(shí)候,肖恩胡亂地開始說:“老兄!我認(rèn)識(shí)一個(gè)街頭藝術(shù)家。讓他進(jìn)去把事情(裝飾)都做完。”
大衛(wèi)·崔:我當(dāng)時(shí)說,“如果你想讓我把整棟大樓都粉刷一遍,那就是6萬美元。” 肖恩說:“你要現(xiàn)金還是要股票?”
埃茲拉·卡拉漢:他用Facebook的股票支付了大衛(wèi)·崔裝修的費(fèi)用。
大衛(wèi)·崔:我根本不在乎 Facebook,甚至不知道它是什么。 你必須要有大學(xué)郵箱才能進(jìn)去。 但我喜歡賭博,你知道嗎? 我相信肖恩。 我就想,這孩子知道些什么,我要把我的錢押在他身上。
埃茲拉·卡拉漢:然后我們就搬了進(jìn)去,當(dāng)你第一次看到這個(gè)涂鴉時(shí),就會(huì)說,“天哪,這個(gè)家伙對辦公室做了什么?”辦公室在二樓,所以當(dāng)你走進(jìn)來的時(shí)候,你必須馬上走上樓梯,而在面對你的10英尺高的大墻上,你看到的只是一個(gè)胸部巨大的女人,穿著瘋狂的麥克斯風(fēng)格的服裝,騎著一只斗牛犬。
這是最嚇人、完全不合適的東西。“該死的,肖恩!你做了什么?”與其說這是一幅畫,還不如說那是文化。更重要的是肖恩這么做了,這為我們定下了基調(diào)。當(dāng)你走進(jìn)辦公室的時(shí)候,第一件看到的就是一個(gè)騎著斗牛犬的大胸女戰(zhàn)士,所以,要做好準(zhǔn)備!
魯奇·桑哈維:是的,這個(gè)涂鴉有點(diǎn)不雅,但是它是不同的,它是充滿活力的,它是活的。 這種能量非常明顯。
凱蒂·杰明德(Katie Geminder)( Facebook早期項(xiàng)目經(jīng)理):我喜歡它,它給人的感覺很強(qiáng)烈。里面有一些非常性感的畫面,我并不在意,但是這可能被認(rèn)為有點(diǎn)敵意,我想我們已經(jīng)處理了一些更具挑釁性的畫面。
埃茲拉·卡拉漢:我不認(rèn)為是大衛(wèi)·崔干的,我認(rèn)為是肖恩的女朋友,她在女廁所里描繪了兩個(gè)完全赤裸的女人糾纏在一起,露骨而親密的女同性戀場景。這肯定比一個(gè)人通常在一個(gè)辦公室的女廁所里看到的更具暗示性。實(shí)際上,這只持續(xù)了幾個(gè)星期。
麥克斯·凱利(Max Kelly)(Facebook 的第一位網(wǎng)絡(luò)安全官) : 有一幅4英寸 × 4英寸的圖畫,上面畫著某人被干了。 一位客服人員抱怨說,這是“性本質(zhì)”,考慮到他們每天看到的情況,我不知道他們?yōu)槭裁匆г惯@個(gè)。 但是我最終還是去了當(dāng)?shù)氐囊患疑痰辏I了一支金色的畫筆,在涂鴉上涂鴉——只是一個(gè)隨意的設(shè)計(jì)ーー這樣就不會(huì)顯示有人被干了。
杰夫·羅斯柴爾德(Jeff Rothschild)(投資者變成Facebook員工):這很瘋狂,但我覺得很酷。它看起來更像大學(xué)宿舍或兄弟會(huì),而不是一個(gè)公司。
凱蒂·杰明德:角落里塞著毯子,到處都是電子游戲,還有 Nerf 玩具和樂高玩具,有點(diǎn)亂七八糟。
杰夫·羅斯柴爾德:有一個(gè)PlayStation。有幾張舊沙發(fā)。很明顯,有人睡在那里。
卡雷爾·巴隆(Karel Baloun)(Facebook 最早的程序員之一) :我每周可能會(huì)在那里呆上兩三個(gè)晚上。 我在一次員工集會(huì)上贏得了“最有可能在桌子下面發(fā)現(xiàn)你的”獎(jiǎng)。
杰夫·羅斯柴爾德:他們有一個(gè)酒吧,一整個(gè)架子上都是酒,一天下來人們可能會(huì)喝一杯。
埃茲拉·卡拉漢:辦公室里有很多酒。 總有這樣的早晨,我走進(jìn)辦公室,聽到啤酒罐在我打開門的時(shí)候移動(dòng),辦公室里散發(fā)著陳釀啤酒的味道,就像一個(gè)垃圾桶。
魯奇·桑哈維:他們有桶裝啤酒。 啤酒桶上面有一些攝像技術(shù)。 它基本上能檢測到人的存在,并發(fā)布誰在桶前的消息,所以當(dāng)你在啤酒桶前的時(shí)候,它會(huì)拍下你的照片,然后貼上一些東西,上面寫著“某某人在桶前”,這個(gè)小桶是有專利的。
埃茲拉·卡拉漢:我們剛搬進(jìn)來的時(shí)候,辦公室的門上有一把我們搞不清楚的鎖,但是每天早上9點(diǎn)門就會(huì)自動(dòng)打開。 我必須在9點(diǎn)之前到達(dá)辦公室,確保沒有人走進(jìn)來偷走所有東西,因?yàn)闆]有人會(huì)在中午之前到達(dá)那里。 Facebook的員工基本上都是夜間活動(dòng)的。
凱蒂·杰明德:這些孩子會(huì)進(jìn)來——我說孩子,意思是他們真的是孩子——他們11歲或者12歲就開始工作了。
魯奇·桑哈維:有時(shí)候我會(huì)穿著睡衣去上班,那是完全沒問題的。 這感覺就像是大學(xué)生活的延伸; 我們所有人都在同一時(shí)間經(jīng)歷著相同的生活經(jīng)歷。 工作太棒了。 真是太有趣了。 感覺不像是在工作。我們一直都很開心。
埃茲拉·卡拉漢:你們一起在外面閑逛。你和你的同事喝酒。人們開始在辦公室約會(huì)…
魯奇·桑哈維: 我們在 Facebook 發(fā)現(xiàn)了我們的重要人物。 我們所有人最終都結(jié)婚了。 現(xiàn)在我們正處在有孩子的階段。
凱蒂·杰明德:如果你看看最初幾年在 Facebook 工作的成年人——比如,30歲以上的已婚人士——你做一項(xiàng)調(diào)查,我告訴你,他們中75 %的人可能離婚了。
麥克斯·凱利:那么午餐就要開始了。我們的午餐承辦人精神不平衡,你永遠(yuǎn)不知道TM的食物里會(huì)出現(xiàn)什么鬼東西。有一次魚里有蟲子。太可怕了。通常,我會(huì)工作到下午3點(diǎn)左右,然后在辦公室里轉(zhuǎn)一圈,看看那天晚上到底會(huì)發(fā)生什么。誰要發(fā)布什么?誰準(zhǔn)備好了?有什么傳言?發(fā)生什么事了?
史蒂夫·帕爾曼(Steve Perlman)(硅谷老兵,雅達(dá)利時(shí)代開始):我們和Facebook共用一個(gè)休息室。我們正在建造硬件:面部捕捉技術(shù)。Facebook的人在做一些HTML的事情。他們一大早就來了。他們會(huì)有一頓午餐供應(yīng)。然后他們通常在中午前離開。我想,伙計(jì),這就是生活!我需要這樣的創(chuàng)業(yè)。你知道嗎?我們每個(gè)人對Facebook唯一能想到的就是:人真好,但哪兒也不去。
麥克斯·凱利:大約4點(diǎn)左右,我會(huì)和我的團(tuán)隊(duì)開會(huì),說“我們今晚會(huì)被搞得一團(tuán)糟。”然后我們?nèi)ゾ瓢伞4蠹s5到8個(gè)人一起,分別去大學(xué)大街上不同的酒吧,吃晚飯,什么的。
魯奇·桑哈維:我們會(huì)坐在一起進(jìn)行這些智力對話:“假設(shè),如果這個(gè)網(wǎng)絡(luò)是一個(gè)圖表,你如何衡量兩人之間的關(guān)系?你如何衡量一個(gè)人和一張照片之間的關(guān)系?那是什么樣子?這個(gè)網(wǎng)絡(luò)最終會(huì)是什么樣子?如果我們真的擁有這個(gè)網(wǎng)絡(luò),我們該怎么辦?”
肖恩·帕克:“社交圖譜”是圖論中的一個(gè)數(shù)學(xué)概念,但它是一種試圖向那些有點(diǎn)學(xué)術(shù)和數(shù)學(xué)傾向的人解釋我們正在構(gòu)建的不是一個(gè)產(chǎn)品,而是一個(gè)由節(jié)點(diǎn)組成的網(wǎng)絡(luò),節(jié)點(diǎn)之間有大量信息流動(dòng)。這就是圖論。所以我們正在構(gòu)建一個(gè)社交圖譜。它從來沒有被公開談?wù)撨^。這是一種向有數(shù)學(xué)背景的人表達(dá)我們正在建造的東西的方式。
魯奇·桑哈維:回想起來,我真不敢相信我們當(dāng)時(shí)還有這樣的對話。 這似乎是一件很成熟的事情。 我們會(huì)坐在一起進(jìn)行這些對話,他們并不局限于團(tuán)隊(duì)中的某些成員; 沒有任何明確的結(jié)果。它純粹是知識(shí)性的,對每個(gè)人都開放。
麥克斯·凱利:人們一直都在喝酒,就像要玩一整晚一樣,但是從9點(diǎn)左右開始,氣氛就開始凝固了:“今晚我們要發(fā)布什么?誰準(zhǔn)備好了?誰還沒準(zhǔn)備好?”大約11點(diǎn)左右,我們就知道那天晚上我們要做什么了。
凱蒂·杰明德:沒有一個(gè)過程是令人振奮的。會(huì)有工程師在潛心研究他們熱愛的事情。然后他們會(huì)在半夜把它發(fā)布出來。沒有測試——他們只是把它發(fā)布出去。
埃茲拉·卡拉漢:大多數(shù)網(wǎng)站都有這些非常強(qiáng)大的測試平臺(tái),以便測試變化。我們不是這樣做的。
魯奇·桑哈維:只要按下一個(gè)按鈕,你就可以把代碼推上去,因?yàn)槲覀冋嬲嘈拧翱焖僖苿?dòng),打破常規(guī)”的理念。所以你不應(yīng)該一周等一次,也不應(yīng)該一天等一次。如果你的代碼已經(jīng)準(zhǔn)備好了,你應(yīng)該能夠?qū)⑺鼘?shí)時(shí)推出給用戶。這顯然是一場噩夢。
凱蒂·杰明德:我們的服務(wù)器能經(jīng)得起考驗(yàn)嗎?或者安全性:測試安全漏洞的功能如何?真的就只是把它發(fā)布到外面,看看會(huì)發(fā)生什么。
杰夫·羅斯柴爾德:這就是黑客的心態(tài):你只要完成它。當(dāng)你有10個(gè)人的時(shí)候,效果很好。到了20個(gè)、30個(gè)、40個(gè)人的時(shí)候,我花了很多時(shí)間來保持網(wǎng)站的正常運(yùn)行。所以我們必須培養(yǎng)某種程度的紀(jì)律。
魯奇·桑哈維:那么我們只能在半夜推出代碼,因?yàn)槿绻覀兣獕牧藮|西,不會(huì)影響那么多人。但這很可怕,因?yàn)槲覀兠刻焱砩隙家疽沟搅璩?、4點(diǎn)左右,因?yàn)檫@種推搡行為只會(huì)讓每個(gè)寫了任何代碼的人都在場,以防發(fā)生任何事情。
麥克斯·凱利:凌晨1點(diǎn)左右,我們就會(huì)知道要么我們完蛋了,要么我們很好。如果我們做得好,每個(gè)人都會(huì)像“whoopee”一樣,也許能睡一會(huì)兒。如果我們被搞砸了,然后我們會(huì)說,“好吧,現(xiàn)在我們得試著把這個(gè)東西回滾回來或者修復(fù)它。”
凱蒂·杰明德:凌晨2點(diǎn):那就是狗屎發(fā)生的時(shí)候。
魯奇·桑哈維:然后再來一次,這種情況會(huì)一直持續(xù)到凌晨3、4或5點(diǎn)。
麥克斯·凱利:如果凌晨4點(diǎn)左右,我們無法修復(fù)它,我會(huì)說,“我們將嘗試恢復(fù)它。”這意味著基本上我的團(tuán)隊(duì)會(huì)一直工作到早上6點(diǎn),在4到6點(diǎn)之間睡覺,然后每天重復(fù),持續(xù)了大概9個(gè)月。太瘋狂了。
杰夫·羅斯柴爾德:一周工作七天。我一直都在。睡覺前我會(huì)喝一大杯水,保證兩個(gè)小時(shí)后醒來,這樣我就可以去檢查所有的東西,確保我們沒有把它搞砸。這是一整天,一整夜。
凱蒂·杰明德:對于一個(gè)想要和丈夫這樣的成年人一起生活的人來說,這是一個(gè)很大的挑戰(zhàn)。肯定有一種感覺,因?yàn)槟隳昙o(jì)大了,結(jié)婚了,有一種工作之外的生活,而這些都是你沒法保證的。
馬克·扎克伯格:為什么大多數(shù)象棋大師都在30歲以下?年輕人的生活比較簡單。我們可能沒有汽車。我們可能沒有家人……我只有一張床墊。
凱特·杰明德:想象一下,30歲以上的人聽到你的老板這么說會(huì)是什么感受。
馬克·扎克伯格:年輕人只是更聰明。
魯奇·桑哈維:那時(shí)候我們還很年輕。 我們確實(shí)有大量的能量,我們可以做到這一點(diǎn),但我們不一定是最有效率的團(tuán)隊(duì)。 對于高層領(lǐng)導(dǎo)來說,這絕對是令人沮喪的,因?yàn)楹芏嗾勗挾及l(fā)生在他們不在的時(shí)候,第二天早上他們就會(huì)處在變化中。 但是我們做的時(shí)候還是很有趣的。
埃茲拉·卡拉漢:對于最初的幾百名員工來說,幾乎所有人都已經(jīng)是公司工作人員的朋友,包括工程師和用戶支持人員。這里有很多剛畢業(yè)的學(xué)生。當(dāng)我們搬進(jìn)辦公室的時(shí)候,宿舍文化開始真正突出,也開始有一點(diǎn)點(diǎn)破裂。它有宿舍的感覺,但并不是完全由大學(xué)生主導(dǎo)。大人開始進(jìn)來了。
杰夫·羅斯柴爾德:我是2005年5月加入的。辦公室外的人行道上是比薩店的菜單。那是一幅漫畫,畫的是一位廚師,下面有一張需要招募人員的工作清單。
肖恩·帕克:當(dāng)時(shí)谷歌非常有吸引力。所有偉大的工程師都要去谷歌。
凱特·羅斯(Kate Losse)(早期客戶服務(wù)代表):我不認(rèn)為我能夠在谷歌工作。 對我來說,F(xiàn)acebook 看起來比谷歌酷多了,并不是因?yàn)?Facebook 是最酷的。 只是那時(shí)的谷歌似乎已經(jīng)顯得乏味無趣了,而像 在Facebook工作的人,其實(shí)并不想變成書呆子。 Facebook是一個(gè)社交網(wǎng)絡(luò),所以它必須有一些社交成分,就像正常的美國社交活動(dòng)——比如啤酒乒乓。
凱特·杰明德:在街對面的辦公室里有一棟房子,五六個(gè)工程師住在那里,那是一個(gè)正在舉行的啤酒乒乓派對。這就像一個(gè)男孩俱樂部——盡管不僅僅是男孩。
特里·維諾格拉德(Terry Winograd)(著名的斯坦福大學(xué)計(jì)算機(jī)科學(xué)教授):我認(rèn)為Facebook更像是一種本科生文化,而谷歌更像是研究生文化。
杰夫·羅斯柴爾德:在我走進(jìn)Facebook的大門之前,我以為這些家伙已經(jīng)創(chuàng)建了一個(gè)約會(huì)網(wǎng)站。大概過了一兩個(gè)星期,我才真正明白是怎么回事。馬克,他曾經(jīng)告訴我們,我們不是一個(gè)社交網(wǎng)絡(luò)。他會(huì)堅(jiān)持說:“這不是一個(gè)社交網(wǎng)絡(luò)。我們是對你真正認(rèn)識(shí)的人有用的社交工具。”
MySpace是在有相似興趣的人中間建立一個(gè)在線社區(qū)。我們看起來可能是一樣的,因?yàn)樵谀撤N程度上它的形狀是一樣的,但是它為個(gè)人所做的是解決一個(gè)不同的問題。我們正在努力提高朋友之間的交流效率。
麥克斯·凱利:馬克和我坐在一起,向我描述了他在Facebook上看到的一切。他說:“這關(guān)系到人與人之間的聯(lián)系,建立一個(gè)系統(tǒng),在這個(gè)系統(tǒng)中,凡是與你的生活有任何價(jià)值的人,只要你希望它被保存下來,就會(huì)被保存下來。不管你在哪里,和誰在一起,也不管你的生活如何改變:因?yàn)槟憧偸呛蛯δ銇碚f最重要的人聯(lián)系在一起,你總是能夠和他們分享。”
我聽到了,我想?yún)⑴c其中。我想讓這一切發(fā)生。早在90年代,我們所有人都對互聯(lián)網(wǎng)抱有烏托邦的想法。這幾乎讓人回想起美麗的互聯(lián)網(wǎng),在那里,每個(gè)人都可以連接在一起,每個(gè)人都可以分享,這樣做沒有任何阻礙。Facebook在我看來也是一樣。馬克還太年輕,不知道當(dāng)時(shí)的情況,但我認(rèn)為他從本質(zhì)上理解了80年代和90年代互聯(lián)網(wǎng)應(yīng)該是什么樣子。而在這里,我又聽到了同樣的故事,可以想象,我有能力幫助它成功。這很有吸引力。
亞倫·斯蒂格:所以在2005年夏天,馬克讓我們大家坐下來,他說:“今年夏天我們要做五件事。”他說,“我們正在重新設(shè)計(jì)網(wǎng)站。我們正在做一個(gè)叫做News Feed的事情,它將告訴你,你的朋友在網(wǎng)站上做的一切。我們將推出照片功能,我們將重做 Parties 并將其轉(zhuǎn)化為 Events,我們要做一個(gè)本地企業(yè)產(chǎn)品。”我們完成了其中一項(xiàng)工作,重新設(shè)計(jì)了網(wǎng)站。照片是我的下一個(gè)項(xiàng)目。
埃茲拉·卡拉漢:Facebook當(dāng)時(shí)的產(chǎn)品非常簡單:個(gè)人資料。沒有News Feed,消息傳遞系統(tǒng)非常薄弱。他們有一個(gè)非常簡單的活動(dòng)產(chǎn)品,你可以用它來組織聚會(huì)。幾乎沒有其他功能可言。網(wǎng)站上沒有照片,只有你的個(gè)人資料照片。沒有任何東西能告訴你網(wǎng)站上的任何東西是什么時(shí)候改變的。你會(huì)發(fā)現(xiàn)有人改變了他們的個(gè)人資料圖片,才會(huì)去注意他們的個(gè)人資料,并注意到,哦,照片變了。
亞倫·斯蒂格:有一些人每小時(shí)換一次個(gè)人資料照片,只是為了分享他們自己的照片。
斯科特·馬萊特:當(dāng)時(shí)照片是最受歡迎的功能。于是,亞倫和我走進(jìn)一個(gè)房間,在白板上為一些網(wǎng)頁添加一些線框圖,決定需要存儲(chǔ)什么數(shù)據(jù)。在一個(gè)月內(nèi),我們做出了一個(gè)在內(nèi)部基本上可以完全運(yùn)作的原型。很簡單:你發(fā)布一張照片,它會(huì)進(jìn)入一個(gè)相冊,然后你會(huì)有一套相冊,而且你可以在照片中標(biāo)記人物。
杰夫·羅斯柴爾德:亞倫有做標(biāo)記的洞察力,這是一個(gè)非常有價(jià)值的洞察力。這真的改變了游戲規(guī)則。
亞倫·斯蒂格:我們認(rèn)為,最重要的是要說照片中的人是誰。我們不確定這是否真的會(huì)那么成功;我們只是感覺這很好。
Facebook Photos于2005年10月上線。大約有500萬用戶,幾乎都是大學(xué)生。
斯科特·馬萊特:我們首先在哈佛和斯坦福推出,因?yàn)槲覀兊呐笥讯荚谀抢铩?/p>
扎克伯格從小在紐約州的多布斯渡口長大,他的父母愛德華和凱倫以及他的姐妹蘭迪,左,阿瑞爾一起撫養(yǎng)長大。圖片來源:SHERRY TESLER/NEW YORK TIMES/REDUX
亞倫·斯蒂格:我們制作了這個(gè)程序,它會(huì)填滿一個(gè)電視屏幕,向我們展示上傳到服務(wù)器上的所有東西,然后我們打開它,等待照片的出現(xiàn)。第一批進(jìn)來的照片是Windows壁紙:有人剛剛從Windows目錄上傳了他們所有的壁紙文件,這讓人很失望,也許人們不明白?也許這樣不行?
但接下來的照片是一個(gè)男人和他的朋友出去玩,然后接下來的照片是一群不同的女孩:三個(gè)女孩在一起,這四個(gè)女孩在一起,其中兩個(gè)在一起,不過是她們在聚會(huì)上玩的照片,然后就沒有停下來。
麥克斯·凱利:你參加了每一場婚禮,參加了每一個(gè)成年禮,看到了這些令人敬畏的東西,然后還有一個(gè)XX。所以,這是一個(gè)同時(shí)具有令人敬畏和糟糕的感覺的時(shí)刻。
亞倫·斯蒂格:在第一天,有人上傳了700張照片,并在上面做了標(biāo)記,然后就從那里起飛了。
杰夫·羅斯柴爾德:三個(gè)月內(nèi),我們傳送的照片比互聯(lián)網(wǎng)上任何其他網(wǎng)站都多。現(xiàn)在你不得不問自己:為什么?答案就是標(biāo)記。沒有人能收到一封電子郵件,上面寫著“有人把你的照片上傳到互聯(lián)網(wǎng)上”——而不去看一看。這是人類的本性。
埃茲拉·卡拉漢:有史以來唯一最大的增長機(jī)制是照片標(biāo)記。它決定了所有其他的產(chǎn)品決策。這是人們使用Facebook的方式第一次發(fā)生了真正的根本性變化,F(xiàn)acebook的心態(tài)發(fā)生了變化,News Feed的理念開始萌芽。現(xiàn)在,有理由看到這種變化會(huì)如何擴(kuò)展到大學(xué)之外。
杰夫·羅斯柴爾德:News Feed項(xiàng)目于2005年秋季啟動(dòng),2006年秋季交付。
達(dá)斯汀·莫斯科維茨:News Feed 是病毒式傳播概念的化身。
埃茲拉·卡拉漢:News Feed就是今天 Facebook 的基礎(chǔ)。
肖恩·帕克:最初,它被稱為“What’s New”,它只是網(wǎng)絡(luò)中正在發(fā)生的所有事情的反饋——實(shí)際上只是一系列正在發(fā)生的狀態(tài)更新和個(gè)人資料的更新。
凱蒂·杰明德:這是一個(gè)集合,是所有這些故事的集合,其中包含一些邏輯,因?yàn)槲覀儫o法向你展示正在發(fā)生的一切。有兩種流:你正在做的事情和你的網(wǎng)絡(luò)其他部分正在做的事情。
埃茲拉·卡拉漢:所以News Feed是第一次,現(xiàn)在你的主頁不再是靜態(tài)的、無聊的和無用的,而是不斷更新的“報(bào)紙”,可以說,是Facebook上發(fā)生的我們認(rèn)為你會(huì)關(guān)心的事情。
魯奇·桑哈維: 這是一個(gè)很有意思的想法,因?yàn)橥ǔ.?dāng)你想到報(bào)紙時(shí),他們會(huì)有一些編輯化的內(nèi)容,他們決定他們想說什么,他們想要印刷什么,他們在前一個(gè)晚上這樣做,然后他們把這些文章發(fā)給成千上萬的人。 但就 Facebook 而言,我們正在建立一千萬種不同的報(bào)紙,因?yàn)槊總€(gè)人都有一個(gè)個(gè)性化的版本。
埃茲拉·卡拉漢:這確實(shí)是第一次具有里程碑意義的產(chǎn)品工程壯舉。它必須處理很大的數(shù)據(jù)量:所有這些變化以及如何在個(gè)人層面上傳播這些變化。
魯奇·桑哈維:我們一年半來一直在不停地研究這個(gè)問題。
埃茲拉·卡拉漢:……然后是所有這些東西的智力方面:我們?nèi)绾伟涯阕铌P(guān)心的東西傳遞出來?從工程角度來看,這些都是非常棘手的問題。
魯奇·桑哈維:在沒有意識(shí)到這一點(diǎn),我們最終在軟件中建立了一個(gè)最大的分布式系統(tǒng)。 這是相當(dāng)前衛(wèi)的。
埃茲拉·卡拉漢:我們內(nèi)部有它,我們使用了好幾個(gè)星期——這真的很不尋常。
凱蒂·杰明德:我記得當(dāng)時(shí)我在想想,“好吧,你們這些家伙,我們得做一些用戶研究。”最后我說服扎克,我們應(yīng)該把用戶帶到實(shí)驗(yàn)室,坐在玻璃后面,看著我們的用戶使用產(chǎn)品。我花了很大的力氣才讓達(dá)斯汀、扎克和其他人去觀看。他們認(rèn)為這是浪費(fèi)時(shí)間。他們說:“不,我們的用戶很笨。”
埃茲拉·卡拉漢:這是我們第一次真正帶外界人士來為我們測試東西,他們的反應(yīng),他們的初步反應(yīng)是清楚的。人們就像,“我靠,我不應(yīng)該看到這些,好像這感覺不對,”因?yàn)槟泷R上看到這個(gè)人改變了他們的個(gè)人形象,這個(gè)人做了這個(gè),這個(gè)人做了那個(gè),你的第一反應(yīng)是,哦,我的上帝!每個(gè)人都可以看到我!每個(gè)人都知道我在Facebook上做的一切。
麥克斯·凱利:但是News Feed對我們所有人來說都是非常有意義的,在內(nèi)部,我們都很喜歡它。
埃茲拉·卡拉漢:所以在內(nèi)部我們有這樣一個(gè)想法,認(rèn)為這是不正確的:這是一個(gè)太不和諧的變化,它需要慢慢推廣,我們需要讓人們對此保持熱情——但馬克卻很堅(jiān)定。“我們就這樣做。我們就要發(fā)布了。就像撕掉創(chuàng)可貼一樣。”
魯奇·桑哈維: 我們在夜深人靜的時(shí)候推出了這個(gè)產(chǎn)品,我們真的很興奮,我們在慶祝。 我寫了這樣一篇博客文章:“Facebook換了一個(gè)新面貌。”
凱蒂·杰明德:我們寫了一封小信,在信的底部放了一個(gè)按鈕。按鈕說:“太棒了!”不是說,“好吧。”而是“太棒了!”那太無禮了。我希望我有一個(gè)截圖。哦天啊!就這樣。你登陸Facebook,你就有了這個(gè)功能。我們沒有給你選擇,也沒有很好的解釋,這讓人們感到害怕。
杰夫·羅斯柴爾德:人們驚慌失措,因?yàn)樗坪醣┞读艘郧皬奈匆娺^的信息。事實(shí)上并非如此。News Feed中顯示的所有內(nèi)容都是人們放在網(wǎng)站上的東西,如果他們?nèi)ピL問了那個(gè)個(gè)人資料,每個(gè)人都會(huì)看到。
魯奇·桑哈維: 用戶們很反感。 他們威脅要抵制這種產(chǎn)品。 他們覺得自己被侵犯了,他們的隱私受到了侵犯。 有學(xué)生在組織請?jiān)笗?人們在辦公室外排隊(duì)等候。 我們雇了一個(gè)保安。
凱蒂·杰明德:外面有攝影師。 有人抗議說:“把舊的 Facebook 帶回來!” 每個(gè)人都討厭它。
杰夫·羅斯柴爾德:反應(yīng)非常激烈。 有人在辦公室里游行。 有人在Facebook 上組織了抗議News Feed的群組,不到兩天,就有一百萬人加入。
魯奇·桑哈維:還有一個(gè)關(guān)于“魯奇是魔鬼”的群組,因?yàn)槲覍懥四瞧┛臀恼隆?/p>
麥克斯·凱利: 用戶群體每一步都在與之爭斗,他們會(huì)對我們施加壓力,會(huì)對客戶服務(wù)施壓,然后說:“這真是一團(tuán)糟! 這太可怕了!”
埃茲拉·卡拉漢:我們收到親友的電子郵件。他們說,“你做了什么?太可怕了!換回來。”
凱蒂·杰明德:我們坐在辦公室里,抗議活動(dòng)在外面進(jìn)行,“我們要把它回滾回去嗎?我們要把它回滾回去嗎!?”
魯奇·桑哈維:在通常情況下,如果大約10 %的用戶開始抵制該產(chǎn)品,你會(huì)關(guān)閉它。但是我們看到了一個(gè)非常不尋常的模式。
麥克斯·凱利:即使是那些告訴我們這很可怕的人,我們也會(huì)看著他們的用戶流,然后說:你TM在不斷地使用它!你在說什么?
魯奇·桑哈維:盡管有這些反抗,這些請?jiān)负腿藗冊谵k公室外排起了長隊(duì),但他們還是在使用產(chǎn)品。他們實(shí)際上在使用它,而且使用它的次數(shù)是News Feed前的兩倍。
埃茲拉·卡拉漢:這幾天對公司里的每個(gè)人來說都是一場情緒上的災(zāi)難。尤其是那些揮舞著手臂說:“不要這樣!別這樣做的人!”因?yàn)樗麄冇X得,“這就是我們告訴你會(huì)發(fā)生的事!”
魯奇·桑哈維:馬克在東海岸的第一次新聞發(fā)布會(huì)上,我們其他人都在帕洛阿爾托辦公室處理這個(gè)問題,看著這些日志,試圖傳達(dá)“這真的有用!”在我們選擇關(guān)閉它之前,先嘗試做一些事情。
凱蒂·杰明德:我們必須馬上推出一些隱私功能來平息風(fēng)暴。
魯奇·桑哈維:我們要求每個(gè)人給我們24小時(shí)。
凱蒂·杰明德:我們用這些小滑條建立了這個(gè)簡潔的隱私“音頻混音器”,你可以在那里打開和關(guān)閉。它設(shè)計(jì)得很漂亮——看起來很漂亮——但它無關(guān)緊要。
杰夫·羅斯柴爾德:我想沒有人用過它。
埃茲拉·卡拉漢:但它被添加上去了,最終,即時(shí)反應(yīng)消退了,人們意識(shí)到News Feed正是他們想要的,這個(gè)功能完全正確,這使得Facebook變得更加有用了一千倍。
凱蒂·杰明德:就像照片一樣,News Feed只是——轟!——這是產(chǎn)品的一個(gè)重大變化。
杰夫·羅斯柴爾德:使用量在News Feed 的發(fā)布上飛速上升。 大約在同一時(shí)間,我們也對那些沒有教育郵箱的人開放了網(wǎng)站。
埃茲拉·卡拉漢:一旦Facebook向公眾開放,它就變得越來越明顯,F(xiàn)acebook正在成為世界上所有人的目錄。
杰夫·羅斯柴爾德:這兩件事加在一起——就是Facebook成為一個(gè)被大規(guī)模使用的產(chǎn)品的轉(zhuǎn)折點(diǎn)。在此之前,我們只是被高中生和大學(xué)生使用的產(chǎn)品。
馬克·扎克伯格:統(tǒng)治!
魯奇·桑哈維:“統(tǒng)治”在當(dāng)時(shí)是 Facebook 的一大口號(hào)。
麥克斯·凱利:我記得公司開會(huì)時(shí),我們高喊“統(tǒng)治”。
埃茲拉·卡拉漢:我們一直都有公司聚會(huì),2005年的一段時(shí)間里,馬克在公司聚會(huì)上的所有敬酒都以“統(tǒng)治”結(jié)束。
馬克·扎克伯格:統(tǒng)治!!
麥克斯·凱利:我們撕毀雅虎提議的那次會(huì)議,我記得特別清楚。
馬克·平卡斯:2006年,雅虎向 Facebook 提供了12億美元的收購提案,我認(rèn)為是這樣的,當(dāng)時(shí)這似乎是一個(gè)驚人的價(jià)格,很難想象他們不會(huì)接受。 每個(gè)人都看到了 Napster、Friendster以及MySpace 結(jié)局,所以,一個(gè)沒有收入的公司面臨著一個(gè)可靠的公司提供了12億美元的收入,你能夠?qū)Υ苏f不嗎? 你必須非常尊重那些拒絕這些提議的創(chuàng)始人。
達(dá)斯汀·莫斯科維茨:我確信如果雅虎收購我們,產(chǎn)品將遭受重大損失。 肖恩告訴我,90% 的合并都以失敗告終。
馬克 ·平卡斯:對于扎克來說,非常幸運(yùn),雅虎的股票下跌,他們說不會(huì)改變報(bào)價(jià)。 但他們說這個(gè)報(bào)價(jià)是固定數(shù)量的股票,所以這個(gè)出價(jià)降到了8億美元,我認(rèn)為,扎克在情感上可能不想這么做,這讓他清醒了過來。 如果雅虎說:“沒問題,我們會(huì)用現(xiàn)金或股票支持這一報(bào)價(jià),使其達(dá)到12億美元”,那么對于扎克來說,這可能不會(huì)太難,也許 Facebook 會(huì)成為雅虎的一個(gè)小分支。
麥克斯·凱利:我們真的撕毀了雅虎的協(xié)議,把它當(dāng)作一個(gè)公司來踐踏! 我們就像這樣,“去他們的,我們要收購他們!”那是惡意的胡說八道。
馬克·扎克伯格: 統(tǒng)治! ! !
凱特·羅斯:他說話的方式有點(diǎn)諷刺。 這不是一個(gè)字面意義上的、可怕的“統(tǒng)治” ,這很有趣。 只有當(dāng)你想到更大規(guī)模的事情時(shí),你才會(huì)這樣想,嗯,人們是否意識(shí)到,他們之間的互動(dòng)是由一群對世界如何運(yùn)作和什么是好的想法的人所構(gòu)建的嗎?
埃茲拉·卡拉漢:互聯(lián)網(wǎng)的發(fā)展方向,有多少是受到了19歲、20歲、21歲富有的白人男孩的視角影響?這是一個(gè)現(xiàn)實(shí)的問題,社會(huì)學(xué)家需要深入地研究。
凱特·羅斯:我認(rèn)為大多數(shù)人并沒有真正考慮到現(xiàn)在幾個(gè)人的價(jià)值觀對每個(gè)人的影響。
史蒂文·約翰遜:關(guān)于這個(gè)問題,我認(rèn)為存在一些合理的爭論。 Facebook確實(shí)造成了一些回音室問題和政治兩極化問題,但是我花了很多時(shí)間爭論,互聯(lián)網(wǎng)的責(zé)任要比人們想象的要少。
馬克·平卡斯:也許我太接近這一切了,但我認(rèn)為當(dāng)你把視角拉回來的時(shí)候,我們中沒有一個(gè)人真的那么重要。 我認(rèn)為互聯(lián)網(wǎng)正在走一條通向互聯(lián)網(wǎng)想要去的道路。 我們都在試圖弄清楚消費(fèi)者想要什么,如果人們想要的是這個(gè)巨大的回聲室和這個(gè)虛榮的、充滿點(diǎn)贊的世界,有人會(huì)把它給他們,他們會(huì)成為贏家,而那些不提供這些的人,不會(huì)成為贏家。
史蒂夫·喬布斯:除了 Facebook 之外,我沒有看到其他公司占據(jù)了統(tǒng)治地位。
馬克·平卡斯:我不認(rèn)為一群大學(xué)男生塑造了互聯(lián)網(wǎng)。 我只是覺得他們先到達(dá)了那里。
馬克·扎克伯格: 統(tǒng)治!!!!
埃茲拉·卡拉漢:直到我們有了一個(gè)全職的顧問,他說:“馬克,看在上帝的份上: 你不能再用統(tǒng)治這個(gè)詞了,”他停了下來。
肖恩·帕克:一旦你占據(jù)統(tǒng)治地位,那么它就會(huì)突然變成一個(gè)反競爭的術(shù)語。
史蒂文·約翰遜: 互聯(lián)網(wǎng)用了30年才有了10億用戶。 Facebook 花了10年時(shí)間。 Facebook 的關(guān)鍵是它不是一個(gè)服務(wù)或者應(yīng)用程序,它是一個(gè)基本的平臺(tái),和互聯(lián)網(wǎng)本身的規(guī)模一樣。
史蒂夫·喬布斯: 我很欣賞馬克 · 扎克伯格。 我對他了解不多,但我欣賞他沒有出賣公司——因?yàn)樗胍闪⒁患夜尽?我很欣賞這一點(diǎn)。
書面語言和口頭語言有很大的不同。 因此,我冒昧地糾正了口誤,將意識(shí)流的想法分成了句子,將句子排序成段落,消除了冗余的部分。 這中間的關(guān)鍵是不要把原來的口頭語言變成書面語言,而是要把實(shí)際上的內(nèi)容逐字記錄下來。
我小心翼翼地保留了所有為了這篇文章而采訪的每個(gè)人的語言節(jié)奏和語言風(fēng)格,所以,你讀到的內(nèi)容在你的腦海里是真實(shí)的:真實(shí)的生活,真實(shí)的文字記錄,真實(shí)的演講者的意圖。
這篇文章中發(fā)現(xiàn)的絕大多數(shù)詞語都來自于我的采訪。 在有些地方地方,我嘗試著去挖掘之前未發(fā)表的采訪,并引用他們的話。 在一些地方,我引用了之前發(fā)表過的采訪:
2005年,馬克·扎克伯格在哈佛大學(xué)計(jì)算機(jī)科學(xué)入門課上發(fā)表的演講,以及同年2月他接受哈佛克里姆森報(bào)的采訪; 達(dá)斯汀·莫斯科維茨2008年12月青年運(yùn)動(dòng)聯(lián)盟峰會(huì)的主題演講;大衛(wèi)·柯克帕特里克(David Kirkpatrick)的著作《Facebook效應(yīng)》(The Facebook Effect);大衛(wèi) · 崔在2016年3月的霍華·史坦秀上發(fā)表的評論; 史蒂夫 · 喬布斯對他的傳記作者沃爾特 · 艾薩克森做出的評論,2011年喬布斯去世后不久,這個(gè)采訪就在《60 Minutes》欄目播出。
原文鏈接:https://www.wired.com/story/sex-beer-and-coding-inside-facebooks-wild-early-days/
編譯組出品。編輯:郝鵬程
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。