第3章 基本概念

205 阅读11分钟

语法

区分大小写:如函数名不能使用typeof,但可以使用typeOf。

标识符:指变量、函数、属性的名字,或者函数的参数。

标识符有如下规则:

  • 第一个字符必须是字母、下划线(_)或者美元符号($)。
  • 其他字符可以是字母、下划线、美元符号或者数字。
按照惯例,标识符一般采用驼峰大小写格式,第一个字母小写,剩下的每个单词首字母大写。

不能把关键字、保留字、true、false和null用作标识符。

注释

//     单行注释

/*
*          多行注释,中间2个*不是必须的,
*          之所以添加,是为了注释可读性。
*/

语句

ECMAScript中的语句以分号结尾。可以省略分号,但会影响性能(解析器需要时间去分析哪里应该插入分号),并且会导致删空格压缩时错误,因此任何时候都不建议删除。

多条语句放在{}中,单条最好也放在{}中,使代码更清晰。


关键字和保留字

书本第21页。


变量

松散类型,可以保存任何数据类型。

定义变量用var。

var message 像这样未经初始化的变量保存的是undefined。

初始化变量只是给变量赋一个值,并不会标记类型,所以可以:

var message="hi";
message=100; //有效,但不推荐

使用var操作符定义的变量为局部变量,省略了var则变为全局变量(很难维护,不建议这么做)。

定义多个变量可以用逗号分开:

var message="hi", 
    day=12,         
    xwt="sb";


数据类型

5种简单数据类型(也称基本数据类型):Undefined、Null、Boolean、Number、String

1种复杂数据类型(也称引用数据类型):Object

typeof 操作符——检测变量数据类型

对一个值使用typeof可返回如下字符串:

  • “undefined”——如果这值未初始化、这个值为undefined或者未声明的值
  • ”boolean“——如果这个值是布尔型
  • "string"——如果这个值是字符串
  • "number"——如果这个值是数值
  • "function"——如果这个值是函数
typeof 的操作数可以是变量也可以是数值字面量。对null使用typeof返回"object"

var message=100;
alert(typeof message);   //"number"
alert(typeof 95);        //"number"
alert(typeof null);      //"object"

1、Undefined类型

只有一个值:undefined

未初始化的变量,系统默认就给这个变量赋值undefined。

2、Null类型

只有一个值:null

表示空对象指针。

虽然alert(undefined==null)返回true但这两个值用途完全不同。

一般用于想要保存对象的变量还未真正保存对象,就应该明确地让变量保存null值。(推荐)

3、Boolean类型

值为true或者false

任何数据类型调用Boolean()函数都可以转换为Boolean类型,至于返回的是true还是false参考书本27页。

控制流语句(如if语句)会自动执行相应的Boolean转换。

4、Number类型

var intNum=10; //十进制
var octalNum=070; //八进制0
var hexNum=0xA; //十六进制0x

在进行算术时都转化为十进制。

浮点数:最高精度17位小数,但实际上浮点数不太精确,所以不要测试特定的浮点数值。可以用e简写,比如2.123e5表示212300。

var floatNum1=1.1
var floatNum2=1. //可以,但不推荐
var floatNum3=1.0  //解析为1

数值范围:可以用isFinite()函数测试该值是否在ECAMScript范围中。

NaN非数值。任何数字除以非数字都会返回NaN。NaN与任何值不相等,包括本身。

isNaN()函数判断这个值是否不能转为数值。如:

alert(isNaN(NaN)); //true 不能转换成数值
alert(isNaN("10")); //false 可以转换成数值

有3个函数可以把非数值转化为数值:

  • Number()
  • parseInt()  常用,只能解析为整数,可区分不同的进制
  • parseFloat()  只能解析为十进制

5、String类型

字符串,单引号、双引号无区别。

String数据类型包含特殊的字符字面量,如\n(换行)  \t  \b \r   \unnnn,也叫转义序列。转义序列都表示一个字符,如

var text="ni\n";
alert(text.length); //显示3

任何字符串的长度都可以通过其属性length获取。

把值转化为字符串:

  • toString()方法:除null和undefined值都有的一个方法。该方法有一个可选的参数,以表示不同的进制输出,默认为十进制:

var num=10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
  • String()函数:一般在不知道要转换的值是不是null或者undefined时使用。它的机制是如果该值有toString()方法就先调用该方法。

6、Object类型

ECAMScript中的对象其实就是数据与功能的集合。创建对象如下:

var o=new Object();
var o=new Object; //有效,但不推荐

Object类型所具有的任何属性和方法同样保存于更具体对象中,每个实例有下列属性和方法:

  • constructor:保存着用于创建当前对象的函数。
  • hasOwnproperty(propertyName):用于检查给定的属性在当前对象实例中。
  • isPrototypeOf(object):检查传入的对象是否是当前对象的原型。
  • propertyIsEnumerable(protertyName):用于检查给定的属性能否使用for-in枚举。
  • toLocaleString():返回对象的字符串表示。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象的字符串、数值、布尔值表示。通常与toString()返回值相同。
注:宿主对象不一定包含上面属性和方法。

操作符

操作数据值

一元操作符

只能操作一个数值。

①递增和递减操作符:前置时,变量的值在求值前被改变;后置时,变量的值在求值后被改变:

var age=29;var anotherAge=29;var age1=++age+1  var age2=anotherAge++ +1  alert(age1);  //31alert(age2);  //30

递增和递减操作符可用于字符串、布尔值、浮点数值和对象,执行前先将这些值转化为数值,最后操作结果也变成数值。

②一元加和减操作符

一元加放数值前面无影响,一元减放数值前面主要用于表示负数。

在对非数值进行操作时,会先像Number()转型函数一样对这个值进行转型,得到结果为数值。

位操作符

按内存中数值的位来操作数值。如果是非数值,则会自动使用Number()函数将值转化为数值,最后得到的结果也是数值。

ECMAScript中的数值以64位存储,但是在操作中会转为32位。负数是绝对值取反加1求得补码进行操作,但ECAMSpcript最后输出给我们看到的结果一般是绝对值的二进码再加上负号。

补码求真值时需先转化为原码(第一位和最后一位不变,中间取反)。

①按位非(~):返回反码

②按位与(&):两个数值对应位都为1时返回1,其余都为0

③按位或(|):两个数值对应位都为0时返回0,其余为1

④按位异或(^):两个数值对应位不相同时返回1,相同返回0

⑤左移(<<):将数值所有位左移指定位数,用0填充空位

⑥有符号右移(>>):将数值所有位右移指定位数,用符号位填充空位

⑦无符号右移(>>>):将数值所有位右移指定位数,用0填充空位

布尔操作符

①逻辑非(!):不是布尔类型的数据类型,都会先使用Boolean()转化位布尔值,然后求反

②逻辑与(&&):两个都是true才返回true。

逻辑与操作在有一个操作数不是布尔型的情况下不一定返回布尔值.。这种情况下,一般第一个操作数用Boolean()返回是false,则逻辑与返回第一个操作数。否则,返回第二个操作数。

逻辑与是短路操作,即第一个操作数是false,就不会对第二个操作数求值。

③逻辑或(||):一个操作数是true,则返回true。

逻辑或操作在有一个操作数不是布尔型的情况下不一定返回布尔值.。这种情况下,一般第一个操作数用Boolean()返回是true,则逻辑与返回第一个操作数。否则,返回第二个操作数。

逻辑或也是短路操作,即第一个操作数是true,就不会对第二个操作数求值。

乘性操作符

乘法、除法和求模。

在操作数为非数值时会自动通过Number()函数转型成数值。

注意一些操作数是特殊值的情况:P47

加性操作符

①加法

操作数有非数值时:是字符串则全都转为字符串拼接,无字符串则转为数字相加。(优先转化字符串拼接)

有字符串时,可以使用括号改变优先级,从而输出不同的结果。

var testBoolean1=true,    testBoolean2=false,    testNum1=5,    testNull=null,    testUdnefine,    testString1="3",    result1=testBoolean1+testBoolean2, //1    result2=testUdnefine+testNum1, //NaN    result3=testNum1+testNull1, //5    result4=testString1+testNum1, //"35"    result5=testString1+testNull, //"3null"    result6=testNull+testUdnefine //NaN

②减法

减法如果是非数值,则自动使用Number()函数转化为数值再操作,Object类型则使用valueOf()方法。

关系操作符

<,>,<=,>= 这几个操作符都返回一个布尔值。特别需要注意的点:

  • 如果两个操作数中有一个是数值或者布尔值,则另一个操作数转化为数值再比较。(优先转化数值比较)
  • 如果两个操作数都是字符串,则比较字符串对应的编码。

相等操作符

相等(==)和不相等(!=):先转换,再比较

优先转化为数值比较。

全等(===)和不全等(!==):仅比较,不转换

条件操作符

variable=boolean_expression ? true_value : false_value;

赋值操作符

var num=10;
num += 10; //复合赋值,即num=num + 10;

逗号操作符

多用于声明多个变量。用于赋值时,逗号操作符总会返回表达式中最后一项。

var num = (1,2,3); // num=3;

注意:转型函数都是构造函数,不改变本身,只是新建了一个。要改变本身,还需进行赋值。

语句

if 语句

if括号中的语句会自动转型为Boolean类型。

if(){
   ……
}else if(){
   ……
}else {
   ……
}

do-while 语句

var i=10;do {    i += 2;}while (i<10);alert(i);   //12

while 语句

var i=10;while(i<10){    i += 2;}alert(i);  //10

for 语句

for(var i=0;i<10;i++){    alert(i);}

for的条件能省略。能用for实现的,都能用while 语句实现。

for-in 语句

用来枚举对象的属性。对象变量是null或者undefined时,不执行,所以执行前先检测确定这个对象的值是不是null或者undefined。

for(var name in window){    document.write(name+" ");}

ECAMScript对象的属性没有先后顺序。

label 语句

用法   label : statement作用:可以在将来由break或continue语句引用。

一般与for等循环语句配合使用。

break 和 continue 语句

break语句会立即退出循环,强制执行循环后面的语句;continue语句也会立即退出循环,但退出后从循环的项部继续执行。使用lable语句,可以标记退出哪个循环。

var num=0;outLable:for (var i=0;i<10;i++){    for(var j=0;j<10;j++){      if(i==5&&j==5){          break outLable;      }      num++;    }}alert(num); //55

with 语句

主要用于将代码的作用域设置到一个特定的对象中。不建议使用。

switch语句

value要和expression全等,就选哪条

switch (expression){
    case value:statement;    
                break;
    case value:statement;
                break;    default: statemment;
}

switch在比较值时用的是全等符号,能用表达式求值后比较,但值不转型。

函数

封装多条语句,只要输入参数,便可返回想要的结果。

function functionName(ag0,ag1……){
    statement
}

函数中return之后的代码不会被执行。

return后面也可以不跟返回值return ;,这样就返回undefined。这种情况一般用在需要提前停止函数,又不需要返回值的情况。

命名的参数只是提供便利,不是必须的。

在函数体内通过arguments对象访问参数数组,从而获取传递给函数的每一个参数,如第一个元素是arguments[0]。

可以访问arguments的length属性获取有多少个参数传递给了对象。

arguments对象也可以和命名参数混着用,并且它的值始终与命名参数相等。

arguments对象的长度,由传入多少个参数决定。

没有传递值的命名参数的值为undefined。

ECMAScript中函数没有重载,所以如果定义了两个名字相同的函数,后定义的覆盖先定义。