值类型及变量

2018-03-04大约13分钟

计算机以及如今已经普及的智能手机,很重要的一项功能就是处理和显示信息。例如,在某在线购物网站上,当你想查询你上个月的网购订单,点了查询按钮之后,这时计算机就从某个地方获取到你的订单信息,过滤掉非上个月的信息,然后把相关的内容显示在网页上。

在计算机程序中,各种不同的信息,就是不同的数据。那么既然这些数据反映的是真实的世界,那么数据也就必须有相应的类型来表示这个世界。

数值(Number)

数值,数值,数数嘛,谁不会?

学过C语言的同学,会发现C语言里的数值很麻烦,比如短整型(short)、整型(int)、长整型(long)、单精度浮点(float)、双精度浮点(double)、有符号、无符号等等,不努力学,还真不一定会数数。

JavaScript里面的数值类型比较直观,也比较简单,就是整数和小数(浮点数)。

学JavaScript,妈妈终于不用担心我不会数数了

整数

比如12、365、-3等都是整数,整数可正可负。

在JavaScript中,整数的取值范围很大:-2^53~2^53 (即正负2的53次方)。

小数(浮点数)

比如1.23、-3.4等,小数也可正可负,取值范围也很大。

简而言之,除非编写用于科学计算的应用程序,否则不用关心JavaScript中数字的取值范围的问题。另外,尽管在存储时,可以区别对待整数和浮点数,但实际上,JavaScript把它们都视作浮点数,这一点JavaScript隐藏了其中转换的细节,通常我们可以不用考虑这个问题。

算术运算 (加、减、乘、除)

数值类型,最基础的加(**+** )、减(**-** )、乘(***** )、除(**/** )例子:

console.log(5 + 3);
console.log(5.0 + 3);

console.log(5 - 3);
console.log(5.0 - 3);

console.log(5 * 3);
console.log(5.0 * 3);

console.log(5 / 3);
console.log(5.0 / 3);

有其他语言编程经验的同学,可能会留意到一点是小数运算和整数运算的结果是完全一样的,这也验证了,JavaScript其实内部都是当作浮点数来处理的。

换一个不同的语言来对比,下面是Python的例子:

print(5 + 3)
print(5.0 + 3)

print(5 - 3)
print(5.0 - 3)

print(5 * 3)
print(5.0 * 3)

print(5 / 3)
print(5.0 / 3)

可以看出,在Python里,整数和小数是不同的类型,整数做除法的时候,是有精度损失的。在运算的时候,Python要考虑得到的结果是整数还是小数,而JavaScript是不需要考虑的,

算术运算(求余)

求余操作,即当不能整除的时候,得到余数:运算符是**%**

console.log(5 % 3);
console.log(3 % 5);
console.log(3.3 % 5);
console.log(-3 % 5);

算术运算(自加、自减)

对一个数值进行加1或减1,最简单的方法是用累加(**++** )和递减(**--** )运算符。

// 先预先定义一个变量value
let value = 1;

console.log("----------累加----------");
value++;
console.log(value);

// 把value的值重置为1
value = 1;

console.log("----------递减----------");
value--;
console.log(value);

++--可以放在变量前,也可以放在变量后,都是对当前变量的值加1。修改一下上面的例子,请留意一下放前面和后面的区别:

let value = 1;
console.log(value++);
console.log(value);

value = 1;
console.log(++value);
console.log(value);

console.log(value++)是先输出value的值,然后value的值再自增1;console.log(++value)是value先自增1,然后再输出value最新的值。

位运算

同其他语言一样,JavaScript也支持位运算操作。

按位非 **~** 每个二进制位都反转一下,0变1,1变0

/*
为了简化问题,仅用必要的位数来表示,没有表示符号位:
1的二进制是0001
2的二进制是0010
5的二进制是0101
*/

console.log(~5);  // 0101每位都反转一下,是1010即6,最高为符号位也要反转,所以是-6

按位与 **&** 相同位都是1结果是1,否则都是0

// 按位与:相同位都是1结果是1,否则都是0
console.log(1 & 5);   // 0001 & 0101 = 0001,即1 
console.log(2 & 5);  //  0010 & 0101 = 0000,即0 

以下的运算不太常用,为了避免大家头大,了解即可。

按位或 **|** :相同位只要有一个是1结果是1,否则是0

console.log(1 | 5);   // 0001 | 0101 = 0101,即5 
console.log(2 | 5);   // 0010 | 0101 = 0111,即7

按位异或 **^** 相同位不同结果是1,相同则是0

console.log(1^5);  // 0001 ^ 0101 = 0100,即4 
console.log(2^5);  // 0010 ^ 0101 = 0111,即7

按位左移 **<<**

console.log(5 << 2);  //  0101 往左边移两位,右边补两个0,是010100,即20


按位右移 **>>**

console.log(5 >> 2);   // 0101 往右边移两位,左边补两个0,是0001,即1


无符号右移 **>>>**

console.log(5 >>> 2); // 正数与有符号右移一样
console.log(-1 >>> 2);