摘要:第二個問題非基礎類型則不好處理,其實像這種比較的方法,往往不是用于處理普遍情況的,往往是在特殊場景發揮奇效的。沒有最好的方案,只有最合適的方案。這樣才能使得正數和負數的表示統一起來,具體可以參閱補碼的歷史,這里不過多展開了。
原文: https://github.com/HCThink/h-...
github 首頁(star+watch,一手動態直達): https://github.com/HCThink/h-blog
掘金 link , 掘金 專欄
segmentfault 主頁
原創禁止私自轉載
廣告部門長期招收大量研發崗位【前端,后端,算法】,歡迎各位大神投遞,踴躍嘗試。
坐標: 頭條,大量招人,難度有降低,大多能拿到很不錯的漲幅,未上市,offer 給力!歡迎騷擾郵箱!
戳我: 戳我: hooper.echo@gmail.com
How to do 快速獲取毫秒數const now = +new Date();平鋪多維數組
// 僅僅適用于二維數組。不過,通過遞歸,我們可以平鋪任意維度的嵌套數組。 const arr = [11, [22, 33], [44, 55], 66]; const flatArr = [].concat(...arr); //=> [11, 22, 33, 44, 55, 66] // flat 法 [1,2, [1, [2, [3]]]].flat() // (4)?[1, 2, 1, Array(2)] // 提供另一種場景化很強的思路。 // 其實有更簡單的. 任意維度數組都可以搞定, arr.join().split(",") // 但是存在風險: 類型會變。我們可以提供 轉換回調。 // 平鋪數字數組 + 轉換回調 [1,2, [1, [2, 1+ 2 +1, Number(true)]]].join().split(",").map((index) => Number(index)) // (6)?[1, 2, 1, 2, 4, 1] // 對于通式 Arr.join().split(",").map(fn)
這個方法可能限制很多,比如數組元素類型不一致, 比如非基礎類型等
第一個問題: 我們不妨想想,一個數組中既有 number,又有 string 是合理么?實際上這種數組在邏輯,潛在風險和處理上存在非常多的問題。大多數情況下是一個不好的設計。
但是如果在 Typescript 中往往有比較好的場景。
第二個問題:非基礎類型則不好處理, 其實像這種比較 Hacker 的方法, 往往不是用于處理普遍情況的,往往是在特殊場景發揮奇效的。沒有最好的方案,只有最合適的方案。
僅僅是另一種思路。
快速取整// api Math.floor(10.8222) // 雙位移 console.log(~~47.11) // -> 47 console.log(~~-12.88) // -> -12 console.log(~~1.9999) // -> 1 console.log(~~3) // -> 3 //失敗的情況 console.log(~~[]) // -> 0 console.log(~~NaN) // -> 0 console.log(~~null) // -> 0 //大于32位整數則失敗 console.log(~~(2147483647 + 1) === (2147483647 + 1)) // -> 0格式化輸出
const obj = { foo: { bar: [11, 22, 33, 44], baz: { bing: true, boom: "Hello" } } }; // The third parameter is the number of spaces used to // beautify the JSON output. JSON.stringify(obj, null, 4); // "{ // "foo": { // "bar": [ // 11, // 22, // 33, // 44 // ], // "baz": { // "bing": true, // "boom": "Hello" // } // } // }"大致測試一個JavaScript代碼塊性能的技巧
console.time("Array initialize"); const arr = new Array(100); const len = arr.length; for (let i = 0; i < len; i++) { arr[i] = new Object(); }; console.timeEnd("Array initialize");您可以創建一個 100% 純對象,它不會從 Object 繼承任何屬性或方法(例如,constructor,toString() 等)
const pureObject = Object.create(null); console.log(pureObject); //=> {} console.log(pureObject.constructor); //=> undefined console.log(pureObject.toString); //=> undefined console.log(pureObject.hasOwnProperty); //=> undefined普通必傳參數校驗
const require = function( message ){ throw new Error( message ); } const getSum = (a = _err("a is not defined"), b = _err("b is not defined")) => a + b getSum( 10 ) // throws Error, b is not defined getSum( undefined, 10 ) // throws Error, a is not defined裝飾器用作必傳參數校驗
如下為主要代碼, 完整代碼需要 Typescript 環境。
裝飾器校驗必傳參數
裝飾器
Typescript
@validate greet(p1, p2, p3, @required name: string, p5) { // p1-5 僅僅用于占位, 用來測試 required 的第四個參數。 return "Hello " + name + ", " + this.greeting; } // output // throw (constructors.name + "." + String(method_1) + "[u5B9Eu9645u4E0Au662FuFF1A" + constructors.name + ".prototype." + String(method_1) + "]u7B2C " +(index + 1) + " u4E2Au53C2u6570u662Fu5FC5u4F20u53C2u6570uFF0Cu8BF7u63D0u4F9Bu3002"); ^ // Greeter.greet[ Greeter.prototype.greet ] 第 4 個參數是必傳參數,請提供。解構 arguments 轉數組
+function fn() { console.log([...arguments]); // (4)?[1, 2, 3, 4] console.log(Array.prototype.slice.call(arguments)); }(1,2,3,4)庫的非 new 調用
通常庫遇到的問題往往是,用戶不按照你想要的方式調用,特別是 new 的問題,很多代碼中會存在一謝邏輯去校驗用戶是否是 new 調用。諸如:
傳統式
var _ = function(obj) { if (obj instanceof _) return obj; if (!(this instanceof _)) return new _(obj); this._wrapped = obj; };
class 式
class Fn{} // TypeError: Class constructor Fn cannot be invoked without "new" Fn();
船新 api: new.target
function Foo() { if (!new.target) throw "Foo() must be called with new"; console.log("Foo instantiated with new"); } new Foo(); // logs "Foo instantiated with new" Foo(); // throws "Foo() must be called with new" // new.target 在構造中 class A { constructor() { console.log(new.target.name); } } new A(); // A小數取整 && 強轉 boolean
~~2.8 // 2 !! 0 // false
鋪墊知識 [建議細看]
首先要明確的一點是,計算機內部在做數學運算時(也就是計算機的0和1的運算),都是以補碼為標準的,說白了 計算機中就一種碼那就是補碼,而現實社會中的編碼規則,例如原碼、反碼都是我們自定義的,為了和計算機中的補碼形成轉換關系。所以說在我們手工計算這類由計算機計算的01運算,要站在計算機的角度。因此首先就要將我們的原碼反碼什么的全都先轉為補碼,再來計算^_^。這樣才能使得正數和負數的表示統一起來,具體可以參閱【補碼的歷史】,這里不過多展開了。
接著來看那個問題,從問題入手,解決了實際問題,概念也就自然了然于心了。^_^
5 的補碼是它本身(ps:正數的原、反、補碼都是它本身;負數的原碼最高為為1開頭,反碼是最高符號位不變,其余位在原碼的基礎上取反,補碼是在反碼的基礎上+1即可得到)
5的補碼:00000101
~5 (也就是5按位取反運算,下面涉及的是補碼運算):
00000101按位取反,這里需要將原始01串完全反轉過來,不存在最高符號位的概念,取反結果為: 11111010
注意這里的結果是用補碼表示的,畢竟這還是機器表示形式,轉化為自然語言的編碼,把結果(補碼)轉化為原碼就是:
補碼-1轉為反碼: 11111010 - 1 = 11111001
反碼再取反轉為原碼:11111001 = 10000110
原碼轉為十進制,答案就是-6
看看 [ ~ -6 = 5 ] 的計算過程, 假設有符號六位
~(100110 > 111001 > 111010)(-6 的原碼轉補碼才能參與運算)
000101 (運算結果是補碼)
000101 > 000101 -> 5(轉換為原碼[正數原碼是自身])
按位取反的快捷運算公式 -(x+1). 【~~x -> -( -(x + 1) + 1) -> -( -x - 1 + 1) -> --x -> x】
ps: 以下內容屬于廣告,選看
一二線大廠,可內推,急招人(50% 漲幅輕輕松松, 面試較難),研發最好,有興趣: hooper.echo@gmail.com 郵件私聊。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99998.html
摘要:我故意保持示例簡單,以說明公共接口是如何自我文檔化的。這種類型的函數產生更多的自我文檔化代碼的另一個原因是你可以信任他們的輸出。 在代碼里面找到一個完全沒有地方或沒有用的注釋是不是很有趣? 這是一個很容易犯的錯誤:你改變了一些代碼,但忘記刪除或更新注釋。壞的注釋不會破壞你的代碼,但你可以想象一下調試時會發生什么。你讀了注釋,但代碼卻在做另一件事,也許最終你浪費了一些時間來弄懂它,甚至最...
摘要:讓你的代碼更簡短,更整潔,更易讀的小技巧寫在文章前面這篇文章翻譯自文章就代碼整潔方面對進行了總結。如果你正在使用的代碼使用的語法,這個是你需要注意的事情。更多還提供了我們很多很多其他的方式來使我們的代碼更簡潔,更易讀,以及更穩定。 讓你的代碼更簡短,更整潔,更易讀的ES6小技巧 寫在文章前面 這篇文章翻譯自ES6 tips and tricks to make your code cl...
摘要:但這并不意味著依賴版本是鎖死的。黃色表示不符合指定的語義化版本范圍,比如大版本升級,升級可能會遇到兼容性問題。文件可以列出不想打包的文件,避免把一些無關的文件發布到上。 作者: LeanCloud weakish 分享一些 npm 包管理工具的實用小竅門,希望能夠略微提高下前端、Node.js 開發者的生活質量。 絕大多數前端和 Node.js 開發者每天的日常工作都離不開 npm,不...
閱讀 2169·2021-09-04 16:40
閱讀 1466·2021-08-13 15:07
閱讀 3609·2019-08-30 15:53
閱讀 3200·2019-08-30 13:11
閱讀 1077·2019-08-29 17:22
閱讀 1819·2019-08-29 12:47
閱讀 1479·2019-08-29 11:27
閱讀 2233·2019-08-26 18:42