ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript setter返回值而不进行验证

2019-08-25 08:36:40  阅读:230  来源: 互联网

标签:javascript javascript-objects getter-setter ecmascript-5 javascript-engine


JavaScript setter更新引用的内部值,但返回值不正确.

var Game = 
{   
    get points() {
        return this._points;
},

    set points(x){        
       x = Math.min(x,25);

       this._points = x;   
       return this._points;
    }
};

Game.points = 10 ;

console.log(Game.points); // outputs 10

var updatedPoints = (Game.points = 60);

console.log(updatedPoints); // outputs 60
console.log(Game.points); // outputs 25

‘updatedPoints’的预期价值是25!

知道为什么会发生这种情况吗?你能否建议是否有办法解决这个问题?

解决此问题的原因:确保JS代码按预期执行,可维护性!

解决方法:

JavaScript simple assignement(=)根据规范(11.13.1)返回正确的值.此行为忽略了setter中发生的任何验证.

从规格:

The production AssignmentExpression : LeftHandSideExpression =
AssignmentExpression is evaluated as follows:

  1. Let lref be the result of evaluating LeftHandSideExpression.
  2. Let rref be the result of evaluating AssignmentExpression.
  3. Let rval be GetValue(rref).
  4. Throw a SyntaxError exception if the following conditions are all true:
    • Type(lref) is Reference is true
    • IsStrictReference(lref) is true
    • Type(GetBase(lref)) is Environment Record
    • GetReferencedName(lref) is either “eval” or “arguments
  5. Call PutValue(lref, rval).
  6. Return rval.

所以没有办法按照设计“修复”你的问题.检查Game.points就足够了.

标签:javascript,javascript-objects,getter-setter,ecmascript-5,javascript-engine
来源: https://codeday.me/bug/20190825/1717286.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有