javascript angularjs - {{अपरिभाषित+संख्या}}रिटर्न नंबर क्यों है?




tutorial pdf (3)

AngularJS कोड को संदर्भित करके समझाने के लिए, यह जादू है:

function plusFn(l, r) {
  if (typeof l === 'undefined') return r;
  if (typeof r === 'undefined') return l;
  return l + r;
}

यदि आपके पास "प्लस" अभिव्यक्ति है, तो यह फ़ंक्शन आपके टेम्पलेट में पार्स किया गया है।

अभिव्यक्ति प्रतिस्थापन Parser.parse (angular.js: 16155) या parse.js: 1646 ( https://github.com/angular/angular.js/blob/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d/src/ng/parse.js#L1646 ) द्वारा लगाया जाता है। https://github.com/angular/angular.js/blob/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d/src/ng/parse.js#L1646 )।

मैं एक AngularJS प्रोजेक्ट पर काम कर रहा हूं। मैंने देखा कि निम्नलिखित अभिव्यक्ति एक संख्या लौटाती है।

दृश्य में, {{undefined + 10}} 10 आउटपुट देगा।

जावास्क्रिप्ट में, undefined + 10 NaN का उत्पादन करेगा।

एक नज़र में यह व्यवहार अलग क्यों है?


यह अंतर प्रक्षेप का लाभ है।

एम्बेडेड अभिव्यक्तियों के साथ इंटरपोलेशन मार्कअप का उपयोग अंगुलरजेएस द्वारा पाठ नोड्स और विशेषता मानों को डेटा-बाइंडिंग प्रदान करने के लिए किया जाता है।

यदि प्रक्षेपित मान स्ट्रिंग नहीं है, तो यह निम्नानुसार गणना की जाती है:

  • अपरिभाषित और अशक्त '' (खाली स्ट्रिंग) में परिवर्तित हो जाते हैं
  • यदि मान एक ऑब्जेक्ट है जो संख्या, दिनांक या एरे नहीं है, तो $interpolate ऑब्जेक्ट पर कस्टम toString() फ़ंक्शन के लिए दिखता है, और इसका उपयोग करता है।
  • यदि ऊपर लागू नहीं होता है, तो JSON.stringify का उपयोग किया जाता है।

रनटाइम के दौरान कंपाइलर $interpolate सेवा का उपयोग यह देखने के लिए करता है कि टेक्स्ट नोड्स और एलिमेंट विशेषताओं में एम्बेडेड एक्सप्रेशंस के साथ इंटरपोलेशन मार्कअप है या नहीं।

इसके अलावा, कोणीय कंपाइलर मॉडल परिवर्तनों को सुनने के लिए interpolateDirective और रजिस्टरों पर नजर रखने वालों का उपयोग करता interpolateDirective । यह पाचन चक्र की प्रक्रिया है।

यह समझने के लिए here पढ़ें कि प्रक्षेप कैसे काम करता है।

क्यों {{'' == +Infinity}} रिटर्न सही है?

AngularJS में, $interpolate सेवा 0 मूल्य के लिए +Infinity का मूल्यांकन करती है।

angular.module('app', [])

.controller('Controller', ['$injector', function($injector) {

}]);
setTimeout(function() {
  angular.bootstrap(document.getElementById('body'), ['app']);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<div id="body">
  <div ng-controller="Controller">
    {{+Infinity}}
  </div>
</div>

अब अभिव्यक्ति {{0==''}}

क्यों 0=='' का मूल्यांकन true ?

लेफ्ट साइड टाइप Number । दाईं ओर टाइप String

इस स्थिति में, सही ऑपरेंड टाइप संख्या के लिए बाध्य है:

0 == Number('') => 0 == 0,

जिसका मूल्यांकन true बूलियन मूल्य के लिए किया जाता true

यहाँ अमूर्त समानता तुलना एल्गोरिथ्म लागू किया जाता है।

यदि टाइप (x) नंबर है और टाइप (y) स्ट्रिंग है, तो तुलना x == ToNumber (y) का परिणाम लौटाएं।


आम तौर पर, आपका पहला विकल्प ( preventDefault() ) लेने वाला है, लेकिन आपको यह जानना होगा कि आप किस संदर्भ में हैं और आपके लक्ष्य क्या हैं।

ईंधन आपके कोडिंग में return false; पर एक महान लेख है return false; बनाम event.preventDefault() बनाम event.stopPropagation() बनाम event.stopImmediatePropagation()

नोट: उपरोक्त ईंधन आपका कोडिंग लिंक काफी समय से 5xx त्रुटियों का उत्पादन कर रहा है। मुझे इंटरनेट आर्काइव में इसकी प्रतिलिपि मिली है, इसे पीडीएफ में मुद्रित किया गया है, और इसे ड्रॉपबॉक्स में रखा गया है: return false; संग्रहीत लेख return false; बनाम event.preventDefault() बनाम event.stopPropagation() बनाम event.stopImmediatePropagation() (पीडीएफ)







javascript angularjs