第3章基本概念

3.1语法

         C及其他类C语音(Java和Perl)的语法。

3.1.1区分大小写

         变量名text和Text为两个不同变量。

3.1.2标识符

         ECMAScript标识符采用驼峰大小写格式:即第一个字母小写,剩下每个单词的首字母大写,如:firstSecond。

3.1.3注释

         单行注释 //

         块级注释 /*……*/

3.1.4严格模式

1)       严格模式是为JavaScript定义了一种不同的解析与执行模式。

2)       启用方式:1.整个脚本启用:在顶部添加“use strict”

  2.函数启用:在函数内部的上方如:

         function doSomething(){

“use strict”;

}

3.1.5语句

1)       ECMAScript中的语句以分号结尾,不要省掉。

2)       可以使用C风格的语法把多条语句组合到一个代码块中,即以{开头,以}结尾,如:

if(test){

         test=false;

}alert(test);

始终在控制语句中使用代码,即使只有一个语句。

3.2关键字和保留字

         最好不作为标识符和属性名。

3.3变量

1)       定义变量时要用var操作符,后跟变量名,如var message,该变量可用来保存任何值。未经初始化的变量会保存一个特殊的值—undefined。

2)       可初始化 如var message=”hi”;

3)       var操作符定义的变量将成为定义,该变量的作用域中的局部变量。若在函数中用var定义一个变量,函数退出后,该变量被销毁。

4)       可省略var,创建一个局部变量。(不推荐)。

5)       可使用一条语句定义多个变量,把每个变量用逗号隔开,如:var message=”hi”;found=fales;age=29;

6)       严格模式下,变量名不能为eval和argument。

3.4数据类型

         5种简单数据类型:Undefined,Null,Boolean,Number,String。一种复杂数据类型:Object。

3.4.1typeof操作符

         type来检测给定变量的数据类型。

1)       可能返回的字符串

Undefined——如果这个值未定义

Number——如果这个值是数值

String——如果这个值是字符串

Object——如果这个值是对象或Null

Function——如果这个值是函数

alert(typeof message);

alert(typeof (message));

2)       typeof操作符的操作数可为变量、数值。()不是必须的。

3.4.2 Undefined类型

1)       只有一个值,即特殊的Undefined。使用var声明变量未初始化时,这时的值为Undefined。

2)       未初始化和未声明的变量执行typeof操作符会返回Undefined。

3.4.3Null类型

1)       只有一个值。即Null。

2)       typeof操作符检测时会返回“Object”。

3)       若定义的变量准备在将来用于保存对象,最好将该变量初始化为Null。

3.4.4Boolean类型

1)       有两个字面值:true、false。true不等于1,false不等于0。

2)       true、false区分大小写。

3)       ECMAScript中所有类型的值都有与这两个Boolean值相等的值。

4)       要将一个值转换为其对应的Boolean值,可调用转型函数Boolean()。

3.4.5Number类型

1)       十进制数直接输入。var intNum=55;

2)       八进制数的第一位必须为0(零),然后是0~7,若字面值中的数值超出了范围,前0被忽略,后面的值作十进制数值解析。

3)       类型转换,Number(),parseInt() 和 parseFloat()。第一个函数可以应用于任何数据类型,另两个函数专门用于把字符串转换成数值

3.4.6String类型

1)       值:由单引号或双引号括起来的字符序列

2)       出现场景:定义

3)       类型转换,有两种方法,String() 和 toString()

3.4.7Object类型

1)       值:一组属性的集合

2)       Boolean-true

Number-NaN

String-"[object Object]"

3.5操作符

javascript的操作符有一元操作符、位操作符、布尔操作符、乘性操作符、加性操作符、关系操作符、相等操作符、条件操作符、赋值操作符。其中值得注意的是,一元操作符和相等操作符都有可能改变操作数的数值类型。J

3.5.1一元操作符:

递增操作符 ++

递减操作符 --

正数 +

负数 –

递增和递减操作符遵循的规则.

1.在应用于包含有效数字的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。

2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。

3.在应用于布尔值false/true时,先将其转换为0再执行加减1的操作。布尔值变量变为数值变量。

4.在应用于浮点数值时,执行加减1的操作。

5.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值,然后对该值应用前面的四条规则。如果结果是NaN,则在调用toSring()方法后再应用前面的规则。对象变量变成数值变量。

3.5.2位操作符

位操作符用于最基本的层次上,我们一般比较少用到。ECMAscript中所有数值都以IEEE-754 64位格式存储,但是位操作符并不直接操作64位的值,而是先将64位转换成32位的整数,然后执行操作,最后将结果转换回64位。这会带来一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,两个值都会被当做0来处理。

按位非 ~

按位与 &

按位或 |

按位异或 ^

左移 <<

有符号右移 >>

无符号右移 >>>

3.5.3布尔操作

布尔操作用来测试两个值的关系

逻辑非 !

逻辑与 &&

逻辑或 ||

3.5.3.1逻辑非(!)

只操作1个操作数,无论操作数是什么数据类型,都返回一个布尔值。逻辑非操作不会改变操作数的数据类型。

逻辑非(!)操作符的规则:

1.如果操作数是一个对象,则返回false。

2.日字旁操作数是一个空字符串,则返回true。

3.如果操作数是一个非空字符串,则返回false。

4.如果操作数值是0,则返回true。

5.如果操作数是任意非0数值(包括Infinity),返回false。

6.如果操作数是null,返回true。

7.如果操作数是NaN,返回true。

8.如果操作数是undefined,返回true。

3.5.3.2逻辑与(&&)

逻辑与有两个操作数,它可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。

逻辑与(&&)操作符的规则

1.如果第一个操作数是对象,则返回第二个操作数。

2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时才返回这个对象。

3.如果两个操作数都是对象,则返回第二个操作数。

4.如果有一个操作数时null,则返回null。

5.如果有一个操作数时undefined,则返回undefined。

逻辑与是一种短路操作,如果第一个操作数能够决定结果(如null,undefined),那么就不会对第二个操作数求值。

3.5.3.3逻辑或(||)

逻辑或的操作数有两个,如果其中有一个操作数不是布尔值,逻辑或也不一定返回布尔值,它遵循的规则如下:

1.如果第一个操作数是对象,则返回第一个操作数;

2.如果第一个操作数求值结果为false,则返回第二个操作数;

3.如果两个操作数都为对象,则返回第一个操作数;

4.如果两个操作数都是null,则返回null;

5.如果两个操作数都是NaN,则返回NaN;

6.如果连个操作数都是undefined,则返回undefined。

可见逻辑或也是一种短路语句,如果第一个操作数的求值结果为true则不会对第二个操作数进行求值。

注意:由以上规则可知,逻辑操作符均不会改变操作数的数据类型。

利用逻辑与来避免为变量赋null或者undefined的值。

3.5.4乘性操作符

乘性操作符和其他语言中的乘性操作符用法类似,只不过在操作数为非数值的情况下会执行自动的类型转换。即参与乘性计算的某个操作数不是数值,会先使用Number()转型函数将其转换为数值。但是乘性操作不会改变操作数数值类型。

乘法(*)

除法(/)

求模(%)

3.5.5加性操作符

加性操作符在操作数都为数值的时候执行常规的加减法操作,在为非数值时会有特殊的转化规则。但是同乘性操作符一样加性操作符不会改变数值类型。

 

加法(+)

减法(-)

3.5.5.1加性操作符

加性操作符在有操作数为字符串时遵循以下规则:

1.如果两个操作数都为字符,则将第二个操作数与第一个操作数拼接起来;

2.如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来;

3.5.5.2减性操作符

1.如果有一个操作数是字符串,布尔值、null或者undefined,则先调用Number()方法,然后再根据数值减法规则执行减法计算。

2.如果有一个操作数是对象,则调用对象的valueOf()方法取得该对象的数值。如果对象没有valueOf()方法方法,则调用tostring()方法并将得到的字符串转换为数值。

3.5.6关系操作符

小于(<)

大于(>)

小于等于(<=)

大于等于(>=)

3.5.7相等操作符

相等(==)

不相等(!=)

全等(===)

不全等(!==)

1)       相等和不相等

这组操作符是先转换再比较,即操作符会改变操作数的数值类型。

1.如果有一个操作数是布尔值,则在比较之前会转换为数值;

2.一个操作数是字符,另一个是数值,那么在比较相等性之前会将字符串转换为数值再进行比较;

3.如果一个操作符是对象,另一个不是,则调用valueOf()方法,将得到的结果进行比较。

4.如果两个都是对象,则比较是否是同一个对象,如果两个操作数都指向同一个对象,那么认为它们相等。

2)       全等和不全等

全等和不全等操作符不会改变操作数的数值类型。

3.5.8条件操作符

条件操作符会根据boolean_expression的求值结果来决定给变量value赋哪个值,求值为真是赋true_value值,为假时赋false_value值。

3.5.9赋值操作符

赋值(=)

乘/赋值(*=)

初/赋值(/=)

模/赋值(%=)

加/赋值(+=)

减/赋值(-=)

左移/赋值(<<=)

无符号右移/赋值(>>>=)

有符号右移/赋值(>>=)

3.5.10逗号操作符

逗号操作符用于在一条语句中执行多个操作。赋值时返回表达式的最后一项。

3.6语句

3.6.1.if语句

if (condition) statement1 else statement2

其中的condition条件可以是任意表达式,而且对这个表达式的求值结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。如果对condition求值的结果为true,则执行statement1,如果对condition求值结果为false,则执行statement2。这两个语句既可以是一行代码,也可以是一个代码块(推荐)。

3.6.2.switch语句

switch(expression) {

    case value: statement

       break;

    case value: statement

       break;

    case value: statement

       break;

    default: statement

}

switch语句中每一个case的含义是:"如果表达式等于这个值value,则执行后面的语句statement"。而break会导致代码执行跳出switch语句。如果省略break关键字,就会导致执行完当前case后,继续执行下一个case。最后的default关键字则用于在表达式不匹配前面任何一种情形时,执行机动代码(因此,也相当于一个else语句)。

3.6.3.do-while语句

do {

    statement

} while (expression);

3.6.4while语句

while(expression) statement

3.6.5.for语句

它具有在执行循环之前初始化变量和定义循环后要执行代码的能力。

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

    alert(i);

}

3.6.6for-in语句

for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性

for (var prop in window) {

        console.log(prop);

    }

ECMAScript对象的属性没有顺序。因此通过for-in循环输出的属性名是不可预测的,具体来讲,所有属性都会被返回一次,单反毁的先后次序可能会因浏览器而异。建议在使用之前,先检测确认该对象的值不是null或unedfined。

3.6.7

break语句

立即退出循环

continue语句

退出当前正在执行的循环代码,然后开始继续循环。

return语句

可指定返回值,也可不指定(此时返回undefined)。

1.return语句后停止并立即退出函数,return后面的语句也永远不会执行

2.return语句只能在函数体内出现,如果不是的话会自动报语法错误

3.7函数

在JavaScript里有两种定义函数的方法

 

函数声明        function 函数名称 (参数:可选){ 函数体 }

函数表达式        function 函数名称(可选)(参数:可选){ 函数体 }

在JavaScript中,每个函数其实都是一个Function对象。

函数总是会返回一个值,但是一个过程有可能返回一个值,也有可能不返回。(函数不是过程)

如果一个函数中没有使用return语句,则它默认返回undefined。要想返回一个特定的值,则函数必须使用 return 语句来指定一个所要返回的值。(使用new关键字调用一个构造函数除外)。

调用函数时,传递给函数的值被称为函数的实参(值传递),对应位置的函数参数名叫作形参。

如果实参是一个包含原始值(数字,字符串,布尔值)的变量,则就算函数在内部改变了对应形参的值,返回后,该实参变量的值也不会改变。

如果实参是一个对象引用,则对应形参会和该实参指向同一个对象。假如函数在内部改变了对应形参的值,返回后,实参指向的对象的值也会改变。

在函数执行时,this 关键字并不会指向正在运行的函数本身,而是指向调用该函数的对象。

所以,如果你想在函数内部获取函数自身的引用,只能使用函数名或者使用arguments.callee属性

(严格模式下不可用),如果该函数是一个匿名函数,则你只能使用后者。

posted @ 2017-02-21 10:53  胖胖的小王  阅读(163)  评论(0编辑  收藏  举报