第三章——基本概念

2016-05-27  本文已影响12人  26001a36aa12

语法


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:
转换字符串:

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中所有参数传递的都是值,不可能通过引用传递参数。

没有重载
如果定义了两个名字相同的函数,则该名字只属于后定义的函数,因为覆盖了。

上一篇下一篇

猜你喜欢

热点阅读