জাভাস্ক্রিপ্ট ফাংশন এবং ডিফল্ট পরামিতি, আইই এবং ক্রোমে কাজ করছে না


103

আমি এই জাতীয় একটি ফাংশন তৈরি করেছি:

function saveItem(andClose = false) {

}

এটি ফায়ারফক্সে দুর্দান্ত কাজ করে

আইইতে এটি কনসোলটিতে এই ত্রুটি দেয়: Expected ')'

ক্রোমে এটি কনসোলে এই ত্রুটিটি দেয়: Uncaught SyntaxError: Unexpected token =

উভয় ব্রাউজারই ত্রুটিটির উত্সটিকে ফাংশন তৈরির লাইন হিসাবে চিহ্নিত করে।


অ্যান্ড্রয়েড স্টক ব্রাউজার এখানে 5.1.1, একই সমস্যা।
জেসি

উত্তর:


155

আপনি এটি করতে পারবেন না তবে আপনি এর পরিবর্তে এমন কিছু করতে পারেন:

function saveItem(andClose) {
   if(andClose === undefined) {
      andClose = false;
   }
}

এটি প্রায়শই এরকম কিছুতে সংক্ষিপ্ত করা হয়:

function setName(name) {
  name = name || 'Bob';
}

হালনাগাদ

উপরে ECMAScript <= 5 এর ক্ষেত্রে সত্য true ES6 ডিফল্ট পরামিতিগুলির প্রস্তাব করেছে । সুতরাং উপরের পরিবর্তে পড়তে পারে:

function setName(name = 'Bob') {}

14
এটি আইই ১১ এবং এর অধীনে কার্যকর, যা ইএস 6 প্রয়োগ করে না এবং ডিফল্ট পরামিতিগুলিতে বিরতি দেয়।
ইরান গোল্ডিন

4
ধন্যবাদ !! জানতাম না! আইআই সফল হয় তবে বিকাশকারীদের "নন" ব্রাউজার সমর্থন করা ছাড়া অন্য কোনও পছন্দ নেই।
ফ্র0zenFyr

4
name = name || 'Bob';ব্যবহার করা উচিত নয় কারণ নামটি মিথ্যা মান হিসাবে সেট করা থাকলে নামের পরিবর্তে ডিফল্টটি ব্যবহৃত হবে
জেরার্ড সিম্পসন

10
name = name || 'Bob'ব্যবহারের পরিবর্তেname = (name === undefined) ? '' : name;
ব্রায়ান

4
@ জুকো আমি বুঝতে পারি না "আপনি এটি করতে পারবেন না" - মজিলা এমডিএন বলছে আমরা পারি? বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / আপনি কি কেবলই বলছেন যে আপনি এটি আইতে করতে পারবেন না বা আপনি মোজিলা ডক্সকে ভুল বলে দিচ্ছেন?
পিএইচপি-বি-গ্রেডার

14

এটি কোনও বৈধ ECMAScript সিনট্যাক্স নয়, তবে মোজিলার সুপারসেটের বৈশিষ্ট্যগুলির জন্য তারা ভাষাটি কার্যকর করার ক্ষেত্রে এটি একটি বৈধ বাক্য গঠন।

ডিফল্ট প্যারামিটার অ্যাসাইনমেন্ট সিনট্যাক্স সম্ভবত ECMAScript 6 এ আসছে।


4
ঠিক আছে, তাই জাভাস্ক্রিপ্ট ফাংশনগুলিতে ডিফল্ট মান নির্ধারণের সেরা উপায় কী?
টালন

4
@ ট্যালন: সর্বোত্তম উপায় আপনার পরিস্থিতির উপর নির্ভর করে। যদি আপনি জানেন যে যুক্তিটি মিথ্যা হবে না, আপনি এটি করতে পারেন foo = foo || "the default"। অথবা আপনি কি পরীক্ষা করতে পারবেন .lengthএর argumentsঅবজেক্ট। অথবা আপনি প্রতিটি প্যারামিটারের জন্য পরীক্ষা করতে পারেন undefined। প্রতিটি ব্যবহারের জন্য বিভিন্ন অনুষ্ঠান আছে।
সিস্টেম

8

জাভাস্ক্রিপ্ট কোনও "ডিফল্ট" নির্দিষ্টকারীকে অনুমতি দেয় না।

আপনি যা চান তা করার একটি দ্রুত উপায় হল:

function saveItem(andClose = false) {

}

পরবর্তী:

function saveItem(andClose) {
    // this line will check if the argument is undefined, null, or false
    // if so set it to false, otherwise set it to it's original value
    var andClose = andClose || false;

    // now you can safely use andClose
    if (andClose) {
        // do something
    }
}

4
এটি andCloseমিথ্যা হিসাবে সেট হবে এটি 0 ছিল ... আমি যা করবো তা প্রত্যাশা করা ঠিক নয় ...
জিডোরন মনিকা

@gdoron এই দেখুন: stackoverflow.com/questions/7615214/... এই quirks আপনি আপনি ব্যবহার কোনো ভাষা সম্পর্কে জানতে প্রয়োজন।
জেরোমেরো

একটি বিকল্প হ'ল তৃতীয় লাইনটি এটি পরিবর্তন করে var andClose = andClose === undefined? false: andClose;যা আপনাকে 0ফাংশনে যেতে সক্ষম করবে এবং এটির সাথে প্রতিস্থাপন করবে না false
ম্যাক্স হাইবার

2

আপনার প্রদত্ত কোডটি Chrome <সংস্করণ 49: https://kangax.github.io/compat-table/es6/#test-default_function_paraters এ চলবে না

আপনি বৈধ ECMAScript 2015 সিনট্যাক্স ব্যবহার করেছেন:

আমার মতে, সবচেয়ে ভালো উপায় ES2015 বৈশিষ্ট্য ব্যবহারের সঙ্গে সম্পদের বান্ডেল হয় Browserify বা WebPack ব্যবহার করার জন্য ধাপে সঙ্গে, হট্টগোল ES5 করতে ট্রান্স-কম্পাইল ES2015 করতে। এইভাবে আপনাকে সেই ES2015 ব্রাউজারের সামঞ্জস্যতা চার্ট সম্পর্কে চিন্তা করতে হবে না। এটি প্রথমবার শুরু করার জন্য ব্যথা, তবে এটির জন্য মূল্যবান।


1

আপনার ক্ষেত্রে, আপনার ভেরিয়েবলটি বুলিয়ান কিনা তা নিশ্চিত হওয়ার জন্য আপনার কাছে অন্য একটি বিকল্প রয়েছে:

function saveItem(andClose) {
  var andClose = true == andClose;
  // ...
}

ডিফল্ট মান undefinedএবং true == undefined=> হয় false, তাই আপনার ডিফল্ট মান হবে false:)


একটি ছোটখাটো সামঞ্জস্যতা andCloseহ'ল ভেরিয়াল ডিক্লেয়ারেশন সরিয়ে ফেলা হবে কারণ ভেরিয়েবলটি ইতিমধ্যে এই সুযোগে নির্ধারিত হয়েছে
বেন সেওয়ার্ডস

আপনি যদি সত্যিই নিশ্চিত হয়ে andClose = true === andClose;
উঠতে

আপনি উভয়ই ঠিক বলেছেন :)
সিড্রিক ট্যাল্পার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.