JavaScriptのシリーズは、売春の実装のいくつかの奇妙なトリック(a)は、短いスリープ機能は、タイムスタンプを取得--JavaScript

I.はじめに

便利なものが、あなたは知らないかもしれない、あなたが使用している可能性がいくつかのことをしていますが、原則を知らないかもしれません。
目的を達成するための多くの方法は、すべての道はローマに通ず、ことわざにもあります。発散何みんなの考え方や知識を拡大して見えます。

 

第二に、短いスリープ機能を達成するために

スリープ機能は、主にスリープ機能を持っている多くのプログラミング言語の実装で遅延のために使用されているが、これなしでjavascript関数は、我々はこれを実現します:

1、シンプルなバージョン

function sleep(sleepTime){
    for(var start = +new Date;+new Date - start<sleepTime;){} } var t1 = +new Date(); sleep(3000); var t2 = +new Date(); console.log(t2-t1);

長所:シンプルで、粗、理解しやすいです。

短所:本当に精度が許可され、CPUが舞い上がる、睡眠、しかし、カードは死んでいます

 

2、約束のバージョン

// promise版本
function sleep(sleepTime){ return new Promise(resolve => setTimeout(resolve,sleepTime)); } var t1 = +new Date(); sleep(3000).then(()=>{ var t2 = +new Date(); console.log(t2-t1); }) 

利点:実際には、setTimeoutを、ブロッキング形成過程、および負荷とパフォーマンスの問題が発生することはありません。

短所:ネストされたコールバックを解決するが、それでもかなり、および非同期が完了していないが、プロセスが実行を停止します。

 

3、発電機のバージョン

// generotor版本
function sleep(sleepTime){ return function(cb){ setTimeout(cb.bind(this), sleepTime); } } function* genSleep(){ var t1 = +new Date(); yield sleep(3000); var t2 = +new Date(); console.log(t2-t1); } async(genSleep); function async(gen){ const iter = gen(); function nextStep(it){ if(it.done) return ; if (typeof it.value === "function") { it.value(function(ret) { nextStep(iter.next(ret)) }) } else { nextStep(iter.next(it.value)); } } nextStep(iter.next()); }

長所:約束、よりシンプルでクリーンなコードの利点と同様に。

短所:毎に実行される次の()が、非常に面倒である  (サードパーティ製のパッケージが)解決することができるが、それは多層パッケージであり、良い見ていない、エラーがなければならない  共同  の種類のに対処するためのロジック、。

共同  理由は、このような火災は、もちろん、理由がないわけではない達成するだけでなく sleep 、このような愚かなことをしますが、それを介して住んでgenerator/yield 非常によく似て達成するために async/await 効果が!これは本当に私の憧れ運命スリービューます。

const co = require("co")
function sleep(sleepTime) { return function(cb) { setTimeout(cb.bind(this), sleepTime) } } co(function*() { const t1 = +new Date() yield sleep(3000) const t2 = +new Date() console.log(t2 - t1) })

 

4、非同期/リリースを待ちます

function sleep(delay) {
  return new Promise(reslove => { setTimeout(reslove, delay) }) } !async function test() { const t1 = +new Date() await sleep(3000) const t2 = +new Date() console.log(t2 - t1) }()

利点:利点と約束して発電機。非同期/待つGeneratorは非同期、シンタックスシュガーとして見ると*とセマンティクスに比べてより多くの収量を待つことができ、様々な追加機能が平坦である、より読みやすいコードを更新、不要な入れ子になったを生成しません。

短所:互換性の問題ES7文法、およびすべてのバベルの互換性は問題ではありません

 

5、オープンソース版

JavaScriptのエレガントな書き込みでは、睡眠は、どのようにエレガントエレガントに等しくない:C ++で実装モジュールがありますhttps://github.com/ErikDubbelboer/node-sleep

const sleep = require("sleep")

const t1 = +new Date() sleep.msleep(3000) const t2 = +new Date() console.log(t2 - t1)

長所:細かい時間精度を達成する能力、および本当に機能、明らかに簡単に寝ているようです。
短所:このモジュールのインストール要求の欠点ノードスリープ

 

フロントエンド知識非同期/待っていますが、最もエレガントなフロントエンドの非同期を書くための方法であります

 

第二に、エレガントなタイムスタンプを取得し、

上記を達成するため  sleep の機能を、私たちはコードを持っていることがわかります  +new Date()スタンプが取得された使用時間を、これ1つだけそれらのですが、私は他の二つと同様に、以下について語った  +new Date()原則。

1、版

var timestamp=new Date().getTime()

長所:ユニバーサル、私たちすべてがこの使用
欠点を:なしバーがあってはなりません

 

2、アドバンスドエディション

var timestamp = (new Date()).valueOf()

valueOfメソッドが(「ブール」、「ナンバー」データの5つの基本タイプの一つ、プリミティブ、「ヌル」、「不定」、「文字列」)オブジェクトの元の値を返し、文字列、数値、などbool値であってもよいし、参照特定のオブジェクト。

長所:元開発者の説明が特定の認知値を持って、それをすべて自分自身。
短所:なしバーがあってはなりません

 

3、Date.now()方法

Date.now()

Date.now() この方法は、現在の時刻を1970年1月1日00:00:00からのミリ秒数を返します。Numberに入力します。今は()であるため、Date静的な関数は、それがDate.nowの形式でなければなりません()を使用します。

長所:単純明快。

短所:互換性の問題、ECMA-262は、標準化された第五版です。

サポートされていない互換性互換コード:

if (!Date.now) {
  Date.now = function now() { return new Date().getTime(); }; }

 

4、再来

var timestamp = +new Date()

長所:パフォーマンスのより強固な把握の暗黙的な変換のためのJavaScriptの
短所:なしバーがあってはなりません

+新しいDate()タイムスタンプを取得する理由のは、分析してみましょうか?

すなわち、暗黙的な変換であり、本質的に、のvalueOf()メソッドと呼ばれています。

 

注意:

(1)1つのオペレータ元+

一つの元の  + 事業者は、彼らのオペランドの変換  Number タイプを、その符号を反転させます。負のことに注意してください  +0 生産  -0負の  -0 農産物を  +0

+新しい日付は()はToNumber(新しいDate())対応します

 

(2)toString オブジェクトの文字列表現が使用されて返します。

var obj = {};
console.log(obj.toString());//[object Object]

var arr = [];
console.log(arr.toString());//""空字符串 var date = new Date(); // Tue May 28 2019 22:05:58 GMT+0800 (中国标准时间) console.log(date.toString());//"Tue May 28 2019 22:05:58 GMT+0800 (中国标准时间)"

 

(3)のvalueOf()メソッドは、オブジェクトの元の値を返し

valueOfメソッド)は(オブジェクトの元の値を返し、特定のオブジェクトを参照して、文字列、またはブール値のデブリーフィングであってもよいです。

var obj = {
  name: "saucxs"
}
console.log(obj.valueOf()) //Object {name: "saucxs"}

var arr1 = [1,3] console.log(arr1.valueOf()) //[1,3] var date = new Date() console.log(date.valueOf())//1456638436303 // 如代码所示,三个不同的对象实例调用valueOf返回不同的数据

元の値が参照する  'Null','Undefined','String','Boolean','Number','Symbol' 6つの基本的なデータ型のいずれか、すでにこの概念を述べ、ここで再びそれを肯定します。

 

最後に、それらについての分解の過程:+new Date():    

(1)優先順位プロセスがに分解することができ、新たなオペレータ単項+よりも高い:VAR時間=新しいDate() ; +時間

ToNumber(時間):(2)上記の規則に従ってに対応

ToNumber(たToPrimitive(時間))(3)時間、日付オブジェクトである、変換ルールはToNumberによれば、と等価です

(4)変換ルールたToPrimitiveによれば:はToNumber(time.valueOf())、time.valueOf())は、元のタイムスタンプが想定time.valueOf(する価値がある= 1503479124652

(5)これはToNumber(1,503,479,124,652)この番号1503479124652の戻り値です。

フロントエンド知識:魔法の暗黙的な変換

 

おすすめ

転載: www.cnblogs.com/chengxs/p/10949075.html