Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— 更新表达式(后缀++/前缀++) #71

Open
lizhongzhen11 opened this issue Feb 11, 2020 · 0 comments
Open

重学js —— 更新表达式(后缀++/前缀++) #71

lizhongzhen11 opened this issue Feb 11, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Feb 11, 2020

更新表达式

后缀++

  1. 定义 lhsLeftHandSideExpression 运行结果
  2. 定义 oldValue? ToNumeric(? GetValue(lhs))。 (PS:这里转为数值)
  3. 定义 newValue! Type(oldvalue)::add(oldvalue, Type(oldvalue)::unit)
  4. 执行 ? PutValue(lhs, newValue)。 (PS:这里将新值赋给 lhs,替换掉原来的 oldValue
  5. 返回 oldValue (PS:重点注意!!!虽然其值已经改为新值了,但是返回的是旧值!!!
let a = 1
let b = a++
console.log(`a 为 ${a},`, `b 为 ${b}`) // a 为 2, b 为 1

后缀--

  1. 定义 lhsLeftHandSideExpression 运行结果
  2. 定义 oldValue? ToNumeric(? GetValue(lhs))。 (PS:这里转为数值)
  3. 定义 newValue! Type(oldvalue)::subtract(oldvalue, Type(oldvalue)::unit)
  4. 执行 ? PutValue(lhs, newValue)。 (PS:这里将新值赋给 lhs,替换掉原来的 oldValue
  5. 返回 oldValue (PS:重点注意!!!虽然其值已经改为新值了,但是返回的是旧值!!!
let a = 1
let b = a--
console.log(`a 为 ${a},`, `b 为 ${b}`) // a 为 0, b 为 1

++前缀

  1. 定义 exprUnaryExpression 运行结果
  2. 定义 oldValue? ToNumeric(? GetValue(expr))。 (PS:这里转为数值)
  3. 定义 newValue! Type(oldvalue)::add(oldvalue, Type(oldvalue)::unit)
  4. 执行 ? PutValue(expr, newValue)。 (PS:这里将新值赋给 expr,替换掉原来的 oldValue
  5. 返回 newValue (PS:重点注意!!!这里返回的是新值!!!
let a = 1
let b = ++a
console.log(`a 为 ${a},`, `b 为 ${b}`) // a 为 2, b 为 2

--前缀

  1. 定义 exprUnaryExpression 运行结果
  2. 定义 oldValue? ToNumeric(? GetValue(expr))。 (PS:这里转为数值)
  3. 定义 newValue! Type(oldvalue)::subtract(oldvalue, Type(oldvalue)::unit)
  4. 执行 ? PutValue(expr, newValue)。 (PS:这里将新值赋给 expr,替换掉原来的 oldValue
  5. 返回 newValue (PS:重点注意!!!这里返回的是新值!!!
let a = 1
let b = --a
console.log(`a 为 ${a},`, `b 为 ${b}`) // a 为 0, b 为 0

注意

前缀操作符和后缀操作符很容易令人困惑,当然,以前靠记忆也能记住,现在直面规范更能理解。希望不要再被迷惑!

可以大致写个后缀模拟函数,不标准:

/*
 * @param {target} 目标数值
 * @param {type} 只能是 '++' 或 '--'
 */
const postfix = (target, type) => {
  let old = Number(target)
  if (type === '++') {
    let newVal = old + 1
    target = newVal
  } else if (type === '--') {
    let newVal = old - 1
    target = newVal
  } else {
    throw '第二个参数只能传入 ++ 或 --'
  }
  return old
}

前缀也类似。

@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Feb 11, 2020
@lizhongzhen11 lizhongzhen11 changed the title 重学js —— 更新表达式 重学js —— 更新表达式(后缀++/前缀++) Apr 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant