diff --git a/dist/amd/aurelia-binding.js b/dist/amd/aurelia-binding.js index 5ea8aa2f..bb4bfe4b 100644 --- a/dist/amd/aurelia-binding.js +++ b/dist/amd/aurelia-binding.js @@ -1504,7 +1504,7 @@ define(['exports', 'aurelia-logging', 'aurelia-pal', 'aurelia-task-queue', 'aure AccessMember.prototype.evaluate = function evaluate(scope, lookupFunctions) { var instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; }; AccessMember.prototype.assign = function assign(scope, value) { diff --git a/dist/aurelia-binding.js b/dist/aurelia-binding.js index d9647461..f275a8f9 100644 --- a/dist/aurelia-binding.js +++ b/dist/aurelia-binding.js @@ -1440,7 +1440,7 @@ export class AccessMember extends Expression { evaluate(scope, lookupFunctions) { let instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; } assign(scope, value) { diff --git a/dist/commonjs/aurelia-binding.js b/dist/commonjs/aurelia-binding.js index 8d93f108..396ccaa2 100644 --- a/dist/commonjs/aurelia-binding.js +++ b/dist/commonjs/aurelia-binding.js @@ -1457,7 +1457,7 @@ var AccessMember = exports.AccessMember = function (_Expression7) { AccessMember.prototype.evaluate = function evaluate(scope, lookupFunctions) { var instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; }; AccessMember.prototype.assign = function assign(scope, value) { diff --git a/dist/es2015/aurelia-binding.js b/dist/es2015/aurelia-binding.js index 1014f804..78789217 100644 --- a/dist/es2015/aurelia-binding.js +++ b/dist/es2015/aurelia-binding.js @@ -1332,7 +1332,7 @@ export let AccessMember = class AccessMember extends Expression { evaluate(scope, lookupFunctions) { let instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; } assign(scope, value) { diff --git a/dist/native-modules/aurelia-binding.js b/dist/native-modules/aurelia-binding.js index 04cbaa22..db1c0d6e 100644 --- a/dist/native-modules/aurelia-binding.js +++ b/dist/native-modules/aurelia-binding.js @@ -1419,7 +1419,7 @@ export var AccessMember = function (_Expression7) { AccessMember.prototype.evaluate = function evaluate(scope, lookupFunctions) { var instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; }; AccessMember.prototype.assign = function assign(scope, value) { diff --git a/dist/system/aurelia-binding.js b/dist/system/aurelia-binding.js index 0be4aa27..5b7ccc8a 100644 --- a/dist/system/aurelia-binding.js +++ b/dist/system/aurelia-binding.js @@ -1859,7 +1859,7 @@ System.register(['aurelia-logging', 'aurelia-pal', 'aurelia-task-queue', 'aureli AccessMember.prototype.evaluate = function evaluate(scope, lookupFunctions) { var instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; }; AccessMember.prototype.assign = function assign(scope, value) { diff --git a/src/ast.js b/src/ast.js index 46184cfc..71b4bbbf 100644 --- a/src/ast.js +++ b/src/ast.js @@ -250,7 +250,7 @@ export class AccessMember extends Expression { evaluate(scope, lookupFunctions) { let instance = this.object.evaluate(scope, lookupFunctions); - return instance === null || instance === undefined ? instance : instance[this.name]; + return instance === null || instance === undefined ? undefined : instance[this.name]; } assign(scope, value) { diff --git a/test/ast/access-member.spec.js b/test/ast/access-member.spec.js index ac618789..3fef5616 100644 --- a/test/ast/access-member.spec.js +++ b/test/ast/access-member.spec.js @@ -21,14 +21,14 @@ describe('AccessMember', () => { it('assigns member on bindingContext', () => { let scope = createScopeForTest({ foo: { bar: 'baz' } }); - expression.assign(scope, 'bang') + expression.assign(scope, 'bang'); expect(scope.bindingContext.foo.bar).toBe('bang'); }); it('assigns member on overrideContext', () => { let scope = createScopeForTest({}); scope.overrideContext.foo = { bar: 'baz' }; - expression.assign(scope, 'bang') + expression.assign(scope, 'bang'); expect(scope.overrideContext.foo.bar).toBe('bang'); }); @@ -36,4 +36,20 @@ describe('AccessMember', () => { let scope = createScopeForTest({ foo: { bar: 'baz' } }); expect(expression.assign(scope, 'bang')).toBe('bang'); }); + + it('returns `undefined` for a non-existing member of `null` object', () => { + let scope = createScopeForTest({ foo: null }); + expect(expression.evaluate(scope, null)).toBeUndefined(); + }); + + it('returns `undefined` for a non-existing member of `undefined` object', () => { + let scope = createScopeForTest({ foo: undefined }); + expect(expression.evaluate(scope, null)).toBeUndefined(); + }); + + it('returns `undefined` for a non-existing member of non-existing object', () => { + let scope = createScopeForTest({}); + expect(expression.evaluate(scope, null)).toBeUndefined(); + }); + });