জাভাস্ক্রিপ্টে অপরিজ্ঞাত লিখিতযোগ্য নয় কেন?


59

এমডিএন এর ডকুমেন্টেশনundefined অনুসারে :

আধুনিক ব্রাউজারগুলিতে (জাভাস্ক্রিপ্ট ১.৮.৫ / ফায়ারফক্স 4+), ইসিমাস্ক্রিপ্ট 5 স্পেসিফিকেশন অনুযায়ী অপ-সংজ্ঞায়িত একটি অ-কনফিগারযোগ্য, অ-লিখনযোগ্য সম্পত্তি। এমনকি এটি যখন না হয় তখনও এটিকে ওভাররাইড করা এড়িয়ে চলুন।

সম্পত্তি এক বৈশিষ্ট্যাবলী অনির্ধারিত যে লিখনযোগ্য নয়।

তবে আমি যদি:

var undefined = 'hello';
var test = undefined;
console.log(typeof test);
//string

তার মানে কি আমি এর মানটি ওভাররাইট করতে পারি undefined? কেউ যদি তা করে তবে কি হবে? জাভাস্ক্রিপ্ট এর সম্পর্কে সতর্ক করা উচিত?


5
আপনি কোন ব্রাউজার ব্যবহার করবেন তা আমাদের বলতে পারেন? (ফায়ারফক্স 72.0b10 (10৪ বিট) লিনাক্স অনুসারে কাজ করে typeof test === "undefined")
jonatjano

3
@ দিমিত্রিউতভ সাধারণ পরিস্থিতিতে typeof undefinedফিরে আসেন "undefined"
অ্যামি

3
@ দিমিত্রিআউটভ অবশ্যই "undefined"একটি স্ট্রিং। প্রশ্নটি কোনটি typeof (typeof undefined)মূল্যায়ন করে তা জিজ্ঞাসা করছে না । এটি জিজ্ঞাসা করছে যা typeof undefinedমূল্যায়ন করে। এটি ফিরে আসে "undefined", না"string"
এমি

2
@ দিমিত্রিআউটোভ typeof ______এমন একটি অভিব্যক্তি যা এর ধরণের স্ট্রিংয়ের সাথে মূল্যায়ন করে ______। আপনি প্রশ্নটি ভুল বুঝছেন।
অ্যামি

3
@ অ্যামি আমি জানি, তবে এজ "স্ট্রিং" এবং ক্রোম "অপরিজ্ঞাত" ফিরে এসেছে
অ্যালন এটান ২ '

উত্তর:


50

অ্যামির একটি সরানো মন্তব্য সমাধান দেয়। আপনি নামের সাথে একটি ভেরিয়েবল তৈরি করছেন undefinedএবং আপনি যদি বিশ্বব্যাপী স্নিপেটগুলি করেন তবে এটি কার্যকর হয় না:

var undefined = 'hello';
var test = undefined;
console.log(typeof test);

তবে এটি কার্যকরভাবে কার্যকর হয় যদি আপনি এটি এমন একটি স্থানীয় সুযোগে করেন যেখানে অপরিজ্ঞাত বিশ্বব্যাপী পরিবর্তনশীলকে আর উল্লেখ করে না:

(()=>{
  var undefined = 'hello';
  var test = undefined;
  console.log(typeof test);
})()

এই ভুল রোধ করতে, আপনি 'use strict';নির্দেশটি ব্যবহার করতে পারেন :

'use strict';
var undefined = 'hello';
var test = undefined;
console.log(typeof test);

আপনি যদি কোডটি লিখতে থাকেন যেখানে এটি কার্যকর করা হবে যেখানে আপনি নিয়ন্ত্রণ করতে পারবেন না (যেমন গ্রন্থাগার, এম্বেড ইত্যাদি) এটি আইআইএফই ব্যবহার করা ভাল প্যাটার্ন যা এটি তৈরি করে যাতে আপনি গ্যারান্টি দিতে পারেন যে অপরিবর্তিত সর্বদা সঠিক / ব্যবহারযোগ্য হবে। এখানে একটি উদাহরণ:

(function(undefined){
  // undefined will equal `undefined` because we didn't pass in an argument to the IIFE
  
  console.log(undefined); // always `undefined`, even if undefined !== `undefined`outside of the IIFE scope
})(); // No argument supplied


আমার সমস্ত পরীক্ষাগুলি উবুন্টুতে ফায়ারফক্স 72২.০ বি ১০ (b৪ বিট) ব্যবহার করে তৈরি হয়েছিল এবং প্রথম স্নিপেটের ফলাফলটি কোনও পুরানো ব্রাউজারে পৃথক হতে পারে।


3
@ পিপিআরন্দা আমার নয়, এটি খুব আকর্ষণীয় বলে মনে হয়েছে
জোনাটজানো

2
আবার ধন্যবাদ. এই সমস্ত সন্দেহের মূল কারণ: এখানে একটি নতুন বিকাশকারী কিছু স্প্যানিশ নাম ভেরিয়েবলগুলি ইংরেজিতে অনুবাদ করছিলেন। আমাদের কোডে, আমাদের একটি ভেরিয়েবল বলা let indefinido= dataArray( (a) => (anotherArray.includes(someName)));হয়েছিল যা আমরা পরীক্ষা করে যাচ্ছিলাম যে ভেরটি 'অপরিজ্ঞাত' ছিল ( findকোনও উপাদান খুঁজে পাওয়া যায়নি ফলাফল) বা না পাওয়া গেছে। তারপরে তিনি অনুবাদ indefinidoকরেছিলেন undefinedআমি দেখেছি যে আমি কিছুটা পার্থক্য দেখে Chrome এবং এজ এ এটি পরীক্ষা করে দেখছি। এই কারণেই আমি এখানে এসে বাকিদের মতামত জানতে এসেছি, কারণ আমিও শিখছি।
সন্ধ্যা

@ pmiranda এই উত্তরটি "কেন" অংশটির কঠোরভাবে উত্তর দেয় না। তবে এটি একটি ভাল উত্তর।
ইসমাইল মিগুয়েল

2
যদি আপনার অবধারিতের আসল মানটির প্রয়োজন হয় তবে ব্যবহার করুনvoid 0
ব্যবহারকারী যা ব্যবহারকারী নয়

2
@ জন কারণ যে কোনও কারণে ইকোমাস্ক্রিপ্ট কনসোর্টিয়াম অপরিজ্ঞাতকৃত সংরক্ষিত কীওয়ার্ড না করে বৈশ্বিক বস্তুর সম্পত্তি হিসাবে বেছে নেওয়ার সিদ্ধান্ত
নিয়েছিল

17

যদিও এটি বৈশ্বিক সুযোগ ব্যতীত অন্য যে কোনও স্কোপে সনাক্তকারী (পরিবর্তনশীল নাম) হিসাবে ব্যবহার করা সম্ভব, যদিও এটি করা খুব খারাপ ধারণা যা আপনার কোডটি বজায় রাখা এবং ডিবাগ করা কঠিন করে তুলবে।

উত্স https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / অপরিবর্তিত

undefinedহয় সংরক্ষিত না অত: পর তা একটি নতুন মান নির্ধারণ করা সম্ভব।

আপনি যখন ব্যবহার করছেন না তখন আপনি strict modeপ্রয়োজনীয়ভাবে undefinedস্থানীয় স্কোপে ডাকা একটি ভেরিয়েবল তৈরি করে এর stringজন্য একটি মান নির্ধারণ করে যাচ্ছেন ।

undefinedবিশ্বব্যাপী বস্তুর বৈশিষ্ট্য । অপরিবর্তিতের প্রাথমিক মান হ'ল আদি মানundefined

use strict এই ভুলটিকে বিশ্বব্যাপী সুযোগে রোধ করতে সহায়তা করবে যখন এটি স্থানীয় স্কোপতে এখনও ওভাররাইট করা যেতে পারে।

আপনি যদি আরও সুরক্ষিত থাকতে চান তবে সর্বদা ফিরে আসার void 0পরিবর্তে আপনার ব্যবহার করা উচিত ।undefinedundefined

'use stict'

const test = (() => {
  let undefined = "test"
  console.log(typeof undefined)
  console.log(typeof void 0)
})()


1
এখানে কীওয়ার্ড তালিকার মধ্যে আরো বিস্তারিত জানার জন্য
jonatjano

1
উল্লেখযোগ্য যে এই জাতীয় আইআইএফই-তে undefinedকোনও একটি আর্গুমেন্ট হিসাবে এটি পড়ার মাধ্যমে একটি রেফারেন্সও পেতে পারে। আইআইএফই এখানে কখনই কোনও যুক্তি পাস না করে তারা এর undefinedমধ্যে থাকবে। যেমন((undefined) => console.log(typeof undefined))()
SeinopSys
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.