validar - variable undefined javascript




¿Por qué{{undefined+number}} devuelve el número? (2)

Estoy trabajando en un proyecto AngularJS. Noté que la siguiente expresión devuelve un número.

En la vista, {{undefined + 10}} generará 10.

En JavaScript, undefined + 10 emitirá NaN .

¿Por qué este comportamiento es diferente en una vista?


Esa es la ventaja de la interpolación.

AngularJS utiliza el marcado de interpolación con expresiones incrustadas para proporcionar enlace de datos a nodos de texto y valores de atributo.

Si el valor interpolado no es una cadena, se calcula de la siguiente manera:

  • undefined y null se convierten a '' (cadena vacía)
  • Si el valor es un objeto que no es un Número, Fecha o Arreglo, $interpolate busca una función toString() en el objeto, y la utiliza.
  • Si no se aplica lo anterior, se utiliza JSON.stringify .

Durante el tiempo de ejecución, el compilador usa el servicio $interpolate para ver si los nodos de texto y los atributos de los elementos contienen marcas de interpolación con expresiones incrustadas.

Además, el compilador angular utiliza un interpolateDirective y registra a los observadores para escuchar los cambios del modelo. Ese es el proceso del ciclo digestivo.

Lea más here para comprender cómo funciona la interpolación.

¿Por qué {{'' == +Infinity}} devuelve verdadero?

En AngularJS, el servicio $interpolate evalúa +Infinity valor +Infinity a 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>

Ahora la expresión permanece {{0==''}} .

¿Por qué 0=='' se evalúa como true ?

El lado izquierdo es de tipo Number . El lado derecho es de tipo String .

En este caso, el operando derecho se obliga al tipo Número:

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

que se evalúa a valor booleano true .

Aquí se aplica el algoritmo de comparación de igualdad abstracta .

Si el Tipo (x) es Número y el Tipo (y) es Cadena, devuelva el resultado de la comparación x == ToNumber (y).


Para explicar haciendo referencia al código de AngularJS, esta es la magia:

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

Si tiene una expresión "más", esta función se analiza en su plantilla.

El reemplazo de la expresión es invocado por Parser.parse (angular.js: 16155) o parse.js: 1646 ( https://github.com/angular/angular.js/blob/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d/src/ng/parse.js#L1646 cppp / cpp / cpcp / cp7pc) https://github.com/angular/angular.js/blob/87a586eb9a23cfd0d0bb681cc778b4b8e5c8451d/src/ng/parse.js#L1646 ).





angularjs