成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 中經(jīng)常使用的小技巧,助你更簡短的實(shí)現(xiàn)一些功能

ChristmasBoy / 659人閱讀

摘要:第二個(gè)問題非基礎(chǔ)類型則不好處理,其實(shí)像這種比較的方法,往往不是用于處理普遍情況的,往往是在特殊場景發(fā)揮奇效的。沒有最好的方案,只有最合適的方案。這樣才能使得正數(shù)和負(fù)數(shù)的表示統(tǒng)一起來,具體可以參閱補(bǔ)碼的歷史,這里不過多展開了。

原文: https://github.com/HCThink/h-...

github 首頁(star+watch,一手動(dòng)態(tài)直達(dá)): https://github.com/HCThink/h-blog

掘金 link , 掘金 專欄

segmentfault 主頁

原創(chuàng)禁止私自轉(zhuǎn)載

廣告

部門長期招收大量研發(fā)崗位【前端,后端,算法】,歡迎各位大神投遞,踴躍嘗試。

坐標(biāo): 頭條,大量招人,難度有降低,大多能拿到很不錯(cuò)的漲幅,未上市,offer 給力!歡迎騷擾郵箱!

戳我: 戳我: [email protected]

How to do 快速獲取毫秒數(shù)
const now = +new Date();
平鋪多維數(shù)組
// 僅僅適用于二維數(shù)組。不過,通過遞歸,我們可以平鋪任意維度的嵌套數(shù)組。
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)]

// 提供另一種場景化很強(qiáng)的思路。

// 其實(shí)有更簡單的. 任意維度數(shù)組都可以搞定,
arr.join().split(",")

// 但是存在風(fēng)險(xiǎn): 類型會(huì)變。我們可以提供 轉(zhuǎn)換回調(diào)。
// 平鋪數(shù)字?jǐn)?shù)組 + 轉(zhuǎn)換回調(diào)
[1,2, [1, [2, 1+ 2 +1, Number(true)]]].join().split(",").map((index) => Number(index))  // (6)?[1, 2, 1, 2, 4, 1]

// 對(duì)于通式
Arr.join().split(",").map(fn)

這個(gè)方法可能限制很多,比如數(shù)組元素類型不一致, 比如非基礎(chǔ)類型等

第一個(gè)問題: 我們不妨想想,一個(gè)數(shù)組中既有 number,又有 string 是合理么?實(shí)際上這種數(shù)組在邏輯,潛在風(fēng)險(xiǎn)和處理上存在非常多的問題。大多數(shù)情況下是一個(gè)不好的設(shè)計(jì)。
但是如果在 Typescript 中往往有比較好的場景。

第二個(gè)問題:非基礎(chǔ)類型則不好處理, 其實(shí)像這種比較 Hacker 的方法, 往往不是用于處理普遍情況的,往往是在特殊場景發(fā)揮奇效的。沒有最好的方案,只有最合適的方案。

僅僅是另一種思路。

快速取整
// 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位整數(shù)則失敗
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"
//         }
//     }
// }"
大致測試一個(gè)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");
您可以創(chuàng)建一個(gè) 100% 純對(duì)象,它不會(huì)從 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
普通必傳參數(shù)校驗(yàn)
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
裝飾器用作必傳參數(shù)校驗(yàn)

如下為主要代碼, 完整代碼需要 Typescript 環(huán)境。

裝飾器校驗(yàn)必傳參數(shù)

裝飾器

Typescript

@validate
greet(p1, p2, p3, @required name: string, p5) {
    // p1-5 僅僅用于占位, 用來測試 required 的第四個(gè)參數(shù)。
    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 個(gè)參數(shù)是必傳參數(shù),請(qǐng)?zhí)峁?/pre>
解構(gòu) arguments 轉(zhuǎn)數(shù)組
+function fn() {
    console.log([...arguments]);            // (4)?[1, 2, 3, 4]
    console.log(Array.prototype.slice.call(arguments));
}(1,2,3,4)
庫的非 new 調(diào)用

通常庫遇到的問題往往是,用戶不按照你想要的方式調(diào)用,特別是 new 的問題,很多代碼中會(huì)存在一謝邏輯去校驗(yàn)用戶是否是 new 調(diào)用。諸如:

傳統(tǒng)式

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 在構(gòu)造中
class A {
    constructor() {
        console.log(new.target.name);
    }
}

new A();        // A
小數(shù)取整 && 強(qiáng)轉(zhuǎn) boolean
~~2.8   // 2
!! 0    // false
鋪墊知識(shí) [建議細(xì)看]

首先要明確的一點(diǎn)是,計(jì)算機(jī)內(nèi)部在做數(shù)學(xué)運(yùn)算時(shí)(也就是計(jì)算機(jī)的0和1的運(yùn)算),都是以補(bǔ)碼為標(biāo)準(zhǔn)的,說白了 計(jì)算機(jī)中就一種碼那就是補(bǔ)碼,而現(xiàn)實(shí)社會(huì)中的編碼規(guī)則,例如原碼、反碼都是我們自定義的,為了和計(jì)算機(jī)中的補(bǔ)碼形成轉(zhuǎn)換關(guān)系。所以說在我們手工計(jì)算這類由計(jì)算機(jī)計(jì)算的01運(yùn)算,要站在計(jì)算機(jī)的角度。因此首先就要將我們的原碼反碼什么的全都先轉(zhuǎn)為補(bǔ)碼,再來計(jì)算^_^。這樣才能使得正數(shù)和負(fù)數(shù)的表示統(tǒng)一起來,具體可以參閱【補(bǔ)碼的歷史】,這里不過多展開了。
接著來看那個(gè)問題,從問題入手,解決了實(shí)際問題,概念也就自然了然于心了。^_^

5 的補(bǔ)碼是它本身(ps:正數(shù)的原、反、補(bǔ)碼都是它本身;負(fù)數(shù)的原碼最高為為1開頭,反碼是最高符號(hào)位不變,其余位在原碼的基礎(chǔ)上取反,補(bǔ)碼是在反碼的基礎(chǔ)上+1即可得到)
5的補(bǔ)碼:00000101

~5 (也就是5按位取反運(yùn)算,下面涉及的是補(bǔ)碼運(yùn)算):
00000101按位取反,這里需要將原始01串完全反轉(zhuǎn)過來,不存在最高符號(hào)位的概念,取反結(jié)果為: 11111010

注意這里的結(jié)果是用補(bǔ)碼表示的,畢竟這還是機(jī)器表示形式,轉(zhuǎn)化為自然語言的編碼,把結(jié)果(補(bǔ)碼)轉(zhuǎn)化為原碼就是:

補(bǔ)碼-1轉(zhuǎn)為反碼: 11111010 - 1 = 11111001

反碼再取反轉(zhuǎn)為原碼:11111001 = 10000110

原碼轉(zhuǎn)為十進(jìn)制,答案就是-6

看看 [ ~ -6 = 5 ] 的計(jì)算過程, 假設(shè)有符號(hào)六位

~(100110 > 111001 > 111010)(-6 的原碼轉(zhuǎn)補(bǔ)碼才能參與運(yùn)算)

000101 (運(yùn)算結(jié)果是補(bǔ)碼)

000101 > 000101 -> 5(轉(zhuǎn)換為原碼[正數(shù)原碼是自身])

按位取反的快捷運(yùn)算公式 -(x+1). 【~~x -> -( -(x + 1) + 1) -> -( -x - 1 + 1) -> --x -> x】

ps: 以下內(nèi)容屬于廣告,選看

一二線大廠,可內(nèi)推,急招人(50% 漲幅輕輕松松, 面試較難),研發(fā)最好,有興趣: [email protected] 郵件私聊。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99998.html

相關(guān)文章

  • 15種編寫自我文檔化JavaScript方式

    摘要:我故意保持示例簡單,以說明公共接口是如何自我文檔化的。這種類型的函數(shù)產(chǎn)生更多的自我文檔化代碼的另一個(gè)原因是你可以信任他們的輸出。 在代碼里面找到一個(gè)完全沒有地方或沒有用的注釋是不是很有趣? 這是一個(gè)很容易犯的錯(cuò)誤:你改變了一些代碼,但忘記刪除或更新注釋。壞的注釋不會(huì)破壞你的代碼,但你可以想象一下調(diào)試時(shí)會(huì)發(fā)生什么。你讀了注釋,但代碼卻在做另一件事,也許最終你浪費(fèi)了一些時(shí)間來弄懂它,甚至最...

    tianlai 評(píng)論0 收藏0
  • CSS及布局

    摘要:經(jīng)過半年的打磨,正式發(fā)布,主要是新增了一些常用組件,并使用命名,為接下來的微信小程序開發(fā)做好準(zhǔn)備。這兩種方式實(shí)現(xiàn)的瀑布流式布局均支持首屏和網(wǎng)頁窗口大小改變時(shí)的列數(shù)自適應(yīng)。主要是對(duì)于標(biāo)準(zhǔn)里的布局方式草案中的布局方式進(jìn)行一些總結(jié)。 一勞永逸的搞定 flex 布局 尋根溯源話布局 一切都始于這樣一個(gè)問題:怎樣通過 CSS 簡單而優(yōu)雅的實(shí)現(xiàn)水平、垂直同時(shí)居中。記得剛開始學(xué)習(xí) CSS 的時(shí)候,看...

    jaysun 評(píng)論0 收藏0
  • 讓你代碼更簡短,更整潔,更易讀ES6小技巧

    摘要:讓你的代碼更簡短,更整潔,更易讀的小技巧寫在文章前面這篇文章翻譯自文章就代碼整潔方面對(duì)進(jìn)行了總結(jié)。如果你正在使用的代碼使用的語法,這個(gè)是你需要注意的事情。更多還提供了我們很多很多其他的方式來使我們的代碼更簡潔,更易讀,以及更穩(wěn)定。 讓你的代碼更簡短,更整潔,更易讀的ES6小技巧 寫在文章前面 這篇文章翻譯自ES6 tips and tricks to make your code cl...

    wpw 評(píng)論0 收藏0
  • 你可能不知道 npm 實(shí)用技巧

    摘要:但這并不意味著依賴版本是鎖死的。黃色表示不符合指定的語義化版本范圍,比如大版本升級(jí),升級(jí)可能會(huì)遇到兼容性問題。文件可以列出不想打包的文件,避免把一些無關(guān)的文件發(fā)布到上。 作者: LeanCloud weakish 分享一些 npm 包管理工具的實(shí)用小竅門,希望能夠略微提高下前端、Node.js 開發(fā)者的生活質(zhì)量。 絕大多數(shù)前端和 Node.js 開發(fā)者每天的日常工作都離不開 npm,不...

    NickZhou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<