{} + {} কেন কেবল ক্লায়েন্টের পক্ষে এনএন? কেন নোড.জেজে নেই?


136

যখন [] + []একটি খালি স্ট্রিং [] + {}হয় "[object Object]", হয় এবং {} + []হয় 0{} + {}এনএন কেন ?

> {} + {}
  NaN

কেন আমার প্রশ্ন না হয় ({} + {}).toString()হল "[object Object][object Object]"যখন NaN.toString()হয় "NaN", এই অংশ উত্তর এখানে ইতিমধ্যে

আমার প্রশ্ন হল কেন এটি কেবল ক্লায়েন্টের পক্ষেই ঘটে? সার্ভারের দিকে ( নোড.জেএস ) {} + {}রয়েছে "[object Object][object Object]"

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

সংক্ষিপ্তসার :

ক্লায়েন্ট পক্ষের:

 [] + []              // 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]"

নোড.জেএস এ:

 [] + []   // 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)

4
এটি কেবল ব্রাউজার কনসোল যা এটি করে। কনসোলে লগ করার চেষ্টা করুন এবং এটি নোডজেএস-এর মতোই। jsbin.com/oveyuj/1/edit
elclanrs

2
সত্যই কোনও সদৃশ নয়, আমি নোডজেএস উত্তর চাইছি। পুনরায় খোলার পক্ষে ভোটদান ...
আয়নিক বিজাউ

4
হুম ... দুঃখিত। তবে, স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 9032856/ … এখনও প্রাসঙ্গিক এবং প্রথমার্ধের উত্তর দেয়
জন ডিভোরাক

3
ভুলে যাবেন না যে {}কোনও একটি অভিব্যক্তি বা প্রসঙ্গের উপর নির্ভর করে আদিম হিসাবে আধ্যাত্মিক হিসাবে ব্যাখ্যা করা যেতে পারে। হতে পারে কোডটি ক্লায়েন্ট এবং সার্ভারে একই রকম তবে কোডটি {}প্রবেশের বিভিন্ন প্রেক্ষাপটের কারণে এটি আলাদাভাবে ব্যাখ্যা করছে।
পাতাসু

18
দয়া করে আবার খুলুন এবং তারপরে এই প্রশ্নটি বারবার বন্ধ করা বন্ধ করুন যেহেতু এই প্রশ্নটি সত্যই কোনও সদৃশ নয়
অ্যালভিন ওয়াং

উত্তর:


132

আপডেট নোট: এটি ক্রোম 49 এ স্থির করা হয়েছে

খুব মজার প্রশ্ন! খনন করি

আসল কারণ

পার্থক্যের মূলটি হল নোড.জেএস কীভাবে এই বিবৃতিগুলি মূল্যায়ন করে বনাম Chrome ক্রিয়াকলাপ সরঞ্জামগুলি কী করে।

নোড.জেএস কী করে

নোড.জেএস এর জন্য Repl মডিউলটি ব্যবহার করে ।

Node.js থেকে REPL সোর্স কোড :

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);
        }
    }
);

এটি ({}+{})ক্রোম বিকাশকারী সরঞ্জামগুলিতে চলার মতো কাজ করে, যা "[object Object][object Object]"আপনার প্রত্যাশার মতো উত্পাদন করে ।

ক্রোম বিকাশকারী সরঞ্জামগুলি কী করে

অন্যদিকে ক্রোম ডাফলার সরঞ্জামগুলি নিম্নলিখিতটি করে :

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;
}

সুতরাং মূলত, এটি callএক্সপ্রেশন দিয়ে বস্তুর উপর একটি সম্পাদন করে। প্রকাশ হচ্ছে:

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

সুতরাং, যেমন আপনি দেখতে পাচ্ছেন, অভিব্যক্তিটি মোড়ানো প্যারেনেসিস ছাড়াই সরাসরি বিবর্তিত হচ্ছে।

কেন নোড.জেএস বিভিন্নভাবে কাজ করে

নোড.জেএস এর উত্স এটিকে ন্যায্যতা দেয়:

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

নোড সবসময় এই জাতীয় আচরণ করে না। এখানে প্রকৃত কমিট এটি পরিবর্তিত । রায়ান পরিবর্তনের বিষয়ে নিম্নলিখিত মন্তব্যটি রেখেছিলেন: পার্থক্যের উদাহরণ সহ "আরএইপিএল কমান্ডগুলি কীভাবে কার্যকর হবে" উন্নত করুন।


গণ্ডার

আপডেট - ওপি আগ্রহী ছিল যে রাইনো কীভাবে আচরণ করে (এবং এটি কেন ক্রোম ডেভোলসের মতো এবং নোডেজের মতো নয়)।

রাইনো ক্রোম বিকাশকারী সরঞ্জাম এবং নোড.জেএস এর আরপিএল থেকে পৃথকভাবে সম্পূর্ণ আলাদা জেএস ইঞ্জিন ব্যবহার করে যা উভয়ই ভি 8 ব্যবহার করে।

রাইনো শেলের মধ্যে রিনোর সাথে যখন আপনি একটি জাভাস্ক্রিপ্ট কমান্ড দেখান তখন কী হবে তার প্রাথমিক পাইপ লাইনটি এখানে রয়েছে।

  • শেল চলে org.mozilla.javascript.tools.shell.main

  • পালা, এটি আহ্বান এই new IProxy(IProxy.EVAL_INLINE_SCRIPT); উদাহরণস্বরূপ, যদি কোড ইনলাইন সুইচ -e সাথে সরাসরি পাস হয়।

  • এটি আইপ্রোক্সির runপদ্ধতিটিকে হিট করে ।

  • এটি আহ্বান evalInlineScript( src )। এটি কেবল স্ট্রিংকে সংকলন করে এবং এটিকে পরিষ্কার করে।

মূলত:

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

তিনটির মধ্যে গন্ডার শেলটি এমন কোনও যা evalকোনও মোড়ক ছাড়াই প্রকৃতের নিকটতম কাজটি করে । গন্ডার একটি প্রকৃত eval()বক্তব্যের নিকটতম এবং আপনি এটির মতো ঠিক আচরণ করার আশা করতে পারেন eval


1
(সত্যিই উত্তর একটি অংশ, কিন্তু nodejs কহতব্য ব্যবহার VM মডিউল ডিফল্টরূপে evaling যখন REPL ব্যবহার করার জন্য, এবং শুধুমাত্র একটি JavaScript eval)
বেঞ্জামিন Gruenbaum

গণ্ডা , উদাহরণস্বরূপ, টার্মিনালে একই জিনিস (কেবল ক্রোম কনসোল নয়) আপনি কী ব্যাখ্যা করতে পারেন ?
আয়নিক বিজাউ

5
+10 যদি এটি সম্ভব হত! বাহ মানুষ, ... সত্যিই আপনার জীবন নেই বা এমন কিছু জানতে আমার চেয়ে আপনি আরও স্মার্ট। দয়া করে আমাকে বলুন যে আপনি এই উত্তরটি খুঁজে পেতে কিছুটা অনুসন্ধান করেছিলেন :)
স্যামুয়েল

7
@ সামুয়েল এটি যা গ্রহণ করেছে তা উত্সটি পড়ে - আমি কসম! ক্রোমে, আপনি যদি 'ডিবাগার' প্রবেশ করেন; , আপনি পুরো পাইপটি পেয়েছেন - এটি আপনাকে উপরে কেবল একটি ফাংশন দিয়ে সরাসরি ' উইথ'-এ ফেলে দেবে evaluateOn। নোডে, সমস্ত কিছু খুব ভালভাবে নথিভুক্ত করা হয় - তাদের কাছে একটি উত্সর্গীকৃত আরপিএল মডিউল রয়েছে যা সমস্ত ইতিহাসের সাথে গিটকে সুন্দর এবং আরামদায়ক করে থাকে, আমার নিজের প্রোগ্রামগুলিতে আগে আরপিএল ব্যবহার করত, আমি জানতাম কোথায় খুশী হলাম :) আপনি এটি পছন্দ করেছেন এবং খুঁজে পেয়েছেন বলে আমি আনন্দিত এটি সহায়ক, তবে আমি আমার বুদ্ধির চেয়ে এই কোড ঘাঁটি (দেব-সরঞ্জামগুলি এবং নোডেজ) এর সাথে আমার পরিচিতির কাছে .ণী। সোজা উত্সে যাওয়া প্রায়শই সর্বদা সহজ।
বেনিয়ামিন গ্রুইনবাউম

আপডেট - ক্রোমের কনসোল এপিআইটি কিছুটা আপডেট করা হয়েছে যাতে সাধারণ ধারণাটি সঠিক থাকাকালীন পোস্ট করা কোডটি Chrome এর অতি সাম্প্রতিক সংস্করণের জন্য সঠিক নয়। ক্রোমিয়াম.
googlesource.com/chromium/blink.git/+/master/Source/…
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.