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”

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类型
数据类型truefalse
String非空字符串空字符串
Number非零数字0和NaN
Object任意对象null
Undefinedundefined

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()方法,再判断返回值
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()
    • 除了nullundefined类型外都能调用
    • 可接收参数设置数值的进制格式
  • 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表示,即相应的简单数据类型

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运算符
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回undefined
* delete
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对象属性、数组元素、变量
	* 使用var声明的变量无法删除
	* 删除不存在的对象成员或者删除的不是对象属性、数组元素以及变量,会返回true
* in
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;判断左操作数是否是右操作数中的成员,右操作数为对象或数组
* 中括号运算符 []
	* 数字字符串会转化为数字
	* 对象先调用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) { … }
    • 遍历对象的属性
  • 对象的值为nullundefined时在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属性间接实现内部重载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值