第3章 类型、值和变量

数字

JavaScript不区分整数值和浮点数值,
浮点数的范围是[-5*10^-324, 1.7976931348623157*10^308],
整数范围是[-2^53, 2^53]
需要注意的是,数字的索引值是基于32位整数的!!!

整型直接量

0
3
100000000
还可以是十六进制:
0xff // 255
0XCAF893

浮点型直接量

3.14
.33333
6.02e23 // 6.02*10^23

算数运算

+、-、*、/、%
另外,
Math.pow(2, 12) // 2^12
Maht.round(.6) // 四舍五入
Math.ceil(.6) // 向上取整
Math.floor(.6) // 向下取整

JavaScript在溢出、下溢或除零时不会报错!!!
1/0 // Infinity, Number.POSITIVE_INFINITY
0/0 // NaN, Number.NaN, not a number
Number.MIN_VALUE-1 // 发生下溢,0

二进制浮点数和四舍五入错误

由于浮点数的表示方法,决定了它可以精确的表示分数:1/2,1/4,1/16;但是不能精确表示1/10,1/100;

1
2
3
4
5
var x = .3 - .2;
var y = .2 - .1;
x == y // false
x == .1 // false
y == .1 // true

这种情况同样适用于python、java、c++。

日期和时间

1
2
3
4
5
6
7
8
var now = new Date();
var later = new Date(2019, 1, 12, 22, 30, 0);
var last = new Date(2017, 12, 20);
var elapsed = now - then; // 间隔的毫秒数
later.getFullYear()
later.getMonth()
later.getDate()
later.getDay() // 周几

文本

JavaScript采用UTF-16编码的Unicode字符集,没有像Java一样的Char类型,单个字符即是长度为1的字符串。

转义字符

1
2
3
\n 换行符
\r 回车符
\'

字符串的使用

1
2
3
4
5
6
7
8
9
10
11
var s = "hello, " + "world";
s.length
s.charAt(2)
s.substring(0, 2) // he
s.slice(1, 2) // e
s.indexOf('l') // 2
s.lastIndexOf('l')
s.indexOf('l', 3) // 3,在位置3之后首次出现的
s.split(',')
s.replace('h', 'H')
s.toUpperCase()

注意:replace()和toUpperCase()返回一个新的字符串,原字符串并未改变!
String Reference

模式匹配

1
2
3
4
5
6
var text = 'testing: 1, 2, 3';
var p = /\d+/g;
p.test(text) //true
text.search(p) //9
text.match(p) //['1', '2', '3']
text.replace(p, '#') //'testing: #, #, #'

Regular Expression

布尔值

下面这些值会被转换成false:

1
2
3
4
5
6
undefined
null
0
-0
NaN
""

全局对象

类别 举例
全局属性 undefined,Infimity,NaN
全局函数 isNaN(),parseInt(),eval()
构造函数 Date(),RegExp(),String(),Object(),Array()
全局对象 Math,JSON

包装对象

对象是值和方法的集合,通过**.**来访问。如下:

1
2
var s = 'hello';
s.length

s是一个字符串类型(typeof查看),当用**.**来访问length或其它方法时,JavaScript就会通过new String(‘hello’)把s转换成了一个对象,访问完之后就被销毁。

1
2
3
var s = 'test';
s.len = 4;
var t = s.len;

运行结果是t为undefined,并不是4;
存取数字、字符串、布尔值的属性创建的临时对象被称为包装对象。包装对象只是数字、字符串和布尔值的具体实现,不必在意,只要知道它与对象的区别即可。

不可变的原始值和可变的对象引用

与Java完全一致,数字、字符串和布尔值本身不可改变,对象指向同一个实例才是相等。