diff --git a/packages/common/src/pipes/async_pipe.ts b/packages/common/src/pipes/async_pipe.ts index a671a0ec3d..6ff3db2cd8 100644 --- a/packages/common/src/pipes/async_pipe.ts +++ b/packages/common/src/pipes/async_pipe.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef, EventEmitter, Injectable, OnDestroy, Pipe, PipeTransform, WrappedValue, ɵisObservable, ɵisPromise} from '@angular/core'; +import {ChangeDetectorRef, EventEmitter, Injectable, OnDestroy, Pipe, PipeTransform, WrappedValue, ɵisObservable, ɵisPromise, ɵlooseIdentical} from '@angular/core'; import {Observable, SubscriptionLike} from 'rxjs'; import {invalidPipeArgumentError} from './invalid_pipe_argument_error'; @@ -103,7 +103,7 @@ export class AsyncPipe implements OnDestroy, PipeTransform { return this.transform(obj as any); } - if (this._latestValue === this._latestReturnedValue) { + if (ɵlooseIdentical(this._latestValue, this._latestReturnedValue)) { return this._latestReturnedValue; } diff --git a/packages/common/test/pipes/async_pipe_spec.ts b/packages/common/test/pipes/async_pipe_spec.ts index 20babf8a9d..c7517144aa 100644 --- a/packages/common/test/pipes/async_pipe_spec.ts +++ b/packages/common/test/pipes/async_pipe_spec.ts @@ -82,6 +82,18 @@ import {SpyChangeDetectorRef} from '../spies'; async.done(); }, 10); })); + + it('should return unwrapped value for unchanged NaN', () => { + const emitter = new EventEmitter(); + emitter.emit(null); + pipe.transform(emitter); + emitter.next(NaN); + const firstResult = pipe.transform(emitter); + const secondResult = pipe.transform(emitter); + expect(firstResult instanceof WrappedValue).toBe(true); + expect((firstResult as WrappedValue).wrapped).toBeNaN(); + expect(secondResult).toBeNaN(); + }); }); describe('ngOnDestroy', () => {