小知識!

時間

  1. UTC時間 與 GMT時間
    咱們能夠認爲格林威治時間就是時間協調時間(GMT=UTC),格林威治時間和UTC時間均用秒數來計算的。
    UTC + 時區差 = 本地時間
    時區差東爲正,西爲負。在此,把東八區時區差記爲 +0800,
    UTC + (+0800) = 本地(北京)時間 (1)
    那麼,UTC = 本地時間(北京時間))- 0800 (2)
var a = new Date();
a.toGMTString()
// "Tue, 13 Nov 2018 10:39:05 GMT"
a.toUTCString()
// "Tue, 13 Nov 2018 10:39:05 GMT"
  1. ISO(時間格式不是時間)
    ISO-8601 是表示時間的一種標準格式。
    2016-01-18T23:41:00 是符合 ISO-8601 標準的時間表示。
    2016-01-18T23:41:00 裏面的 T 表示 UTC,因此這個字符串解析後就表示 UTC 時間的 2016-01-18 23:41:00
var a = new Date();
a.toISOString()
"2018-11-13T10:39:05.329Z"

應用

nodejs相關代碼,設置緩存相關時間javascript

var lastModified = stat.mtime.toUTCString();
  res.setHeader("Last-Modified", lastModified);

  res.setHeader("Expires", expires.toUTCString());

http緩存

promise 實現嘗試

function Promise(fn) {
        var thenResovleSave = function() {};

        var resolve = function (value) {
            if (value && value.then) {
                runFun(value.then)
                return ;
            }
            // console.log('in rs', value);
            thenResovleSave(value);
            thenResovleSave = null;
        }
       
        function runFun(fn) {
            fn(resolve);
        }
        runFun(fn);
        this.then = (cb) => {
            return new Promise(function(rs) {
                thenResovleSave = function(res) {
                    rs(cb(res)); 
                }
            });
        };
    }

var p = new Promise(function(rs, rj) {
    setTimeout(function() {
        var result = Math.random() <= 1 ? 1 : 0;
        if (result) {
            rs('1');
        } else {
            rj('rejected1');
        }
    }, 500)
});

var c = new Promise(function(rs, rj) {
    setTimeout(function() {
        var result = Math.random() <= 1 ? 1 : 0;
        if (result) {
            rs('c1');
        } else {
            rj('rejected1');
        }
    }, 500)
});
p.then(function(res) {
    console.log('then1', res)
    return c;
}).then(function(res ){
    setTimeout(() =>{
        console.log('then2', res);
    },1000)
});

js 數字存儲

js全部的數字類型都是雙倍精度的浮點型,都是採用了IEEE754標準。
java

每一個數字都是以64位(8字節)來存儲。64位分3部分:node

符號位S:第 1 位是正負數符號位(sign),0表明正數,1表明負數
指數位E:中間的 11 位存儲指數(exponent),用來表示次方數
尾數位M:最後的 52 位是尾數(mantissa),超出的部分自動進一舍零promise

相關博客:http://www.javashuo.com/article/p-pftpnvfn-ng.html緩存

用二進制來保存,就會致使十進制轉二進制的時候存在循環,被捨去。致使精度問題。
好比0.1 表示:
1.1001100110011001100110011001100110011001100110011001100110011001..... * 2 ^ -4
S位爲0
E爲 01111111011(1023 - 4 = 1019 1019 轉二進制並補齊11位爲01111111011)
M爲1001100110011001100110011001100110011001100110011010(截取52位,四捨五入,由於丟掉了剩下的部分,致使精度問題)dom

因此數字最大爲2^53-1 === Number.MAX_SAFE_INTEGER === 9007199254740991post

爲何是這個值

使用 52 位表示一個數的整數部分,那麼最大能夠精確表示的數應該是 2^52 - 1 纔對。
就像 64 位表示整數時那樣: 2^63 - 1 (去掉 1 位符號位)。
但其實浮點數在保存數字的時候作了規格化處理,以 10 進製爲例:
20*10^2 => 2*10^3 //小數點前只須要保留 1 位數
對於二進制來講, 小數點前保留一位, 規格化後始終是 1.***, 節省了 1 bit,這個 1 並不須要保存。this

js位運算

位運算符用於對二進制位進行計算,這些位運算符直接處理每個比特位(bit)
雖然js數字存儲是64位存儲, 可是位運算將數字轉換爲32位有符號整數。(小數部分直接被忽略,go java都不支持對非整數的位運算)。code

因此位運算的有效位爲2^32 - 1 === -1 >>> 0 === (0x100000000 - 1) === 4294967295blog

js 100題

http://www.javashuo.com/article/p-xbazuhvy-cg.html

相關文章
相關標籤/搜索