js中a=a++的结果为什么不变

let a = 1;
    a = a++;
console.log(a); // 1

上述代码按理说a应该等于2,因为a++最后总会加一,应该等于2;即不论是a=a++还是a=++a,最后a都应该等于2;在C语言中验证这两种写法都等于2;但js中a=a++最后a却等于1,是什么原因呢?
换种写法
b = a++;最后a就是等于2的,疑惑

阅读 3.1k
3 个回答

先看个 JavaScript 的例子

const test = {
    _a: 1,
    get a() {
        return this._a;
    },
    set a(v) {
        console.log(`current: ${this._a}, set to ${v}`);
        this._a = v;
    }
};

test.a = test.a++;

运行结果:

current: 1, set to 2
current: 2, set to 1

大概过程是,先缓存了 a 的值,然后执行 a++,然后把缓存的 a 值赋给 a

既然题主提到多种语言,所以尝试了一下

  • Java (JDK 11) 的结果是 1,和 JS 一致
  • C# (Net5) 的结果是 1,和 JS 一致
  • C++ (VS2019) 的结果是 2

所以实际上只有 C++ 的结果不同,估计跟 C++ 编译后运行时可能使用了寄存器,由于 a 是直接在寄存器中进行的 INC 操作,没有缓存之前的值 —— 当然这个是猜测,希望有条件/能力的朋友可以反编译出来研究一下。

a++作为一个表达式,它的值就是1,这个值赋给a,a就是1。

你写的过程不对,应该是:

a=1
t=a++ //t=1,a=2
a=t //1

a++是后赋值
你要使用 ++a

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题