基本概念
语法
- 对大小写敏感
- 采用驼峰命名风格
- 使用C风格的注释
//单行注释
/*
* 多行注释
*
*/
- 严格模式,一种不同的解析与执行模型
- 启动方式:在顶部添加代码
"use strict" - 什么是解析
- 什么是执行
- 严格模式究竟会怎么样
- 启动方式:在顶部添加代码
- 语句
- 单句结尾建议使用分号
- 使用花括号代码块
- 始终在控制语句中使用代码块
关键字和保留字
具体略去不表,查文档即可
不要使用关键字和保留字作为标识符和属性名
变量
JS中变量仅仅是一个用于保存值的占位符,没有变量类型所带来的限制
- 变量的声明方式(未初始化):
var message - 变量的声明方式(直接初始化):
var message="hi"
未经过初始化的变量,会保存一个特殊的值:undefined
与变量有关的另一个需要注意的地方就是变量的作用域
通过var操作符定义的变量都将成为定义该变量的作用域中的 “局部变量”
- 若var操作符在function函数中,那么这个变量就是局部变量,在函数退出后就会被销毁。
- 若var操作符在函数外,
<script>内,那么这个变量就是全局变量,在网页关闭后被销毁。
略去var操作符创建全局变量 赋值给尚未进行声明的变量
carname="Volvo";
数据类型
JS的数据类型由5种基本数据类型:Undefined、Null、Boolean、Number、String和1种复杂数据类型:Object组成。
检测给定变量的数据类型:typeof操作符
- null:已声明的变量,变量保存一个空对象指针
- undefined:表明未声明的变量
- 已声明的变量,强制进行初始化
Undefined类型
该类型只有一个值:undefined。用于表示使用var声明的但未进行初始化的变量。
由于typeof操作符对尚未声明的变量和已声明未初始化的变量的返回结果一致,都是undefined。所以强制显式地初始化变量是必须的,因为当通过typeof操作符进行检测时就能够知道被检测的变量还没有进行声明。
Null类型
该类型只有一个值:null,表示一个空对象指针。通过typeof操作符返回object
undefined值派生自null值,它们的相等性测试要返回true
null值的用途:只要,当变量的使用目的是用于保存对象,在这个对象还没有真正保存对象时,就应该明确地让该变量保存null值。
Boolean类型
该类型只有两个字面值:true和false
JS中所有类型的值都有与这两个Boolean值等价的值。转换规则如下:
| 数据类型 | 转换为true的值 | 转换为false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | 空字符串 "" |
| Number | 任何非零数字值 | 0和NaN |
| Object | 任何对象 | null |
| Undefined | 不适用 | undefined |
Number类型
字面量格式支持十进制var intNum=55,八进制var octalNum=070和十六进制var hexNum=0xA。
其中八进制字面量的第一位必须是0(严格模式下不支持),十六进制的前两位必须是0x。在进行算术计算时,上述数值最终都将被转换成十进制的数值。
浮点数:
- 浮点数的表示方法
var floatNum=1.1 - JS会智能地将浮点数值转换为整数值。
- 用科学计数法表示浮点数
var floatNum=3.125e7 - JS中的浮点数采用IEEE754规格,因此会存在计算精度问题。所以,永远不要测试某个特定的浮点数值。
Number类型的数值范围:Number.MIN_VALUE(通常是5e-324)~Number.MAX_VALUE(通常是1.7976931348623157e+308 )
超出数值范围的表示:Number.NEGATIVE_INFINITY(-Infinity)和Number.POSITIVE_INFINITY(Infinity)
NaN:表示一个本来要返回数值的操作数,没有返回数值的情况。
- 任何涉及NaN的操作都会返回NaN。
- NaN与任何值都不相等。
- 通过isNaN()函数进行判断
数值转换:
有3个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat()
Number(),用于任意数据类型,转换规则如下
- Boolean:true->1,false->
- 数字值,简单的转入和返回
- null->0;
- undefined->NaN
- 字符串遵循以下规则:
- 只包含数字,则将其转换为十进制数值
- 如果包含有效的浮点格式,则将其转换为对应的浮点数值
- 如果包含有效的十六进制格式,则将其转换为相同大小的十进制整数值
- 如果字符串是空的,则转换为0
- 其他情况,则转换为NaN
- 如果是对象,则先调用对象的valueOf()方法,依照前面的规则进行转换。若转换结果是NaN,则调用对象的toString,依照前面的规则进行转换。
String类型 字符串可以由双引号或单引号表示。
JS中的字符串是不可变的。
转换字符串的方式:toString()和转型函数String()
toString()在默认情况下以十进制格式返回数值的字符串表示。通过传递参数可以输出任意有效禁止格式表示的字符串值。toString()不支持null和undefined值。
String()的转换规则:
- 如果值有
toString()方法,则调用该方法。 - null->"null"
- undefined->"undefined"
Object类型
定义方式:var o =new Object()
Object类型是JS中所有实例的基础,Object的每个实例都具有下列属性和方法:
constructor:构造函数,保存着用于创建当前对象的函数。hasOwnProperty(propertyName):检查给定的属性是否在当前对象实例中。isPrototypeOf(object):检查该实例是否是传入参数object的原型propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in来枚举toLocaleString():返回对象的字符串表示,与执行环境的地区对应toString():返回对象的字符串表示valueOf():返回对象的字符串、数值或布尔值表示。
操作符
一元操作符
递增和递减操作符:直接借鉴C
一元加减操作符:非数值会按照Number()函数的规则进行转换。
位操作符
JS中所有数值都以IEEE754 64位格式进行存储。但位操作符的执行方式是先将64位转换成32位,然后执行操作,最后再将结果转换为64位。
布尔操作符
操作符首先会把它的操作数转换为一个布尔值,然后再进行布尔操作。
乘性操作符
非数值情况下,先使用Number()转型函数将其转换为数值。
加性操作符
如果两个操作数都是字符串,则进行字符串的拼接。如果其中一个操作数是字符串,则将另外一个操作数转换为字符串,然后再将两个字符串拼接起来。
如果想先对数值计算进行解析,应使用圆括号。
var num1=5;
var num2=10;
var message= "The result is" + (num1+num2);
关系操作符
关系操作符比较两个字符串时,比较的是两个字符串对应的字符编码值。
任何操作数与NaN进行关系比较,结果都是false
相等操作符
相等和不相等:先转换再比较。操作数都转换成数值类型进行比较。
全等和不全等(推荐使用):仅比较而不转换
条件操作符
variable=boolean_expr ? true : false
赋值操作符
逗号操作符
在一条语句中执行多个操作:var num1=1,num2=2,num3=3;
语句
if语句
类C,始终使用代码块。
if(condition)
{statement1}
else{statement2}
do-while语句
后测试循环语句。类C
do{
statement;
}while(expr);
while语句
while(expr){
statement;
}
for语句
类C
var count=10;
for(var i=0;i<count;i++){
alert(i);
}
for-in语句
迭代语句,用于枚举属性
for(property in expression){
statement;
}
为了保证最大限度的兼容性,在使用for-in语句前,先检测确认该对象的值是否是null或undefined。
break和continue
with语句
将代码的作用域设置到一个特定的对象中。不建议使用。
switch语句
类C。
特色之处在于:
- 可以在switch语句中使用任何数据类型
- 每个case的值不一定是常量,可以是变量,甚至是表达式。
- switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。
函数
函数的基本语法
function functionName(arg0,arg1,...,argN){
statements;
}
参数的理解
-
JS中函数的参数在内部是用一个对象
arguments来表示的。arguments对象拥有数组的行为。函数接收到的始终都是这个数组。 -
arguments对象只是拥有数组的行为,并不是数组的实例。
-
JS函数中命名的参数只是提供便利,但不是必须的。因为JS中没有函数签名的概念。因此JS中也没有函数重载功能。
- 可以利用
arguments对象实现重载
- 可以利用
-
arguments对象可以与命名参数一起使用。它的值永远与对应命名参数的值保持同步。但是arguments对象与命名参数的内存空间是相互独立的。arguments对象的长度是由传入的参数个数决定的。
-
没有传递值的命名参数将自动被赋予undefined值