2017-11-01 10 views
0

私はJavaScriptで試したと私はこのスニペットになってしまった:一般的なブラウザの実行待ち時間に関する "console.log"の最新の動作は何ですか?

var num = new Number(20); 

function f(n) { 
n["foo"] = "bar"; 
} 

// the printed object has a "foo" property. 
console.log(num, f(num)); 

私はf(num)が私console.lognum後に来るので、印刷されたオブジェクトがfooプロパティは、f(num)コールでそれに追加しているだろうと思ったことはありません(私はChromeを使用しています)。

console.logはすべての引数を実行して結果を出力していたので、console.logのMDNのドキュメントに行きましたが、それについては何もありませんでした。

次に私はつまずいたthis StackOverflowの質問。

第二と第三の質問は、オブジェクトで使用した場合console.logが少し遅れていることを言うが、(それはNumberオブジェクトであるため)、その場合には、次のスニペットで印刷されたオブジェクトは、同様にfoo性質を持っている必要があり、それはしていません:

var num = new Number(20); 

function f(n) { 
n["foo"] = "bar"; 
} 

// no "foo" property 
console.log(num); 
f(num); 


私は除いて、ほとんど言及した第二と第三の答えが言うことを言う質問への受け入れ答えは、それはまた、行動がコンソールまたはブラウザ依存であると述べています。だから、どういうブラウザがこのようなことを今日どのように扱っているのでしょうか(その質問は6年前のことです)?非常に大きなオブジェクトの場合のみは非同期ですか?最初の質問のnumはなぜfooプロパティで印刷されるのですか?

+0

どうやら 'はconsole.log()' "ソートの" Chromeで非同期です。他の日にも同様の問題が発生しました。https://stackoverflow.com/questions/47046935 –

+0

その質問にも答えられていません。しかし、それが非同期なら、それはいつ非同期ですか?私が2番目の例で示したように、それは非同期ではありません(私がリンクしている質問に対する答えによる)。 – Taurus

+0

@Taurus実際には非同期ではありませんが、オブジェクトの検査は非同期で行うことができます。詳細については、[here](https://stackoverflow.com/a/23392650/1048572)を参照してください。 – Bergi

答えて

2
// the printed object has a "foo" property. 
console.log(num, f(num)); 

この現象は特定のconsole.logとは限りません。関数へのすべての引数は、関数の実行が開始される前に評価されます(順番に)。 f(num)console.logの引数であるので、console.logの前に呼び出され、numを見る機会が得られます。本質的には

、何が起こっているのは、次のとおりです。

var arg1 = num; 
var arg2 = f(num); // modifies num in place, so arg1 changes as well 
console.log(arg1, arg2); 
+0

素晴らしい!私が後にしているのは、微妙で重要な情報です。まさに私が探していたもの。 – Taurus

+0

私はそれを考えると、それは本当に自然な感じです、私は通常の機能として "console.log"を考えていたなら、私は混乱していないでしょう。実際、それはそれよりも長い話です。 – Taurus

関連する問題