一段不算太新,流传网络的代码:
var a = (++Math.PI);
alert(a); //1
alert(Math.PI); //2
var b = (Math.PI++);
alert(b); //3
alert(Math.PI); //4
var c = Math.PI = (++Math.PI);
alert(c); //5
alert(Math.PI); //6
var d = Math.PI = (Math.PI++);
alert(d); //7
alert(Math.PI); //8
var e = Math.PI = (Math.PI + 1);
alert(e); //9
alert(Math.PI); //10
Math.PI 在其他语言看来是系统一个常量,修改它的话编译都通不过,不过 javascript 具有很强的的容错性(包容性?),他是不会提醒你的,要搞懂这个不看规范是不行的。
分析
ECMAScript 262 :
PI
15.8.1.6 PI
The number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { DontEnum, DontDelete, ReadOnly }.
只有系统属性才会有 readonly ,我们定义的一般属性没法设置, 而 ReadOnly 应该相当于常量了吧 ?
ReadOnly
8.6.1 ReadOnly
The property is a read-only property. Attempts by ECMAScript code to write to the property will be ignored. (Note, however, that in some cases the value of a property with the ReadOnly attribute may change over time because of actions taken by the host environment; therefore “ReadOnly” does not mean “constant and unchanging”!)
看见一般情况下,readonly属性不可以改,但不报错,即赋值修改没用!也不意味着是常量 !
那么现在知道了 : 2,4,6,8,10 条代码 alert 都是 3.14 了。
另外 3 alert 也不用解释了,返回自增前结果,还是 3.14
那么 1 alert 难道还是 3.14 ,因为 PI readonly 无法改变 ?错误
自增运算符
涉及到 前缀自增运算符的返回值问题 :
11.4.4 Prefix Increment Operator The production UnaryExpression :
++ UnaryExpression is evaluated as follows:
1. Evaluate UnaryExpression.
2. Call GetV alue(Result(1)).
3. Call ToNumber(Result(2)).
4. Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).
5. Call PutV alue(Result(1), Result(4)).
6. Return Result(4).
则可见返回的是 Result(4) Math.PI+1 ,而不是 第五步过后的 Result (1)
那么可见 1 alert 即为 Math.PI+1 = 4.14
赋值操作符
c,d,e 类似,= 操作符具有右结合性, 则申明初始化时,变量值为赋值表达式 (Math.PI = ++Math.PI) ,javascript 每个表达式都会返回一个值,这就涉及到了前句的表达式返回值是多少:
11.13.1 Simple Assignment ( = )
The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
1. Evaluate LeftHandSideExpression.
2. Evaluate AssignmentExpression.
3. Call GetV alue(Result(2)).
4. Call PutV alue(Result(1), Result(3)).
5. Return Result(3).
前面自增规范可以得到 ++Math.PI 返回 4.14 为 Result 2,Result 3 ,同样的道理,第4步赋值后,返回的是赋值表达式右端的值 (++Math.PI),而不是左端的值 Math.PI ,则 (Math.PI = ++ Math.PI) 返回 ++Math.PI == 4.14 ,即连续赋值运算只返回最右边的值,而不管赋值中变量是否发生了变化。
分享到:
相关推荐
Java Math类是Java标准库中的一个关键组成部分,它为开发者提供了丰富的数学运算功能。这个类包含了一系列静态方法,使得在编程过程中处理数学计算变得简单易行。以下是对Java Math类中一些重要方法的详细说明: 1....
在C#编程语言中,`Math`类是一个非常重要的实用工具类,提供了各种数学运算方法。这个类位于`System`命名空间下,包含了处理基本数学运算、三角函数、指数和对数、取整以及随机数生成等所需的功能。下面是对`Math`类...
print("math.exp(math.pi) : ", math.exp(math.pi)) ``` 当运行上述代码时,你会得到以下输出: ``` math.exp(-45.17) : 2.41500621326e-20 math.exp(100.12) : 3.03084361407e+43 math.exp(100.72) : 5....
`math.pi`代表圆周率π,其值约为3.141592...,在几何和圆形相关计算中经常用到。而`math.e`则是自然常数,大约等于2.718281...,在复利计算和指数函数中扮演关键角色。 接下来,我们来看看`math`模块提供的数值...
- `math.log()` 计算自然对数,`math.log(math.sqrt(13+math.e)*2*math.pi)` 计算了给定表达式的自然对数。 - `math.pow()` 用于计算幂次,`math.pow(math.tan(math.log(math.pi+1,3)),-1)` 计算了 tan(log(π + 1...
3. **内置数学函数**:C#提供了许多内置的数学函数,如`Math.PI`、`Math.Abs`、`Math.Pow`、`Math.Round`和`Math.Sqrt`等,可以用于计算。 4. **自定义函数**:除了内置函数,还可以定义自己的函数并集成到表达式...
这个属性提供了一种方便的方式来计算与10为底的对数相关的数学表达式,而无需手动计算或查找E(自然对数的底,约等于2.71828)对10的对数值。 `Math.LOG10E`的值约等于0.4342944819032518,这是一个浮点数,精确到...
double tangent = Math.Tan(Math.PI / 4); // 正切 ``` 在设计科学计算器的UI时,你可能需要增加更多按钮来表示科学计算的功能,并提供切换到科学模式的选项。此外,还要考虑处理错误,比如除以零或计算无效的数学...
Math.cos(Math.PI*x/2) : - Math.cos(Math.PI*x/2); ``` 在 Java 语言中,前缀 ++ 和后缀 ++ 的区别,在于前缀 ++ 是先加 1,然后赋值,而后缀 ++ 是先赋值,然后加 1。 可以编写一个程序来示意前缀 ++ 和后缀 ++...
表达式包括了算术运算、位操作、强制类型转换、比较运算、逻辑运算、字符串连接、取长度、优先级等。语句类型包括语句块、代码块、赋值、控制结构(如if-then-else, while循环)、For循环、函数调用、局部声明等。...
`Math.sin(angle)`、`Math.cos(angle)`和`Math.tan(angle)`分别用于计算角度的正弦、余弦和正切值,其中角度以弧度为单位,可以使用`Math.PI`常量转换角度和弧度。 2. **科学计数法**: JavaScript的Number类型可以...
5. 复杂函数:`y = Math.sin(x) / a * x + Math.abs(Math.cos(Math.PI * x / 2));` 6. 逻辑条件:`a > 0 && a 7. 逻辑条件:只有一个条件成立(x=1 或 y=2,但不能同时成立):`(x == 1 && y != 2) || (x != 1 && y...
`Math.PI`常量可以用来与弧度进行关联,而`Math.radians`和`Math.degrees`函数可以用于单位转换。 7. **性能优化**:为了提供流畅的用户体验,计算器的代码需要优化,避免不必要的计算,减少内存占用,并确保响应...
Python的math库提供了π的常量math.pi,所以计算π的平方可以通过`math.pi * math.pi`实现。补充完整程序如下: ```python import math p = math.pi * math.pi print(p) ``` 实验2:顺序结构程序设计 实验2主要...
Math.cos(Math.PI*x/2) : -Math.cos(Math.PI*x/2); - 0<a<10 -> a > 0 && a ; - 条件 x=1 与 y=2 有且只有一个成立 -> (x == 1 && y != 2) || (x != 1 && y == 2); 10. **变量运算后的值** - 表达式1:b=a*a++...
球的表面积公式为\(4\pi r^2\),体积公式为\(\frac{4}{3}\pi r^3\),其中r为球的半径,π可通过`math.pi`获得。例如: ```python import math radius = float(input("请输入球的半径: ")) surface_area = 4 * math...
5. **数学对象应用**:VB.NET中的`Math`类提供了一系列数学函数,如`Sqrt`(平方根)、`Pow`(幂运算)、`Ceiling`(向上取整)等。例如,`Dim result = Math.Sqrt(16)`将返回4。 6. **类型转换函数**:VB.NET提供...
Python的math模块是Python标准库中的一个重要组成部分,它提供了丰富的数学...同时,math模块的使用也遵循Python的运算符优先级规则,例如`**`运算符的优先级高于乘法和除法,这在编写涉及多个运算的表达式时尤为重要。
JavaScript的`Math`对象提供了一系列数学运算相关的函数和属性。三角函数如`Math.sin()`, `Math.cos()`, `Math.tan()`分别计算正弦、余弦和正切值;反三角函数如`Math.asin()`, `Math.acos()`, `Math.atan()`则用于...
- `Math.PI` 是Java中预定义的常量,表示π的近似值。 8. **格式化输出**: - 实验3的第二部分使用了 `DecimalFormat` 类来格式化输出结果,确保显示两位小数,使结果更加美观。 9. **条件判断**: - 虽然实验3...