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 —— 求幂运算,乘法运算符,加法运算符以及减法运算符 #73

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

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Feb 12, 2020

求幂运算,乘法运算符,加法运算符以及减法运算符

求幂运算符

**,与 Math.pow() 类似

  • 幂运算符是右结合的。a ** b ** c 等同于 a ** (b ** c)
  1. 定义 left更新表达式 运算结果
  2. 定义 leftValue? GetValue(left)
  3. 定义 right求幂表达式 运算结果
  4. 定义 rightValue? GetValue(right)
  5. 定义 base? ToNumeric(leftValue)
  6. 定义 exponent? ToNumeric(rightValue)
  7. 如果 base 类型与 exponent 类型不同,抛 TypeError 错误
  8. 返回 ? Type(base)::exponentiate(base, exponent)。 (PS:也可能是 BigInt 类型的 ::exponentiate

乘法运算符

* / %

  1. 定义 left乘法表达式 运算结果

  2. 定义 leftValue? GetValue(left)

  3. 定义 right求幂表达式 运算结果

  4. 定义 rightValue? GetValue(right)

  5. 定义 lnum? ToNumeric(leftValue)

  6. 定义 rnum? ToNumeric(rightValue)

  7. 如果 lnum 类型与 rnum 类型不同,抛 TypeError 错误

  8. 定义 Tlnum 的类型

  9. 如果运算符是 *,返回 T::multiply(lnum, rnum)。(PS:可能是 BigInt 类型的 ::multiply

  10. 如果运算符是 /,返回 T::divide(lnum, rnum)。(PS:可能是 BigInt 类型的 ::divide

  11. 否则,

    a. 断言:运算符是 %

    b. 返回 T::remainder(lnum, rnum)。(PS:可能是 BigInt 类型的 ::remainder

加法运算符

注意:+ 运算符既能执行字符串拼接,也能用作数值相加。

  1. 定义 lref加法表达式 运算结果

  2. 定义 lval? GetValue(lref)

  3. 定义 rref乘法表达式 的运算结果

  4. 定义 rval? GetValue(rref)

  5. 定义 lprim? ToPrimitive(lval)

  6. 定义 rprim? ToPrimitive(rval)

  7. 如果 lprimString 类型或者 rprimString 类型

    a. 定义 lstr? ToString(lprim)

    b. 定义 rstr? ToString(rprim)

    c. 返回 lstrrstr字符串拼接

  8. 定义 lnum? ToNumeric(lprim)

  9. 定义 rnum? ToNumeric(rprim)

  10. 如果 lnum 的类型和 rnum 的类型不同,抛 TypeError 异常

  11. 定义 Tlnum 的类型

  12. 返回 T::add(lnum, rnum)。 (PS:还有 BigInt 类型的 ::add

减法运算符

  1. 定义 lref加法表达式 的运算结果
  2. 定义 lval? GetValue(lref)
  3. 定义 rref乘法表达式 的运算结果
  4. 定义 rval? GetValue(rref)
  5. 定义 lnum? ToNumeric(lval)
  6. 定义 rnum? ToNumeric(rval)
  7. 如果 lnum 的类型和 rnum 的类型不同,抛 TypeError 异常
  8. 定义 Tlnum 的类型
  9. 返回 T::subtract(lnum, rnum)。 (PS:还有 BigInt 类型的 ::subtract

2020-08-05 补充

Daily-Interview-Question 第 102 题:不用加减乘除运算符,求整数的7倍

我不会。。。
想了半小时愣是想不出来,只能看答案了,看到这个:Advanced-Frontend/Daily-Interview-Question#161 (comment) 回答,真的天才啊!!!

我能想到的就是 左移3位得到8倍,但是7倍的话我不得不用减法了,可是题目不允许。

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