javascript - شرح - angular{{




لماذا{{undefined+number}} يقوم بإرجاع الرقم؟ (2)

للتوضيح عن طريق الرجوع إلى رمز 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 ).

أنا أعمل على مشروع AngularJS. لقد لاحظت أن التعبير التالي يُرجع رقمًا.

في المشاهدة ، {{undefined + 10}} سينتج 10.

في جافا سكريبت ، سيتم إخراج undefined + 10 NaN .

لماذا هذا السلوك مختلف في الرأي؟


هذه هي ميزة الاستيفاء.

يستخدم AngularJS علامة الاستيفاء مع التعبيرات المضمنة لتوفير ربط البيانات إلى العقد النصية وقيم السمة.

إذا لم تكن القيمة المحرف سلسلة ، يتم حسابها على النحو التالي:

  • غير معرف ويتم تحويله إلى "فارغ" (سلسلة فارغة)
  • إذا كانت القيمة عبارة عن كائن ليس رقمًا أو تاريخًا أو صفيفًا ، يبحث $interpolate عن دالة toString() مخصصة على الكائن ويستخدم ذلك.
  • إذا لم ينطبق ما سبق ، JSON.stringify استخدام JSON.stringify .

أثناء وقت التشغيل ، يستخدم برنامج التحويل البرمجي خدمة $interpolate لمعرفة ما إذا كانت العقد النصية وسمات العنصر تحتوي على علامة الاستيفاء مع التعبيرات المضمنة.

أيضا ، استخدام المترجم الزاوي interpolateDirective ويسجل المراقبين من أجل الاستماع لتغيرات النموذج. هذه هي عملية دورة الهضم.

اقرأ المزيد here لفهم كيفية عمل الاستيفاء.

لماذا {{'' == +Infinity}} يعود صحيحًا؟

في AngularJS ، تقوم خدمة $interpolate بتقييم +Infinity قيمة +Infinity إلى 0 .

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 .

هنا يتم تطبيق الخوارزمية مقارنة المساواة في الخلاصة .

إذا كان النوع (س) هو الرقم والنوع (ص) عبارة عن سلسلة ، فأرجع نتيجة المقارنة x == ToNumber (y).







angularjs