SORU
24 HAZİRAN 2013, PAZARTESİ


{} Neden {} yalnızca istemci tarafında NaN? Neden node.js değil mi?

[] [] boş bir dize, [] {} ** 11, {} [] 0. Neden {} {} NaN?

> {}   {}
  NaN

Benim sorum ({} {}).toString() NaN.toString() "NaN", this part has an answer here alreadysırada "[object Object][object Object]" neden değil.

Benim sorum neden bu sadece istemci tarafında olur mu? Sunucu tarafında (Node.js) 20 ** "[object Object][object Object]".

> {}   {}
'[object Object][object Object]'

Özetleme:

İstemci tarafında:

 []   []              // Returns ""
 []   {}              // Returns "[object Object]"
 {}   []              // Returns 0
 {}   {}              // Returns NaN

 NaN.toString()       // Returns "NaN"
 ({}   {}).toString() // Returns "[object Object][object Object]"
 var a = {}   {};     // 'a' will be "[object Object][object Object]"

İçinde Node.js:

 []   []   // Returns "" (like on the client)
 []   {}   // Returns "[object Object]" (like on the client)
 {}   []   // Returns "[object Object]" (not like on the client)
 {}   {}   // Returns "[object Object][object Object]" (not like on the client)

CEVAP
24 HAZİRAN 2013, PAZARTESİ


Çok ilginç bir soru! Afiyet olsun.

Kök neden

Fark kök node.js Krom geliştirme araçları nasıl vs bu ifadeleri nasıl değerlendirir.

Node.js nedir

Node.js bunun için repl modülü kullanır.

Node.js REPL source code:

  self.eval('('   evalCmd   ')',
            self.context,
            'repl',
            function(e, ret) {
                if (e && !isSyntaxError(e)) 
                    return finish(e);                    
                if (typeof ret === 'function' &&
                    /^[\r\n\s]*function/.test(evalCmd) ||
                    e) {
                      // Now as statement without parens.
                      self.eval(evalCmd, self.context, 'repl', finish);
                } 
                else {
                  finish(null, ret);
                }
            });

Bu beklediğiniz gibi Krom ({} {}) "[object Object][object Object]" üreten Geliştirici Araçları, çalışan gibi davranır.

Chrome Geliştirici Araçları ne

44**: diğer taraftan

  try {
      if (injectCommandLineAPI && inspectedWindow.console) {
          inspectedWindow.console._commandLineAPI = new CommandLineAPI(this._commandLineAPIImpl, isEvalOnCallFrame ? object : null);
          expression = "with ((window && window.console && window.console._commandLineAPI) || {}) {\n"   expression   "\n}";
      }
      var result = evalFunction.call(object, expression);
      if (objectGroup === "console")
          this._lastResult = result;
      return result;
  } 
  finally {
      if (injectCommandLineAPI && inspectedWindow.console)
          delete inspectedWindow.console._commandLineAPI;
  }

Yani temelde, bu ifade ile nesne üzerinde call bir performans sergiliyor. İfade ediliyor

with ((window && window.console && window.console._commandLineAPI) || {}) {
    {} {};// <-- This is your code
}

Gördüğünüz gibi, bu ifade doğrudan, sarma parantez olmadan evaluted ediliyor.

Neden Node.js farklı davranır

'Nin kaynağı bu haklı: . Node.js

// This catches '{a : 1}' properly.

Düğüm her zaman bu şekilde hareket etmedi. Burada the actual commit that changed it. Ryan değiştir şu yorumu yaptı: "ÇOĞALTMA komutları evaled nasıl Geliştirmek" farkı bir örnek ile.


Gergedan

Güncelleme - OP nasıl ilgilendiGergedanmatematik ve Chrome devtools gibi davrandığını ve nodejs aksine).

Gergedan Chrome geliştirici araçları ve node.js'hem V8 kullanan s ÇOĞALTMA. aksine tamamen farklı bir JS motoru kullanır

Burada Rhino kabuk Rhino ile JavaScript komutu eval ne olur temel boru hattı.

Temel olarak:

 Script script = cx.compileString(scriptText, "<command>", 1, null);
 if (script != null) {
     script.exec(cx, getShellScope()); // <- just an eval
 }

Üç aşağı, Gergedan kabuk herhangi bir paketleme olmadan eval gerçek bir en yakın şeyi yapar. Gergedan eval() gerçek bir açıklama için en yakın ve tam eval gibi davranmasını bekleyebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • kimberly p

    kimberly p

    23 Ocak 2010
  • ThePointblank

    ThePointblan

    18 Aralık 2006