जावास्क्रिप्ट में अपरिभाषित क्यों नहीं अपरिहार्य है?


59

एमडीएन के दस्तावेज केundefined अनुसार :

आधुनिक ब्राउज़रों (जावास्क्रिप्ट 1.8.5 / फ़ायरफ़ॉक्स 4+) में, अपरिभाषित ईसीएमएस्क्रिप्ट 5 विनिर्देश के अनुसार एक गैर-विन्यास योग्य, गैर-लेखन योग्य संपत्ति है। यहां तक ​​कि जब यह मामला नहीं है, तब भी इसे ओवरराइड करने से बचें।

अपरिभाषित की संपत्ति विशेषताओं में से एक यह है कि यह लेखन योग्य नहीं है।

लेकिन अगर मैं:

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

इसका मतलब यह है कि मैं के मूल्य को अधिलेखित कर सकते हैं undefined? अगर कोई ऐसा करता है तो क्या होता है? क्या जावास्क्रिप्ट को इसके बारे में चेतावनी देनी चाहिए?


5
क्या आप हमें बता सकते हैं कि आप किस ब्राउज़र का उपयोग करते हैं? (लिनक्स 72.0b10 (64 बिट्स) लिनक्स पर काम करता है typeof test === "undefined")
जोंताजैनो

3
@DmitryReutov सामान्य परिस्थितियों में typeof undefinedलौटता "undefined"है।
एमी

3
@DmitryReutov बेशक "undefined"एक स्ट्रिंग है। सवाल यह नहीं पूछ रहा है कि typeof (typeof undefined)किसका मूल्यांकन किया जाए। यह पूछ रहा है कि क्या typeof undefinedमूल्यांकन करता है। यह लौटता है "undefined", नहीं"string"
एमी

2
@DmitryReutov 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);

यदि आप कोड लिख रहे हैं, जहाँ आप इसे नियंत्रित नहीं कर सकते हैं जहाँ इसे निष्पादित किया जाएगा (जैसे पुस्तकालय, एम्बेड, आदि) यह एक IIFE का उपयोग करने के लिए एक अच्छा पैटर्न है जो इसे बनाता है ताकि आप गारंटी दे सकें कि अपरिभाषित हमेशा सही / उपयोगी होगा। यहाँ एक उदाहरण है:

(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.0b10 (64 बिट्स) का उपयोग करके किए गए थे, और पहले स्निपेट का परिणाम पुराने ब्राउज़र पर भिन्न हो सकता है।


3
@pmiranda मेरा नहीं, इसे बहुत दिलचस्प लगा
jonatjano

2
एक बार फिर धन्यवाद। यह सब संदेह इस में एक मूल है: यहां एक नया डेवलपर अंग्रेजी में कुछ स्पेनिश नाम चर का अनुवाद कर रहा था। हमारे कोड में, हमारे पास एक वैरिएबल था जिसे let indefinido= dataArray( (a) => (anotherArray.includes(someName)));हम जांच रहे थे कि क्या वह संस्करण 'अपरिभाषित' था ( findबिना किसी तत्व के परिणाम के) या नहीं। फिर उसने अनुवाद indefinidoकिया undefinedकि मैंने देखा कि मैं इसे क्रोम और एज पर परीक्षण करता हूं, कुछ अंतर देखकर। इसलिए मैं यहां बाकी लोगों की राय पूछने आया था, क्योंकि मैं भी सीख रहा हूं।
पीरंदंदा

@pmiranda यह उत्तर "क्यों" भाग का कड़ाई से उत्तर नहीं देता है। लेकिन यह एक अच्छा जवाब है।
इस्माइल मिगुएल

2
यदि आप अपरिभाषित के वास्तविक मूल्य की आवश्यकता को समाप्त करते हैं, तो उपयोग करेंvoid 0
उपयोगकर्ता है कि एक उपयोगकर्ता नहीं है

2
@Jon क्योंकि कुछ कारणों से एकैस्मार्क कंसोर्टियम ने एक अनिर्दिष्ट आरक्षित शब्द नहीं बनाने के लिए धोखा दिया, लेकिन वैश्विक वस्तु की एक संपत्ति
jonatjano

17

हालांकि इसे वैश्विक दायरे के अलावा किसी भी दायरे में पहचानकर्ता (परिवर्तनशील नाम) के रूप में उपयोग करना संभव है (क्योंकि अपरिभाषित एक आरक्षित शब्द नहीं है), ऐसा करना एक बहुत बुरा विचार है जो आपके कोड को बनाए रखने और डिबग करने में मुश्किल बना देगा।

स्रोत https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

undefinedहै आरक्षित नहीं इसलिए यह यह एक नया मान देना संभव है।

जब आप उपयोग नहीं कर रहे हैं तो आप strict modeअनिवार्य रूप undefinedसे स्थानीय दायरे में बुलाया एक चर बना रहे हैं और इसके लिए एक stringमूल्य प्रदान कर रहे हैं।

undefinedवैश्विक वस्तु का एक गुण है । अपरिभाषित का प्रारंभिक मूल्य आदिम मूल्य हैundefined

use strict वैश्विक दायरे में इस गलती को रोकने में मदद करेगा, जबकि यह अभी भी स्थानीय दायरे में लिखा जा सकता है।

यदि आप अधिक सुरक्षित रहना चाहते हैं, तो आपको इसका उपयोग करना चाहिए जिसके void 0बजाय undefinedहमेशा वापस लौटना चाहिए undefined

'use stict'

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


1
यहाँ अधिक विवरण के लिए एक खोजशब्द सूची है
jonatjano

1
इस बात पर ध्यान देने योग्य कि इस तरह के IIFE undefinedमें एक तर्क के रूप में इसे पढ़कर एक संदर्भ भी मिल सकता है। चूंकि IIFE को कभी भी कोई तर्क नहीं दिया जाता है क्योंकि वे इसके undefinedभीतर होंगे । जैसे((undefined) => console.log(typeof undefined))()
सीनोप्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.