字符集

js程序是用Unicode字符集编写的。并且js的区分大小写的语言。需要注意的是html并不区分大小写。例如,在html中设置时间处理onclick属性可以写成onClick,但是在js当中只可以写成onclick。

注释

js支持两种注释方式。//之后到行尾的文本会被当成注释。还有在/**/之间的文本被当作注释。

标识符

js当中的标识符必须以字母、下划线或者美元符开头,后续的字符可以是字母、数字、下划线或者美元。

可选的分号

和其他语言一样,js使用分号将语句隔开。在js中如果语句独占一行,那么分号可以省略。

一般会在行结尾加上分号,避免js自动添加分号引发其他问题。

类型、值和变量

js的数据类型分为两种:原始类型和对象类型。

原始类型包括数字、字符串和布尔值。以及两个特殊的原始值:null和undefined。

对象类型是除了原始类型外的都是对象类型。

js中的变量是无类型,变量可以被赋予任何类型的值。使用var关键字来声明变量。

数字

js不区分整数和浮点数。js当中的所有数字都使用浮点数来表示。

除了十进制的整型直接量,js也可以识别十六进制值、以0x或者0X开头后面跟随0~9和a-fA-F构成。

浮点数的简洁语法表示如下:

1
2
3
4
5
6
7
[digits][.digits][(E|e)[(+|-)]digits]

//例如
3.14
.14
6.12e23
1.47E-23

js提供的数字运算有5种,+、-、*、/、%。

也可以使用Math对象来进行一些运算:

1
2
3
Math.pow(2, 4); //2的4次幂
Math.abs(-5); //-5的绝对值
...

当js中运算溢出时候不会报错,当操作js所能表示的最大值使用Infinity表示。同样,当负数超过了js能表示的范围使用-Infini
ty表示。基于他们的加、减、乘除运算结果还是无穷大(并且保留正负号)。

零除以零是没有意义的,会返回NaN(not a number)。

js当中预定义了全局变量Infinity和NaN,原来表示正无穷大和非数字值。

js中的NaN很特殊,它和任何值都不相等,包括自身。所以要判断x是否为NaN不可以使用x==NaN,但是可以使用x!=x来判断,只有当x的NaN的时候这个表达式才会返回true。

文本

字符串是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。

js中字符串直接量是由单引号或者双引号括起来的字符序列。如下几个例子:

1
2
3
4
'test'
"adc"
'name="rcx"'
"this's is what"

js中的转义字符表如下:

转义字符 含义
\o NUL字符(\u0000)
\b 退格符(\u0008)
\t 水平制表符(\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
\” 双引号(\u0022)
\’ 单引号(\u0027)
\ 反斜线(\u005C)

如果\字符出现在没有转义的字符前,则忽略\。比如#和#是等价的。

js中的字符串连接和java的处理是相同的可以使用+号。要得到字符串的长度使用s.length属性。以及如下方法:

1
2
3
4
5
6
7
8
9
10
11
var s = "hello, world"
s.charAt(0)
s.substring(1,4)
s.slice(1,4)
s.slice(-3)
s.indexOf("l")
s.lastIndexOf("l")
s.indexOf("l",3)
s.split(", ")
s.replace("h", "H")
s.toUpperCase()

js中的字符串是不变的,所以replace()和toUpperCase()方法都会返回新字符串,原字符串本身没有发生改变。

js中定义了RegExp()构造函数,原来创建表示文本匹配模式的对象。成为正则表达式,js采用了Perl中的正则表达式语法。

在两条斜线之间的文本构成了一个正则表达式直接量。在第二条斜线之后也可以跟随一个或多个字母,原来修饰匹配模式的含义,例如:

1
2
/^HTML/
/[1-5][0-9]/

RegExp对象定义了很多有用的方法,例如:

1
2
3
4
5
6
var text = "testing:1,2,3";
var pattern = /^d+/g;
pattern.test(text);
text.serch(pattern);
text.replace(pattern, '#');
text.split(/\D+/);

布尔值

布尔值类型只有两个值,true和false。

在js当中任何值都可以转换成布尔值,一下值会转换成false。

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

null和undefined

null表示一个特殊值,对null进行typeof运算,返回结果是“object”,通常来表示对象是无值的。

undefined来表示变量没有被初始化。如果要查询对象属性或者数组元素的值时返回undefined则说明这个属性或元素不存在。如果函数没有返回任何值,则返回undefined。如果对undefined类型进行typeof运算则永远返回undefined,表明这个类型只有唯一的值。

全局对象

  • 全局属性,undefined、Infinity和NaN
  • 全局函数,isNaN(),parseInt()和eval()
  • 构造函数,Date(),RegExp(),String(),Object(),Array()
  • 全局对象,Math和JSON

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

在js当中原始值是不可变的,如undefined和null和布尔值和数字以及字符串,对象是可变的。

在比较相等的时候,原始值只比较值是否相等,对象是比较引用是否相同。

对象的转换

所有的对象都继承了两个转换方法:toString()和valueOf()。

valueOf()表示返回对象的原始值,但是大多数对象都没有原始值所以一般都默认的返回对象本身。

一般js对象到字符串的转换有如下步骤:

  • 如果对象有toString()方法,调用这个方法。如果返回一个原始值,js将这个原始值转换成字符串,并返回这个字符串结果。
  • 如果没toString()方法,或者toString()方法返回的不是一个原始值,那么js调用valueOf()方法。如果valueOf()方法存在则调用,如果返回的是原始值,会将这个原始值转换成字符串,并且返回这个字符串。
  • 如果toString()和valueOf()都不返回原始值,就会抛出异常。

—EOF—