javascript之基本概念

1. 语法javascript

1.1 匹配大小写java

javascript中的一切——变量,函数名和操做符——都是区分大小写的。express

1.2 标识符编程

标识符就是指变量,函数,属性的名字,或者函数的参数。命名规则与java同样。数组

1.3 语句编程语言

javascript中的语句以一个分号结束。固然也能够省略分号,若是省略分号,则由解析器肯定语句的结尾,咱们推荐使用分号结尾。函数

2. 关键字和保留字性能

2.1 关键字测试

break         
else         
new         
var         
case
finally
return
void
catch
for
switch
while
continue
function
this
with
default
if
throw
delete
in
try
do
instanceof
typeof



2.2 保留字this

abstract         
enum         
int         
short         
boolean
export
interface
static
byte
extends
long
super
char
final
native
synchronized
class
float
package
throws
const
goto
private
transient
debugger
implements
protected
volatile
double
import
public

3. 变量

定义变量时要使用var操做符,后跟变量名,以下所示:

var message;

该变量能够用来保存任何值(像这样未通过初始化的变量,会保存一个特殊的值:undefined)。有一点必须注意,即便用var操做符定义的变量将成为定义该变量的做用域中的局部变量。若是省略了var操做符,从而建立的是一个全局变量。

能够用一条语句定义多个变量,只要像下面这样把每一个变量(初始化或不初始化都可)用逗号分隔开便可。

var message = "hi",found = false, age = 29;

4. 数据类型

javascript中有5种简单数据类型(基本数据类型):Undefined,Null,Boolean,Number和String。还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。javascript不支持任何建立自定义类型的机制,而全部值最终都将是上述6种数据类型之一。

4.1 typeof操做符

typeof用来检测给定变量的数据类型。typeof操做符可能返回下列某个字符串:

  • "undefined"——若是这个值未定义

  • "boolean"——若是这个值是布尔值

  • "string"——若是这个值是字符串

  • "number"——若是这个值是数值

  • "object"——若是这个值是对象或Null

  • "function"——若是这个值是函数

如例:

var message = "some string";
alert(typeof message)

4.2 Undefined类型

Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,如例:

var message;
alert(message == undefined);        //true

4.3 Null类型

Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操做符检测null值时会返回“object”的缘由:

var car = null;
alert(typeof car);        //"object"

若是定义的变量准备在未来用于保存对象,那么最好将该变量初始化为null而不是其余值。这样一来,只要直接检查null值就能够知道相应的变量是否已经保存了一个对象的引用了。实际上,undefined值派生自null值的,所以它们的相等性测试要返回true:

alert(null == undefined);         //true

尽管null和undefined有这样的关系,但它们的用途彻底不一样。不管在什么状况下都没有必要把一个变量的值显式地设置为undefined,但是一样的规则对null却不适用。只要意在保存对象的变量尚未真正保存对象,就应该明确地让该变量保存null值。这样作不只能够体现null做为空对象指针的惯例,并且也有助于进一步区分null和undefined。

4.4 Boolean类型

Boolean类型只有两个字面值:true和false。示例:

var found = true;
var lost = false;

虽然Boolean类型的字面值只有两个,但javascript中全部类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,能够调用转型函数Boolean(),以下所示:

var message = "Hello world!";
var messageAsBoolean = Boolean(message);

在这个例子中,字符串message被转换成了一个Boolean值。能够对任何数据类型的值调用Boolean()函数,并且总会返回一个Boolean值,至于返回的这个值是true仍是false,取决于要转换值的数据类型及其实际值:

数据类型          
转换为true的值        
转换为false的值         
Boolean
true
false
String
任何非空字符串
""(空字符串)
Number
任何非零数字值(包含无穷大)
0和NaN
Object
任何对象
null
Undefined
不适用
undefined

这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换很是重要:

var message = "Hello world!";
if(message){
    alert("value is true");
}

4.5 Number类型

最基本的数值字面量格式是十进制整数,如:

var intNum = 55;        //整数

除了十进制表示外,整数还能够经过八进制或十六进制的字面值来表示。浮点数略,关于浮点数值计算会产生舍入偏差的问题,有一点须要明确:这是使用基于IEEE754数值的浮点计算的通病,并不是独此一家; 

关于NaN,它即非数值(Not a Number),是一个特殊的数值。这个数值用于表示一个原本要返回数值的操做数未返回数值的状况(这样就不会抛出错误了)。例如,在其余编程语言中,任何数值除以0都会致使错误,从而中止代码执行。但在javascript中,任何数值除以0会返回NaN,所以不会影响其余代码的执行。NaN自己有两个非同寻常的特色。首先,任何涉及NaN的操做(例如NaN/10)都会返回NaN。其次,NaN与任何值都不相等,包括NaN自己。例如:

alert(NaN == NaN);        //false

针对NaN的这两个特色,javascript定义了isNaN()函数。这个函数接受一参数,该参数能够是任何类型,而函数会帮咱们肯定这个参数是否“不是数值”。isNaN()在接收到一个值以后,会尝试将这个值转换为数值:

alert(isNaN(NaN));                //true
alert(isNaN(10));                    //false
alert(isNaN("10"));                //false(能够被转换成数值10)
alert(isNaN("blue"));            //true
alert(isNaN(true));                //false(能够被转换成数值1)

数值转换,有3个函数能够把非数值转换为数值:Number(),parseInt(),parseFloat()。第一个函数,即转型函数Number()能够用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于一样的输入会有返回不一样的结果。Number()函数的转换规则以下:

  • 若是是Boolean值,true和false将分别被转换为1和0;

  • 若是是数字值,只是简单的传入和返回;

  • 若是是null值,返回0;

  • 若是是undefined,返回NaN;

  • 若是是字符串,遵循下列规则:1若是字符串只包含数字,则将其转换为十进制数值。2若是字符串中包含有效的浮点格式,则将其转换为对应的浮点数值。3若是字符串包含有效的十六进制格式,则将其转换为相同大小的十进制整数。4若是字符串是空(不包括任何字符),则将其转换为0。5 若是字符串中包含除上述格式以外的字符,则将其转换为NaN。

因为Number()函数在转换字符串时比较复杂并且不够合理,所以在处理整数的时候更经常使用parseInt()函数。parseInt()与parseFloat()这里就不过多解释了,要用就百度下。

4.6 String类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串能够由双引号("")或单引号('')表示:

var firstname = "Nicholas";
var lastName = 'zakas';

把一个值转换为一个字符串有两种方式。第一种是使用几乎每一个值都有的toString()方法。这个方法惟一要作的就是返回相应值的字符串表现。

var age = 11;
var ageAsString = age.toString();            //字符串"11"
var found = true;
var foundAsString = found.toString();        //字符串"true"

但null和undefined值没有这个方法。在不知道要转换的值是否是null或undefined的状况下,还可使用转型函数String(),这个函数可以将任何类型的值转换为字符串。String()函数遵循下列转换规则:

  • 若是值有toString()方法,则调用该方法并返回相应的结果;

  • 若是值是null,则返回"null";

  • 若是值是undefined,则返回“undefined”。

4.7 Object类型

javascript中的对象其实就是一组数据和功能的集合。对象能够经过new操做符后跟要建立的对象类型的名称来建立。而建立Object类型的实例并为其添加属性和(或)方法,就能够建立自定义对象,以下所示:

var o = new Object();

这个语法与java中建立对象的语法类似,但在javascript中,若是不给构造函数传递参数,则能够省略后面那一对圆括号。不过不推荐这样作。在javascript中,Object类型是全部它的实例的基础,Object类型所具备的任何属性和方法也一样存在于更具体的对象中。Object的每一个实例都具备下列属性和方法:

  • constructor——保存着用于建立当前对象的函数。对于前面的例子而言,构造函数就是Object()。

  • hasOwnProperty(propertyName)——用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,做为参数的属性名必须以字符串形式指定,如:o.hasOwnProperty("name");

  • isPrototypeOf(object)——用于检查传入的对象是不是另外一个对象的原型。

  • propertyIsEnumerable(propertyName)——用于检查给定的属性是否可以使用for-in语句来枚举。与hasOwnProperty()方法同样,做为参数的属性名必须以字符串形式指定。

  • toString()——返回对象的字符串表示。

  • valueOf()——返回对象的字符串,数值或布尔值表示。一般与toString()方法的返回值相同。

5. 操做数

其它的不讲了,这里只说一下布尔操做符,相等操做符

5.1 逻辑非(!)

逻辑非操做符由一个叹号!表示,能够应用于javascript中的任何值。不管这个值是什么数据类型,这个操做符都会返回一个布尔值。逻辑非操做符遵循下列规则:

  • 若是操做数是一个对象,返回false.

  • 若是操做数是一个空字符串,返回true

  • 若是操做数是一个非空字符串,返回false

  • 若是操做数是0,返回true

  • 若是操做数是任意非0数值,返回false.

  • 若是操做数是null,返回true

  • 若是操做数是NaN,返回true

  • 若是操做数是undefined,返回true

alert(!false);        //true
alert(!0);            //true

逻辑非操做符也能够用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操做符,实际上就会模拟Boolean()转型函数的行为:

alert(!!"blue");            //true
alert(!!NaN);                //false

5.2 逻辑与

逻辑与操做符由两个和号(&&)表示,有两个操做数,示例:

var result = true && false;

逻辑与操做属于短路操做,即若是第一个操做数可以决定结果,那么就不会再对第二个操做数求值。

逻辑与操做能够应用于任何类型的操做数,而不只仅是布尔值。在有一个操做数不是布尔值的状况下,逻辑与操做就不必定返回布尔值;此时,它遵循下列规则:

  • 若是第一个操做数是对象,则返回第二个操做数

  • 若是第二个操做数是对象,则只有在第一个操做数的求值结果为true的状况下才会返回该对象

  • 若是两个操做数都是对象,则返回第二个操做数。

  • 若是有一个操做数是null,则返回null

  • 若是有一个操做数是NaN,则返回NaN

  • 若是有一个操做数是undefined,则返回undefined

5.3 逻辑或

逻辑或操做符由两个竖线符号(||)表示,有两个操做数。

var result = true || false;

与逻辑与操做符类似,逻辑或操做符也是短路操做符。逻辑或也能够应用于任何类型的操做数,若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值:

  • 若是第一个操做数是对象,则返回第一个操做数

  • 若是第一个操做数的求值结果为false,则返回第二个操做数

  • 若是两个操做数都是对象,则返回第一个操做数

  • 若是两个操做数都是null,则返回null

  • 若是两个操做数都是NaN,则返回NaN

  • 若是两个操做数都是undefined,则返回undefined

5.4 相等操做数

相等和不相等:javascript中的相等操做符由两个等于号(==)表示,若是两个操做数相等,则返回true。而不相等操做符由叹号后跟等于号(!=)表示,若是两个操做数不相等,则返回true。这两个操做符都会先转换操做数(一般称为强制转型),而后再比较它们的相等性。在转换不一样的数据类型时,相等和不相等操做符遵循下列基本规则:

  • 若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值——false转换为0,而true转换为1。

  • 若是一个操做数是字符串,另外一个操做数是数值,在比较相等性以前先将字符串转换为数值。

  • 若是一个操做数是对象,另外一个操做数不是,则调用对象的valueOf()方法,用获得的原始值按照前面的规则进行比较

这两个操做符在进行比较时则要遵循下列规则:

  • null和undefined是相等的

  • 要比较相等性以前,不能将null和undefined转换成其余任何值

  • 若是有一个操做数是NaN,则相等操做符返回false,而不相等操做符返回true。重要提示:即便两个操做数都是NaN,相等操做符也返回false,由于按照规则,NaN不等于NaN。

  • 若是两个操做数都是对象,则比较它们是否是同一个对象。若是两个操做数都指向同一个对象,则相等操做符返回true,不然返回false。

下表列出了一些特殊状况及比较结果:

表达式    
值      
表达式     

null == undefined
true
true == 1
true
"NaN" == NaN
false
true == 2
false
5 == NaN
false
undefined == 0
false
NaN == NaN
false
null == 0
false
NaN != NaN
true
"5" = 5
true
false == 0
true


全等和不全等:除了在比较以前不转换操做数以外,全等和不全等操做符与相等和不相等操做符没有什么区别。全等操做符由3个等于号(===)表示,它只在两个操做数未经转换就相等的状况下返回true,如例:

var result1 = ("55" == 55);            //true,由于转换后相等
var result2 = ("55" === 55);          //false,由于不一样的数据类型不相等

不全等操做符由一个叹号后跟两个等于号(!==)表示,它在两个操做数未经转换就不相等的状况下返回true。例如:

var result1 = ("55" != 55);                //false,由于转换后相等
var result2 = ("55" !== 55);              //true,由于不一样的数据类型不相等

因为相等和不相等操做符存在类型转换问题,而为了保持代码中数据类型的完整性,咱们推荐使用全等和不全等操做符。

6. 语句

6.1 if语句

if语句的语法,示例以下:

var i = 24;
if(i > 25)
    alert("Greater  than 25. ");                             //单行语句
else {
    alert("Less than or equal to 25. ");                //代码块中的语句
}

6.2 do-while语句

do-while语句是一种后测试循环语句,即只有在循环体中的代码执行以后,才会测试出口条件。在对条件表达式求值以前,循环体内的代码至少会被执行一次。

var i = 0;
do{
    i += 2;
}while(i < 10);

6.3 while语句

while语句属于前测试循环语句,在循环体内的代码被执行以前,就会对出口条件求值。所以,循环体内的代码有可能永远不会被执行。

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

6.4 for语句

for语句也是一种前测试循环语句,但它具备在执行循环以前初始化变量和定义循环后要执行的代码的能力。

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

6.5 for-in语句

for-in语句是一种精准的迭代语句,能够用来枚举对象的属性。示例:

for(var propName in window){
    document.write(propName);
    document.write("<br/>");
}

6.6 label语句

使用label语句能够在代码中添加标签,以便未来使用(相似java中代标签的for)。示例:

start: for(var i=0; i<count; i++){
    alert(i);
}

这个例子中定义的start标签能够在未来由break或continue语句引用。加标签的语句通常都要与for语句等循环语句配合使用。

6.7 break和continue语句

break和continue语句用于在循环中精确地控制代码的执行。其中,break语句会当即退出循环,强制继续执行循环后的语句。而continue语句虽然也是当即退出循环,但退出循环后会从循环的顶部继续执行。

for(var i=0;i<10;i++){
    if(i % 5 == 0){
        break;
    }
}
for(var i=0;i<10;i++){
    if(i % 5 == 0){
        continue;
    }
}

6.8 with语句

with语句的做用是将代码的做用域设置到一个特定的对象中,with语句的语句以下:

with(expression) atatement

定义with语句的目的主要是为了简化屡次编写同一个对象的工做。以下示例:

var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;

上面几行代码都包含location对象。若是使用with语句,能够把上面的代码改写成:

with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var rul = href;
}

在重写后的例子中,使用with语句关联了location对象。这意味着在with语句的代码块内部,每一个变量首先被认为是一个局部变量,而若是在局部环境中找不到该变量的定义,就会查找location对象中是否有同名的属性。若是发现了同名属性,则以location对象属性的值做为变量的值。注:因为大量使用with语句会致使性能降低,同时也会给调试代码形成困难,所以在开发大型应用程序时,不建议使用with语句。

6.9 switch语句

switch语句与if语句的关系最为密切,并且也是在其余语言中广泛使用的一种流控制语句:

var i = 25;
switch(i){
    case 25:  /*合并两种情形*/
    case 35: alert("25 or 35"); break;
    case:45: alert("45");break;
    default: alert("Other");
}

7. 函数

javascript中的函数使用function关键字来声明,后跟一组参数以及函数体。示例:

function sayHi(name, message){
    alert("Hello " + name + "," + message);
}

这个函数能够经过其函数名来调用,后面还要加上一对圆括号和参数(圆括号中的参数若是有多个,能够用逗号隔开)。调用sayHi函数的代码以下:

sayHi("Nicholas","how are you today?");

javascript中的函数在定义时没必要指定是否返回值。实际上,任何函数在任什么时候候均可以经过return语句后跟要返回的值来实现返回值。示例:

function sum(num1, num2){
    return num1 + num2;
}

另外,return语句也能够不带有任何返回值。在这种状况下,函数在中止执行后将返回undefined值。

7.1 理解参数

javascript函数的参数与大多数其余语言中函数的参数有所不一样。javascript函数不介意传递进来多少个参数,也不在意传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必必定要传递两个参数。能够传递一个,三个甚至不传递参数,而解析器永远不会有什么怨言。以后以会这样,缘由是javascript中的参数在内部是用一个数组来表示的。函数接收到的始终都是数组,而不关心数组中包含哪些参数(若是有参数的话)。若是这个数组中不包含任何元素,无所谓;若是包含多个元素,也没有问题。实际上,在函数体内能够经过arguments对象来访问这个参数数组,从而获取传递给函数的每个参数。

其实,arguments对象只是与数组相似(它不是Array的实例),由于可使用方括号语法访问它的每个元素(即每个元素是arguments[0],第二个元素是arguments[1],以此类推),使用length属性来肯定传递进来多少个参数。在前面的例子中,sayHi()函数的第一个参数的名字叫name,而该参数的值也能够经过访问arguments[0]来获取:

function sayHi(){
    alert("Hello " + arguments[0] + ". " + arguments[1]);
}

这个重写后的函数中不包含命名的参数,虽然没有使用name和message标识符,但函数的功能依旧。这个事实说明了javascript函数的一个重要特色: 命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其它语言可能须要事先建立一个函数签名,而未来的调用必须与该签名一致。但在javascript中,没有这些条条框框,解析器不会验证命名参数。

关于参数还要记住最后一点:没有传递值的命名参数将自动被赋于undefined值。

7.2 没有重载

javascript函数不能像传统意义上那样实现重载。而在其余语言(如java)中,能够为一个函数编写两个定义,只要这两个定义的签名不一样便可。javascript函数没有签名,由于其参数是由包含零或多个值的数组来表示的。若是在javascript中定义了两个名字相同的函数,则该名字只属于后定义的函数:

function addSomeNumber(num){
    return name + 100;
}
function addSomeNumber(num){
    return num + 200;
}
var result = addSomeNumber(100);        //300
相关文章
相关标签/搜索