JavaScript
三、基本概念
3.1 语法
3.1.1 区分大小写
3.1.2 标识符
- 变量、函数、参数、属性的名称
- 有字母、下划线、数字、$组成,但不能以数字开头
- 推荐使用驼峰命名(第一个字符小写)
3.1.3 注释
- 单行注释 //
- 块注释
第2、3行的 * 号非必需,提高注释的可读性
/*
* 2
* 3
*/
3.1.4 严格模式
- ECMAScript 5引入的概念
- 启用严格模式
编译指令
<script>
"use strict";//即启用严格模式
</script>
3.1.5 语句
- 不要求分号结尾,但尽量使用,保证压缩代码时不会出错
- 尽量使用代码块,意图清晰
3.2 关键字和保留字
- 不能选取关键字和保留字作为标识符
3.3 变量
- javascript的变量为松散类型,改变变量值的时候可以同时改变数据类型
- 可以用一条语句定义多个变量
- var message = “hi” , found =false , age = 29 ;
- 可以用一条语句定义多个变量
- 未声明直接赋值会成为全局变量,但在严格模式下会报错
- message = " hi "
- 变量污染
全局变量过多,会增大与其他JS应用程序中的全局变量产生冲突的几率- 创建一个唯一的全局变量,相当于一个名称空间,之前的全局变量可以作为该名称空间变量对象的一个属性
- 函数将全局变量包裹
3.4 数据类型
- 简单数据类型
- Undefined
- Null
- Boolean
- String
- Number
- 复杂数据类型
- Object
3.4.1 typeof 操作符
- 返回字符串
- “undefined”
- 未初始化
- 未声明直接使用
- “boolean”
- “number”
- “string”
- “object”
- 对象
- null
- “function”
- “undefined”
3.4.2 Undefined类型
- 该类型只有一个数据值 undefined
- 由于未声明的变量使用 typeof 操作符时也会返回 “undefined”,所以还是应该显式初始化变量,这样当typeof操作符返回"undefined"时就能明确知道是未声明的变量
- 这里的显示初始化变量是指
- 将String类型赋值为空字符串
- 将Number类型赋值为0
- 将Boolean类型赋值为false
- 将Object类型赋值为null
- 这里的显示初始化变量是指
3.4.3 Null类型
- 该类型只有一个数据值 null
- 空指针对象
- 意在保存对象的变量还没有真正保存对象
- undefined == null 返回true
- undefined派生自null,比较时会转换操作数
3.4.4 Boolean类型
- 任意数据类型都可以通过调用 Boolean() 函数转化为Boolean类型
数据类型 | true | false |
---|---|---|
String | 非空字符串 | 空字符串 |
Number | 非零数字 | 0和NaN |
Object | 任意对象 | null |
Undefined | – | undefined |
3.4.5 Number类型
- 进制
- 八进制
- 字面值第一位必须是0
- 在严格模式下会抛出错误
- 十六进制
- 字面值以0x开头
- 八进制
3.4.5.1 浮点数值
- 若浮点数值本身表示的是整数,则该值自动转换为整数
var floatNumber = 10.0;
alert(floatNumber);//10
- 计算有误差
var a= 0.1;
var b=0.2;
alert(a+b);//0.30000000000000004
3.4.5.2 数值范围
- 超过范围会自动转化为+Infinity / -Infinity
- isFinity() 返回Bollean类型
- 最大/最小值
- Number.POSITIVE_INFINITY
- Number.NEGATIVE_INFINITY
3.4.5.3 NaN
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等,包括NaN本身
- isNaN()
参数可以是任意类型,会先尝试转化为数值- 参数为object
- 先调用valueOf(),判断是否可以转化为number
- 若不能,则将valueOf的返回值作为参数调用toString()方法,再判断返回值
- 参数为object
3.4.5.4 数值转换
- Number()
可用于任意类型- bool
- null,返回0
- undefined,返回NaN
- string
- 只包含数字 (忽略前后空格)
- 转换为十进制,忽略前导0
- 包含十六进制格式
- 空字符串(忽略前后空格),返回0
- 除此之外,返回NaN
- 只包含数字 (忽略前后空格)
- object
- valueOf
- toString() 再使用string规则
- parseInt()
只用于处理string类型,转化依据:是否符合数值模式,即尽可能把数值转化出来- 会自动去除前导空格
- 从第一个是数字的字符开始,到第一个不是数字的字符结束,即提取第一个数字段。
- 进制数
- 不显式指定
- 十六进制正确解析
- 八进制
- ECMAScript3将0开头的数字解析为八进制
- ECMAScript5将0开头的数字解析为十进制,即0
- 显式指定
- parseInt ( " 056 " , 8 );
- 不显式指定
- 没有数字段则返回NaN
- parseFloat()
只用于处理string类型- 只能解析十进制数,包括浮点数和整数
- 整数会返回整数
- 始终忽略前导0
3.4.6 String类型
3.4.6.1 字符字面量
- 转义字符
作为一个字符长度
3.4.6.2 字符串不可变
生成新字符串并销毁原字符串
3.4.6.3 转换为字符串
- toString()
- 除了null和undefined类型外都能调用
- 可接收参数设置数值的进制格式
- String()
- 能调用其 toString() 方法则调用,即Boolean、Number、String、Object类型
- null,返回 " null "
- undefined,返回 " undefined "
3.4.7 Object类型
- 通过 new Object() 定义
- 是所有对象的基础,即所有对象派生自Object类型
- 具有的属性和方法
- constructor
- 保存构造函数,即Object()
- hasOwnProperty(propertyName)
- 判断给定属性是否在当前实例中存在
- 给定属性以字符串格式指定
- isPrototypeOf(object)
- 是否为给定对象的原型
- propertyIsEnumerable(propertyName)
- 给定属性是否能使用 for - in 语句枚举
- toLocaleString()
- toString()
- 返回对象的字符串表示
~~* 对于对象而言- 返回 [obejct class] 形式的字符串
- class可以区分内置对象类型~~
- 返回对象的字符串表示
- valueOf()
- 返回对象的String、Number、Boolean表示,即相应的简单数据类型
- constructor
3.5 操作符
3.5.1 一元操作符
- 都转化为数值
3.5.1.1 递增和递减操作符
对任何类型的变量都可以使用
- 类型
- 前置型 ++a
- 后置型 a++
- String、Number、Boolean类型
- 转化为数值再计算
- 对象
- 先调用valueOf()
- 再调用toString()
3.5.1.2 一元加、减操作符
- 非数值调用Number()
3.5.2 位操作符
- 负数以二进制补码的形式保存
- 二进制补码
- 反码加1
- 二进制补码
- 非数值会调用Number(),但NaN、Infinity会当作0
3.5.2.1 按位非 ~
3.5.2.2 按位与 &
3.5.2.3 按位或 |
3.5.2.4 按位异或 ^
- 不同时为1
3.5.2.5 左移 <<
符号位不改变,相当于乘以2的倍数
3.5.2.6 有符号右移 >>
符号位不改变,相当于除以2的倍数
3.5.2.7 无符号右移 >>>
3.5.3 布尔操作符
3.5.3.1 逻辑非 !
可用于任何值,必定返回Boolean
- 两次逻辑非相当于调用 Boolean() 函数
3.5.3.2 逻辑与 &&
不一定返回bool类型
- 返回第一个操作数的情况(不能往下走)
- null
- NaN
- undefined
- string、boolean、number调用Boolean() 结果为false的情况
- 否则返回第二个操作数
3.5.3.3 逻辑或 ||
不一定返回bool类型
- 返回第二个操作数的情况(能往下走)
- 当第一个操作数为
- null
- NaN
- undefined
- string、boolean、number调用Boolean()返回false的情况
- 当第一个操作数为
- 否则返回第一个操作数
3.5.4 乘性操作符
- 非数字时调用Number()
3.5.4.1 乘法
- Infinity与0相乘,结果是NaN
3.5.4.2 除法
- 0除0,结果是NaN
- 非零有限数除以0,结果是Infinity或-Infinity
3.5.4.3 求模
- 商为Infinity或者NaN的,余数是NaN
- 商为0的,余数是被除数
3.5.5 加性操作符
3.5.5.1 加法
- +0加-0,结果是+0
- 有一个操作数是字符串,则为字符串运算,否则为数值运算
3.5.5.2 减法
- +0减+0,结果是+0
- +0减-0,结果是-0
- -0减-0,结果是+0
- 只有数值运算
3.5.6 关系操作符
- 必定返回Boolean
- 只有当两个操作数都是字符串时,进行字符串ascii码的比较,否则进行数值比较
- 任何与NaN进行比较都为false
3.5.7 相等操作符
3.5.7.1 相等和不相等
先转换为数值,再比较
- null和undefined不进行操作数转换
- null==undefined,返回true
- NaN和NaN不相等
- 两个操作数都是对象,则比较是否指向同一个对象
3.5.7.2 全等和不全等
不转换直接比较,真正意义上的相等
- ===
- !==
- null===undefined,返回false
3.5.8 条件操作符
相当于三目运算符
3.5.9 赋值操作符
- 复合赋值
3.5.10 逗号操作符
- 可用于声明
- 可用于赋值
返回表达式中的最后一项- var num=(5,1,4,8,0)即var num=0
* void运算符
返回undefined
* delete
对象属性、数组元素、变量
* 使用var声明的变量无法删除
* 删除不存在的对象成员或者删除的不是对象属性、数组元素以及变量,会返回true
* in
判断左操作数是否是右操作数中的成员,右操作数为对象或数组
* 中括号运算符 []
* 数字字符串会转化为数字
* 对象先调用toString()方法
* bool值转化为对应的string类型
3.6 语句
3.6.1 if语句
3.6.2 do-while语句
3.6.3 while语句
3.6.4 for语句
- 不存在块级作用域
{
var i = 10;
}
alert(i);//10
3.6.5 for-in语句
- for(var propName in window) { … }
- 遍历对象的属性
- 对象的值为null和undefined时在ECMAScript 3中会抛出错误,在ECMAScript 5中会忽略,不执行
3.6.6 label语句
- label:statement
3.6.7 break和continue
- break
- 退出label标注的循环体
var num = 0;
outermost:
for(var i=0;i<10;i++)
{
for(var j=0;j<10;j++)
{
if(i==5&&j==5){
break outermost;
}
num++;
}
}
alert(num);//55
- continue
- 跳过并执行label标注的循环体的下一循环
3.6.8 with语句
将代码作用域设置到一个特定的对象中,简化多次编写同一个对象。
var qs=location.search.substring(1);
var hostName=location.hostname;
var url=location.href;
with(location){
var qs=search.substring(1);
var hostName=hostname;
var url=href;
}
- with (expression) statement;
- 变量首先被认为是局部变量
先statement中查找局部变量的定义,若找不到则查找expression中的对象中的属性 - 大量使用会导致性能下降,大型应用程序不建议使用
- 严格模式下无法使用
- 变量首先被认为是局部变量
3.6.9 switch语句
- case的值可以是变量和表达式
- switch与case进行比较时使用的全等操作符
3.7 函数
不需要定义返回值类型,可以有返回值也可以没有
- function functionName(arg0, arg1, … argN){ statements }
- 没有指定返回值的函数返回的是一个特殊的undefined值,即直接return,得到的是undefined
3.7.1 参数
- 参数按实际接收得到的变量进行计算,所有参数在内部都是用arguments对象表示
- arguments对象只是与数组类似,但不是Array的实例
- 形参定义的作用就是为参数显式命名,方便,形参数量与实际参数数量无关,多传也可以,少传也可以,不传都可以。
- arguments对象中值的修改,会作用于命名参数的值
- 二者不是引用的关系,内存空间独立,只是同步的关系
- 单向同步,形参修改不会影响arguments对象的值
- 严格模式下,同步不起作用
function doAdd(num0,num1){
//"use strict"
arguments[1]=10;
alert(arguments[0]+num1);
}
doAdd(1,2);//11
//严格模式
//doAdd(1,2);//3
- 不能通过引用传参,所有参数传递都是值传递
3.7.2 没有重载
- 没有函数签名的概念
- 可以利用arguments对象的length属性间接实现内部重载