第三章——基本概念
语法
1.区分大小写
2.标识符
第一个字符:字母、下划线、美元符号
其他字符:字母、下划线、美元符号、数字
不能把关键字、保留字、true、false、null用作标识符
3.注释
//单行
/*多行
4.严格模式
ECMAScript 5引入了严格模式。
严格模式为JavaScript定义了一种不同的解释与执行模型。ECMAScript 3中的一些不确定行为将得到处理,对某些不安全的操作也会抛出错误。
“use strict”是一个编译指示。
5.语句
关键字和保留字
变量
js变量是松散类型的,也就是变量仅仅是一个保存值的占位符而已。虽然初始化变量不会标记类型。但我们不建议修改保存值类型。
未初始化的值类型为undefined
var定义局部变量,省略var值会变成全局变量,但不推荐使用,因为在局部作用域中定义的全局变量很难维护。
数据类型
共有5种简单数据类型:Undefined、Null、Boolean、Number、String;一种复杂数据类型:Object(本质上由一组无序的名值对组成)
不支持创建自定义类型(数据类型具有动态性)
1.typeof
null被认为是空对象的引用,正则表达式
函数的话会返回function
2.undefined
对于尚未声明的变量,只能执行一项操作,即使用typeof检测数据类型。(对未声明的变量调用delete不会导致错误,但这样做没有实际意义,且严格模式下会导致错误)
显式地初始化变量依然是明智选择,因为在typeof返回undefined时候,我们就会知道是未声明而非未初始化。
3.null
表示空对象指针,只要意在保存对象的变量还没真正保存对象,就应该让其保存null值
实际上,undefined类型派生自null类型,因此相等性测试返回true。
alert(null == undefined); //true
不过要注意的是,这个操作符出于比较的目的会转换其操作数。===则不会,二者区别参见此文。
4.boolean
由于存在自动类型转换,因此确切的知道流控制语句中使用的是什么变量至关重要。
5.number
八进制在严格模式下无效,会导致支持JavaScript引擎抛出错误。
鉴于JavaScript中保存数值的方式,可以保存正零(+0)和负零(-0),二者被认为相等。
(1)浮点数值
浮点数内存空间是整数两倍,(1)小数点后没数字(2)本身就是一个整数,如xxx.0,将自动转为整数。
科学计数法:e 3.123e7是整数
最高精度是17位小数,永远不要测试某个特定浮点数值。例如:0.1+0.2不等于0.3,但0.05+0.25等于0.3
(2)数值范围
最小数:Number.MIN_VALUE
最大数:Number.MAX_VALUE
超出范围最大正无穷:Infinity
超出范围最大负无穷:-Infinity
(Infinity不能参与计算)
可使用isFinite判断是否有穷
(3)NaN
用于本来要返回一个数值但未返回数值的情况。例如:任何数值除以0都返回NaN,因此不会影响其他代码的执行。
任何涉及NaN操作,结果都是NaN;
NaN与任何值都不相等,包括它本身。
可使用isNaN判断,该函数先尝试将不是数值的转换为数值,不能转换为数值的都会返回true。
若是基于对象调用isNaN,首先调用函数的valueOf方法,然后确定该方法返回的值是否可以转换为数值,如果是NaN,则基于NaN再调用toString方法,再测试返回值。
类型 | 是否有属于自己的原型valueOf方法 |
---|---|
Undefined | 无 |
Null | 无 |
Number | 有,Number.prototype.valueOf |
String | 有,String.prototype.valueOf |
Boolean | 有,Boolean.prototype.valueOf |
Object | - |
(4)数值转换
三个函数把非数值转换为数值:Number()(用于任何数据类型)、parseInt()、parseFloat()(字符串->数值)
Number:
转换字符串:
- 只包含数字(可以有正负号),转换为十进制(注意“011”转换为“11”),也可以转换为十六进制;
- 空字符串->0;
- 否则->NaN。
parseInt:
由于Number在转换字符串时复杂且不是很合理,因此常用parseInt
首先,忽略空格,直到第一个字符,如果不是数字或正负号那么NaN,否则继续解析直到遇到非数字字符或到末尾。
可以识别十进制、八进制、十六进制,但到了ECMAScript 5引擎则不具备解析八进制的能力。还可以传入基数,此时可以忽略前缀。
如果能始终将10作为第二个基数,则是很好的习惯。
parseFloat:
和上面类似,只是说第一个小数点好使!且只能解析十进制数。遇到整数会返回整数。
6.String
(1)转义字符
可以出现在字符串中任意位置,被当做一个字符来解析。
(2)特点
字符串不可变,先销毁,再创建。
(3)转换为字符串
toString();(null和undefined没有此方法)
注意,在调用字符的toString方法时,可以传递一个输出数值基数的方法。
String();(任何类型)
有toString则调用它,没有则返回“null”或“undefined”
7.Object
数据和功能的集合,new加上对象名创建,或new Object()创建自定义对象。
操作符
ECMAScript操作符与众不同之处是,它能适应于很多值,不过在应用于对象时,相应的操作符先调用valueOf再调用toString。
1.一元操作符
递增递减操作符
前置递增递减操作变量的值在语句被求值前改变,后置则之后。
不仅适用于整数,还适用于字符串、布尔值、浮点数、对象。
一元加减
+:相当于Number()
-:相当于+的取负
2.位操作符
ECMAScript中所有数值按照IEEE-754的64位格式存储,但位操作符不直接操作64位的值,而是先转换成32位,操作后,再转换为64位。
有符号数:正数0开头,负数1开头(补码=正数反码+1)。
在对特殊的NaN和Infinity位操作时,这两个值都被当做0来处理。
如果对非数值应用位操作时,会先使用Number()转换成数值,然后应用位操作。
按位非
返回反码。操作数负值-1
按位与
按位或
按位抑或
左移
0来填充。且左移不会影响操作数的符号位。
有符号右移
符号位的值来填充。且右移不会影响操作数的符号位。
无符号右移
0来填充。会影响符号位。
3.布尔操作符
逻辑非
可应用于任何值
逻辑与
可应用于任何值,短路操作。
对象就相当于true了,还有null、NaN、undefined都返回原有的这几个类型。当然也会返回对象。
不能在逻辑与中使用未定义的值。
逻辑或
可应用于任何值,短路操作。
对象就相当于true了,只有两者都为null、NaN、undefined才会返回原有的这几个类型。当然也会返回对象。
本书中会经常采用这种赋值语句模式,来避免为变量赋null或undefined。
4.乘性操作符
乘法、除法、求模。
使用Number()自动类型转换。
乘法
Infinity*0=NaN
除法
Infinity/Infinity=NaN
0/0=NaN
(非0有限数)/0=(+/-)Infinity
求模
Infinity%Infinity=NaN
Infinity%(非0有限数)=NaN
(非0有限数)%0=NaN
5.加性操作符
加法
对象、数值、布尔值会调用toString方法
减法
如果有操作数是字符串、布尔值、null、undefined,则先调用Number()转换为数值之后,再操作,对象操作与之前一样。
6.关系运算符
一般都是进行数值转换再比较,但字符串不同,如果有两个字符串**比较的是对应字符编码的值。
任何数与NaN比较,结果都是false。
7.相等操作符
相等和不相等——先转换再比较
全等和不全等——仅比较不转换
相等和不相等
一般都是进行数值转换再比较。但null和undefined不能转。
null=undefined返回true
有一个NaN则==返回false
如果两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则返回true
全等和不全等
null===undefined返回false哦!
由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等与不全等操作符。
8.条件操作符
?:
9.赋值操作符
复合赋值
10.逗号操作符
在用于赋值语句时,逗号操作符返回最后一项:
var num=(5,4,3,6,1) //num值是1
语句
1.if
2.do-while
3.while
4.for
由于ECMAScript中不存在块级作用域,因此,在循环内部定义的变量也可以在外部访问到。但要注意自己写的时候,要以表义清晰为标准。
5.for-in
用来枚举对象的属性,由于ECMAScript中对象属性没有顺序,因此,访问次序因浏览器而异。
如果要迭代的对象为null或undefined,曾经会抛出错误,但现在只是不执行循环体。所以,最好先检测一下对象。
6.label
添加标签,可以在将来由break或continue引用,一般都要与for等循环语句配合使用。并且最好使用描述性的标签。
7.break和continue
8.with
将代码的作用域设置到一个特定的对象当中。
定义with语句的作用主要是:简化多次编写同一个对象的工作。
在with语句代码块内部,每个变量首先被认为是一个局部变量,如果在局部环境中找不到该变量的定义,就会查询with对象中是否有同名属性。
由于大量使用with语句会导致性能下降,也会给代码调试造成困难,因此在开发大型应用程序时,不建议使用with语句。
9.switch
首相,可以使用任何数据类型(其他语言有类型限制);其次,每个case的值不一定是常量,可以是变量,甚至是表达式。
switch语句在比较的时候使用的是“全等操作符”。
函数
function functionName(arg0,arg1,...){}
同样,js也是遇到return语句立刻退出。
若return不带返回值,函数将返回undefined。这种是用在需要停止函数又不需要返回值时。
要么让函数始终都返回值,要么让函数永远不返回值,否则,时而返回时而不返回,会给调试带来很大不便。
理解参数
不介意传进来几个参数,因为接收的参数始终以arguments数组形式存储,可以使用arguments[0]等形式访问参数。还可以使用arguments.length。且arguments对象中的值会自动反映到对应的命名参数,但他们的内存空间是独立的,只是值同步。
- “命名参数只为提供便利,但不是必需的。”
没有传递值的命名参数将自动被赋予undefined。
严格模式对如何使用arguments对象做了限制。自行查阅资料。
- 注意:
ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。
没有重载
如果定义了两个名字相同的函数,则该名字只属于后定义的函数,因为覆盖了。