跳转至

数字运算和表达式

数据类型

你编写的程序运行时,主要工作就是对各种数据进行操作

编程语言中的 数据是 有 类型 的。

比如 表示一个数字的数据表示一个字符串的数据 就是不同的类型

数字是数字类型, 字符串是字符串类型

数字

任何编程语言,都经常要进行 数字 计算。

js中, 一个 数字数据 的类型是 数字(Number)

js中的数字类型的数据 可以是 整数或者小数

整数

整数我们小学就学过,比如 1, 2, 3, 100, 1000, 999999等等

当然还有负数的整数 -1, -2, -999 等等

在js语言中,整数的写法 和 数学课上的写法 一样

比如 整数 1,就是

1

整数 999,就是

999

整数 -1,就是

-1

小数

好,刚才说过了整数,我们再来看另外一种类型的数字:小数, 就是带小数点的数字。

在js语言中,小数的写法也和 数学课上的写法 一样,比如

3.14     
4.0
-3.3333

存储特性

整数和小数在 JavaScript 解释器内部其实都是存储为 双精度浮点数 (Double-precision floating-point)。

就像 Java 或者 C# 中的 double

这种格式以 64 位存储数字,如下图

image

其中:

数字(小数)存储在 0 到 51 位,

指数存储在 52 到 62 位,

符号存储在 63 位。


所以 在 JavaScript 解释器看来,整数 和 小数 都是一样的,都是 数字类型

这和很多其他编程语言(Java、Python、C 等等)不同。

数学运算

js语言开发是 经常要进行 数学运算的。

运算表达式 的写法 也和我们小学数学课上的写法 差不多

大家可以 打开 浏览器Console ,按照下面的例子输入运算表达式

  • 加法
    > 5 + 8
    13
    

注意,上面的代码 5 + 8 就是一个表达式,被 js解释器 执行后,会产生一个结果数字 13。

加号前后 可以有些空格, 也可以没有空格,像这样 5+8


  • 减法
    > 999 - 111
    888
    

同样,上面的代码 999 - 111 是一个表达式,被js解释器执行后,会产生一个结果数字 888


  • 乘法
> 8 * 9
72

  • 除法
> 3 / 2
1.5

注意,计算结果是小数


  • 只需要得到余数的除法
    > 3 % 2
    1
    

  • 只需要得到商的除法
> Math.trunc(3 / 2)
1

  • 次方
    > 10 ** 3
    1000
    

上限整数

> Math.ceil(3.1)
4

下限整数

> Math.floor(3.9)
3



更复杂的是: 混合运算

> 5 * 4 / 2 + 1
11

上面的表达式运算的时候,先算乘除部分,再算加减部分。因为 乘除 的优先级高于 加减。

所以先计算的是 5 * 4 / 2 得到结果 10, 再加上 1, 得到结果 11


如果你需要把 2 + 1 这部分作为整体运算,得到3,然后再被 5 * 4 的结果 除,可以使用括号,像这样

> 5 * 4 / (2 + 1)
6.666666666666667

括号扩起来的部分 表示是一个整体 优先进行运算。


js 中,详细的操作符优先级,可以参考MDN文档

该表从上往下,优先级依次降低。越是上面的操作符,优先级越高。

可以看到,乘除在加减的上方,所以优先级更高。 同时出现在表达式中,先计算乘除。

同一行中的操作符优先级相等,同时出现在表达式中,通常按照从左到右的次序执行。

表达式

前面的这些带 加减乘除 运算符的 像

5 + 8
5 * 4 / (2 + 1)

它们的特点是能够产生出一个 结果数据 的 一段代码,

这部分 代码语句 术语叫做 表达式 ,英文称之为 expression


上面这些是数学运算的表达式, 结果是一个数字,以后,我们还会有其它类型的表达式

我们可以用 console.log 将表达式的结果输出到界面上,比如

console.log(5 * 4 / (2 + 1)) 

因为表达式可被求值,在编程中, 我们经常需要将 表达式的结果给一个变量, 变量的概念,下节课会详细讲

变量名在 左边, 中间是 = 号,等号的右侧是表达式, 就形成过赋值语句 比如

let a =  ((118+998)*2.0 + 34)/45

那么这个变量 a 就拥有了 表达式的结果

console.log(a) 

关于变量和赋值语句,后面的课程会讲.

语句结尾要加分号吗

js语句结尾可以加分号也可以不加

let a =  ((118+998)*2.0 + 34)/45 
console.log(a) 
console.log(a) ;

因为即使你不加分号,js引擎执行时会自动加上分号,称之为 ASI(Automatic Semicolon Insertion)

到底加分号好还是不加好,众说纷纭。


我个人做法是不加分号(因为我比较懒),除非发现有的地方一定要加。