Chrome} + {Chrome ক্রোম কনসোলে আর এনএএন কেন নেই?


144

আমি আজ লক্ষ্য করেছি যে NaNআপনি {}+{}কনসোলে টাইপ করার সময় ক্রোম 49 আর আউটপুট দেয় না। পরিবর্তে এটি স্ট্রিং আউটপুট [object Object][object Object]

কেন? ভাষা পরিবর্তন হয়েছে?


13
দেখে মনে হচ্ছে ক্রোম এখন এই অপারেশনটিকে সংযোজনের পরিবর্তে স্ট্রিং কনক্যাট হিসাবে বিবেচনা করে। এটি কেন, আমি জানি না, এই কারণেই এটি একটি মন্তব্য নয় উত্তর :) :) চেষ্টা করুন var e = {}; e.toString()এবং আপনি আমার
অর্থটি

19
"ভাষা কি বদলেছে?" নং
ফেলিক্স ক্লিং

6
@FelixKling হবে ভাষা পরিবর্তন? ... কোন। : সি
বিড়াল

18
হয়তো WATMAN এটা দিয়ে কি কিছু ছিল?
রিক্সার

1
@ চালক এটি আমাকে এটিরূপে খুঁজে পেয়েছে। আমি একটি উপস্থাপনা জন্য এটি পুনরুক্তি করা হয়েছিল।
ফিলিপ হাগলুন্ড

উত্তর:


152

ক্রোম ডেভোলগুলি এখন স্বয়ংক্রিয়ভাবে সমস্ত কিছুই মোড় নেয় যা শুরু হয় {এবং শেষ }হয় একটি অভিজাত জুটির বন্ধনী ( কোড দেখুন ) এর সাথে, তার মূল্যায়নকে একটি অভিব্যক্তি হিসাবে জোর করে। এইভাবে, {}এখন একটি খালি বস্তু তৈরি করে। আপনি যদি ইতিহাস ( ) এর মাধ্যমে ফিরে যান তবে আপনি এটি দেখতে পারবেন , পূর্ববর্তী লাইনটি এতে অন্তর্ভুক্ত থাকবে (…)

কেন? আমি জানি না, তবে আমি অনুমান করতে পারি যে এটি নবজাতকদের জন্য বিভ্রান্তি হ্রাস করে যা ব্লক-বনাম-অবজেক্ট-আক্ষরিক জিনিসটি জানে না এবং আপনি যদি কেবল কোনও অভিব্যক্তিটি মূল্যায়ন করতে চান তবে এটি আরও বেশি সহায়ক।

499864 বাগে যেমন আলোচনা করা হয়েছে তেমনি এটি যুক্তি । খাঁটি সুবিধা। এবং কারণ নোড REPL এটিও ছিল ( কোড দেখুন )।


182
বোকা ক্রোম, {a:1}),({b:2}একটি ত্রুটি নিক্ষেপ করা উচিত, একটি অবজেক্ট উত্পাদন না।
ওরিওল

29
আপনি যখন ইচ্ছামত রেগেক্স স্ট্যাকওভারফ্লো.
ফিলিপ হাগলুন্ড

4
কেন আমার কোনও ধারণা নেই তবে কোনওভাবেই আমি যখন সেখানে আমার বার্তা দেখি তখন আমি "বিখ্যাত" বোধ করি যদিও পৃষ্ঠাটি এটির মতোই প্রকাশ্য: ডি অদ্ভুত স্ট্যাকওভারফ্লো সমস্যা। সমস্যা সম্পর্কে আমার পুরানো উত্তর এখানে আছে stackoverflow.com/questions/17268468/…
বেনিয়ামিন গ্রুইনবাউম

3
আমি বর্তমান বাস্তবায়ন পছন্দ করি না এবং এটি ঠিক করার পরিকল্পনা করি। bugs.chromium.org/p/chromium/issues/detail?id=499864#c17
Zirak

1
@ জিরাক শুভকামনা যে আবর্জনা ঠিক করছে, আইএমও এটি খুব শীঘ্রই সমর্থন করা উচিত। তবে আপনি যদি এটি উন্নতি করতে চান তবে এটি )কোনও মন্তব্যে সন্নিবেশ করার আগে একটি নতুন লাইন যুক্ত করার বিষয়টি বিবেচনা করুন, যেমন {a:3} // :-}এখনও কোনও বস্তু তৈরি হতে পারে।
ওরিওল

44

আপনি যদি এটি যাচাই করার পরে আপ তীরটি আঘাত করেন তবে আপনি লক্ষ্য করবেন যে {} + {}এটির পরিবর্তে এটি প্রদর্শিত হবে ({} + {}), যার ফলস্বরূপ "[object Object][object Object]"

তুলনায়, ফায়ারফক্সে, {} + {}এখনও প্রদর্শিত হয় NaN, তবে আপনি যদি ({} + {})এটি করেন তবে এটি প্রদর্শনও করে "[object Object][object Object]"

সুতরাং, দেখে মনে হচ্ছে ক্রোম যখন এই ক্রিয়াকলাপটি দেখবে তখন চারপাশের বন্ধনীগুলি স্বয়ংক্রিয়ভাবে যুক্ত হচ্ছে।


22
এই উত্তরটি সঠিক। কিন্তু বাহ, মানুষ, আমি নিশ্চিত নই যে ক্রোম এটি করুক। খারাপ গুগল
ব্যবহারকারী 428517

1
@ এসগ্রোভগুলি আমি ক্যানারিতে একই রকম কিনা তা দেখতে আগ্রহী এবং এটি যদি উদ্দেশ্যমূলকভাবে করা হয়েছিল বা আসলে কোনও বাগ রয়েছে see
জে টিটাস

8
{} + {}যখন "স্যানিটাইজড" না ({} + {})করা হয় এমন হিসাবে ধরা হয় + {}কারণ {}একটি খালি ব্লক হিসাবে পার্স করা হয়েছে।
গ্রেগরি নিসবেট

7
এটি কেন প্রথম স্থানে NAN ফেরত দেবে?
0x499602D2

25
@ 0x499602D2: কারণ আপনি যদি পেরেন না করেন (বা অন্যথায় পার্সারকে বিবৃতি না দিয়ে অভিব্যক্তির প্রত্যাশায় স্থান পরিবর্তন করতে না পারে) তবে প্রাথমিকটি {}কেবল একটি খালি কোড ব্লক এবং অবহেলা করা হয় যা আমাদের সাথে ছেড়ে যায় +{}যা একটি অরিয়া +এবং খালি অবজেক্ট সূচনাকারী। +সংখ্যা, যা একটি আদিম (যা একটি হচ্ছে শেষ হবে বস্তুর রূপান্তর জড়িত তার যুক্তি নিগৃহীত হবে toStringএই ক্ষেত্রে, ফলে "[object Object]"), এবং তাই আমরা পেতে +"[object Object]"যা NaNকারণ "[object Object]"একটি বৈধ সংখ্যায় রূপান্তরিত করা যাবে না।
টিজে ক্রাউডার

4

কনসোলের সাথে ক্রম 54 হিসাবে:

.- "আমি সেই ব্লকটি আপনার জন্য একটি অবজেক্টে রূপান্তর করেছি" -ক্লিপি দুর্ভাগ্যক্রমে, আমি ক্লিপির উদ্ধৃতি নিজেই যুক্ত করেছি। কনসোলটি এটি আপনার জন্য কী করেছে সে সম্পর্কে কোনও তথ্য দেয় না।

নতুন নিয়মাবলী অবিশ্বাস্যরূপে সহজ এই দুটি কঠিন চার্টারের টাইপ করার সমস্যাটি o=বা কনসোলটিতে 0,অবজেক্ট লিটারালগুলি পেস্ট করার আগে:

  • আপনার যদি এমন কোড থাকে যা দিয়ে শুরু হয়: alচ্ছিক শ্বেতস্থান, (কোনও মন্তব্যের অনুমতি নেই) এর পরে ক {;
  • এবং এই কোডটি একটি অবজেক্ট হিসাবে ব্যাখ্যা করা যেতে পারে;
  • এবং সেই অবজেক্টটি অন্য কোনও কোড অনুসরণ করে না, যদি না:
  • প্রথম বস্তুর পরে কোডটি বাইনারি অপারেটর,
  • তারপরে গ্রুপিং সহ আপনার পছন্দমতো অপারেশন হতে পারে
  • প্রদত্ত চূড়ান্ত অপারেটরের ডান হাতের অবস্থানে একটি অবজেক্ট আক্ষরিক থাকে;
  • এবং সেই চূড়ান্ত অবজেক্টটিকে পেরেন্সে ভাগ করা হয়নি
  • এবং সে কোডটি সেমিকোলন দিয়ে শেষ হয় না
  • এবং কোড অনুসরণ করে কোন মন্তব্য নেই (প্রাথমিক বা চূড়ান্ত অবস্থানে না থাকায় অভ্যন্তরীণ মন্তব্যগুলি এতক্ষণ অনুমোদিত)
  • তারপরে এবং কেবলমাত্র তখনই আপনার জাভাস্ক্রিপ্ট (যা আসলে বৈধ কোড হতে পারে বা নাও হতে পারে) একটি বৈধ অবজেক্ট হিসাবে পুনরায় লেখা হবে। আপনাকে জানানো হবে না যে আপনার কোডটি পুনরায় ব্যাখ্যা করা হয়েছে।

{wat:1}),({wat:2} অবশেষে আবার একটি ত্রুটি।

{let i=0;var increment=_=>i++} সঠিকভাবে অনুমোদিত, অবশেষে, যা ক্লোজারিং করার দুর্দান্ত উপায়।

তবে, নিম্নলিখিতটি ভুলভাবে একটি অবজেক্ট, এটি @ বরগি দ্বারা উল্লিখিত একটি সুবিধার মতো, এটি আপনাকে সহায়তা করার জন্য জেএসকে ভুল ব্যাখ্যা করে! অনুমানটি বলছে এটি আক্ষরিক 1 সহ লেবেলযুক্ত "foo" বিবৃতি সহ একটি ব্লক যা কোনও কিছুর জন্য বরাদ্দ করা হয়নি।

{foo:1}

উপরের মত একই হওয়া উচিত

if(1) {
    foo: 1
}

নিম্নলিখিতটি একটি ব্লক হিসাবে সঠিকভাবে চিকিত্সা করা হয় ... কারণ এটির সামনে একটি মন্তব্য আছে!

//magic comment
{foo:1}

সুতরাং এটি:

{foo:1}
//also magic

এটি একটি অবজেক্ট:

{foo:
//not so magic comment
1}

এটি একটি ত্রুটি

//not so magic comment
{foo:1}.foo

সুতরাং এটি:

{foo:1}.foo

্রফ:

1..wat

undefined

সুতরাং এটি:

['foo'][0]

পরেরটি সঠিকভাবে ব্যাখ্যা করা হয় একটি বস্তুর সাথে অভিব্যক্তির অবস্থানের সাথে ঝাঁকুনি দেওয়া হয় 0,যা সাধারণত আমরা কীভাবে নির্বিঘ্নে নিশ্চিত করতে পারি যে একটি বিবৃতি পরিবর্তে আমাদের একটি অভিব্যক্তি আছে।

0,{foo:1}.foo

কেন তারা প্যারেন্সে মানটি মুড়ে দেয় তা আমি পাই না। জেএসের কিছু হাস্যকর ডিজাইনের সিদ্ধান্ত রয়েছে, তবে এই এক পরিস্থিতিতে এটি আরও ভাল আচরণ করার চেষ্টা করা আসলেই কোনও বিকল্প নয়, কনসোলকে জেএসকে সঠিকভাবে চালানো দরকার, এবং আমাদের আত্মবিশ্বাস থাকা দরকার যে ক্রোম কেবল অনুমান করে না যে এটি আমাদের মনে করে যে সত্যিই এটি অন্য কিছু করা বোঝায়।

আপনি যদি কমা অপারেটরদের পছন্দ না করেন আপনি অ্যাসাইনমেন্ট ব্যবহার করতে পারেন

x = {foo:1}.foo

কারণ এটি যেমন দাঁড়িয়ে আছে

{} + {} + {}

"[object Object][object Object][object Object]"

;{} + {} + {}

"NaN[object Object]"

ক্রেজি এবং অবিচ্ছিন্ন আমি এর সাথে ডিল করতে পারি ... ক্রেজি এবং বেমানান আপনাকে ধন্যবাদ না!


একটি REPL ভাষা নয় এটি একটি REPL। এটি অন্যান্য জিনিসের সাথে ভাষাতে স্ট্রিংগুলি পাস করে । ক্রোম আরপিএল ভাষা নিজেই করে না এমন বেশ কয়েকটি জিনিস এখানে রয়েছে । এগুলি বেশ কার্যকর তাই আমি সত্যিই খুশি যে তারা কেবল সরল ভাষার সাথেই লেগেছিল না।
gman

@gman A REPL একটি স্ট্রিং পড়ে, মূল্যায়ন করে, ফলাফলগুলি মুদ্রণ করে এবং তারপরে গতিশীল কোডের পরবর্তী অংশটি পড়ার জন্য প্রস্তুত হয়। লিঙ্কযুক্ত পৃষ্ঠার কিছুই অকার্যকর জাভাস্ক্রিপ্ট ছিল না। "$ _" ভেরিয়েবলটি কনসোল প্রসঙ্গে স্কোপ করা স্পষ্টতই একটি সুবিধাযুক্ত যা কেবল একটি আরপিএলে উপলব্ধি করে। তবুও, "$ _" একটি বৈধ পরিবর্তনশীল নাম, বাকিগুলি কেবলমাত্র সাধারণ ফাংশন এবং ক্লাসগুলি সাধারণ জাভাস্ক্রিপ্ট সহ ডাকা হয়।
জেমস ওয়েকফিল্ড

আপনার পয়েন্ট কি নিশ্চিত না। আমার বক্তব্যটি হল ভাষা একটি জিনিস, এটি পরিবেশ যে পরিবেশে চলে তা অন্যরকম। আপনি আপনার উত্তরে একটি উদাহরণ দিয়েছেন। জেএস {foo:1}এবং {foo:1}//একই জিনিস উত্পাদন। Chrome JS REPL এ তারা দেয় না। আরপিএল কেবল জেএসকে মূল্যায়ন করার চেয়ে আরও বেশি কিছু করছে। এটি স্ট্রিংগুলি প্রক্রিয়াজাত করছে এবং বিভিন্ন জিনিস স্থির করছে।
gman

var x = eval('{a:1}')বৈধ জাভাস্ক্রিপ্টে x এখন 1, আরও স্বজ্ঞাত বস্তু নয় {a: 1}} হ্যাঁ, এটি অদ্ভুত, তবে আপনি কেবল ভাষা পরিবর্তন করতে পারবেন না কারণ এটি অদ্ভুত জিনিসগুলি করে। জেএসএন স্ট্রিং ব্যতীত অন্য সমস্ত কিছুই জাভাস্ক্রিপ্ট হিসাবে ব্যাখ্যা করা হয় এবং মূল্যায়ন করা হয়। 0,JSON পেস্ট করার আগে টাইপ করা কঠিন নয়, বিকল্প হিসাবে আমি একটি সতর্কতার সাথে খুশি হব যে স্ট্রিংটি সুবিধার্থে জাভাস্ক্রিপ্টের পরিবর্তে কোনও বস্তু হিসাবে ব্যাখ্যা করা হয়েছিল।
জেমস ওয়েকফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.