javascript第一章--基本概念

2018-06-24 00:48:09来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

① 语法

    一. 区分大小写

1. javascript中的一切(变量、函数名、操作符)都区分大小写,如变量名text和变量名Text代表两个不同的变量。

    二. 标识符

1. 标识符指的就是变量名、函数名、属性名、函数的参数,不能把关键词、保留字、true、false、null用作标识符。
2. 它按照下列格式规则:
一、 第一个字符必须是字母、下划线或者($)美元符号;
二、 其他字符可以是字母、下划线、数字或者($)美元符号;
3. 推荐标识符采用驼峰大小写格式,也就是第一个字母小写,后面的单词首字母大写,如: getName、getAge。

    三. 注释

注释有两种:
1. 单行注释:
//我是单行注释
2. 块级注释:
/*
*
*我是块级注释
*
*/

    四. 严格模式

1. ECMAScript5引入了严格模式的概念,它给javascript定义了一种不同的解析与执行模型,ECMAScript3一些不正确的行为将得到处理。
2. 要在脚本中开启严格模式,在顶部写入如下代码即可:
    "use strict";
这行代码是一个编译指示,告诉支持的js引擎切换到严格模式,这是为不破坏ECMAScript3语法而特意选定的语法。

    五. 语句

1. javascript中的语句以一个分号结尾,如果省略分号,则由解析器确定语句的结尾。
2. 虽然语句结尾的分号不是必需的,但建议任何时候都不要省略,避免压缩代码时出现错误,增进代码性能。
    var c=a+b  //即使没有分号也是有效的语句 -- 不推荐
    var c=a+b; //有效的语句 -- 推荐
3. 多条语句组合到一个代码块中,代码块以左括号({)开头,以右括号(})结尾。
if (text) {
alert(text);
}
4. 条件控制语句最佳实践是始终在控制语句中使用代码块
if (text)
alert(text); //有效,但容易出错
if (text) {
alert(text); //有效,推荐使用
}

② 关键字和保留字

    一. 关键字

    ECMA-262描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等。关键字是语言保留的,不能用于标识符。

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

    二. 保留字

    ECMA-262还描述了另外一组不能作为标识符的保留字,这些保留字还没有特定的用途,但有可能在将来作为关键字。

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  

③ 变量

1. javascript中的变量是松散型的,可以用来保存任何类型的数据,每个变量仅仅是一个用来保存值的占位符而已。定义变量要使用var操作符(关键字),后跟变量名(标识符)。
    var message
2. 可以使用一条语句定义多个变量,用逗号分隔开。
    var message, name, age;  //定义了message、name、age3个变量。
3. 这个message变量可以保存任何类型的数据,如果未初始化,保存一个特殊值 -- undefined,也可以直接初始化。
    var message = 'dong'
4. var操作符定义的变量将成为定义该变量的作用域的局部变量。
    function fn() {
        var message = 'dong';
        alert(message);  //dong
    }
    fn();
    alert(message);      //message is not defined
5. 变量也可省略var操作符,那么这个变量是一个全局变量。
    function fn() {
        message = 'dong';
        alert(message);  //dong
    }
    fn();
    alert(message);      //dong
6. 虽然省略var操作符可以定义全局变量,但不是推荐的做法,因为在全局作用域中定义的全局变量很难维护。

④ 数据类型

javascript有5种简单数据类型,1种复杂数据类型。
    简单数据类型: String、 Number、 Null、 Undefined、 Boolean;
    复杂数据类型: Object;

    一. typeof操作符

鉴于ECMAScript是松散型的,因此需要有一种手段来检测变量的数据类型 -- typeof操作符。
    'undefined' -- 值未定义
      'boolean' -- 值是布尔值
       'string' -- 值是字符串
       'number' -- 值是数字
       'object' -- 值是对象或者null (null被认为是一个空的对象引用)
     'function' -- 值是函数

    二. Undefined类型

1. Undefined类型只有一个值,即特殊的undefined。在使用var操作符声明变量,但未初始化,值便是undefined。
    var message;
    alert(message == undefined);  //true
2. 也可以给变量显式的赋值undefined。
    var message = undefined;
    alert(message == undefined);  //true
3. 然而困惑的有一点就是变量是否声明,typeof操作符返回的都是undefined。
    var message; //声明
    //var age;   //未声明
    alert(typeof message);  //undefined
    alert(typeof age);      //undefined

    三. Null类型

1. Null类型是第二个只有一个值的数据类型,即特殊的null。null值表示一个空对象指针,所以检测null值会返回"object"。
    var message = null;
    alert(typeof message);  //object
2. 如果定义的变量将来会保存对象,那么可以把变量的值初始化为null,这样检查null值就可以知道变量是否保存了一个对象的引用。
    if (message != null) {
        //对message对象执行操作
    }
3. 实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
    alert(null == undefined);  //true
4. 对于意在保存对象的变量来说,可以把值初始化为null,从而体现了null作为空对象指针的惯例。而没有必要吧一个变量的值显式地设置为undefined,从而有助于进一步区分null和undefined。

    四. Boolean类型

1. Boolean类型只有两个字面值: true和false。和数字值不是一回事,所以true不一定等于1,false不一定等于0。给变量赋Boolean类型值:
    var a = true;
    var b = false;
2. Boolean类型的字面值true和false是区分大小写的,True和False都不是Boolean值,而是标识符。
3. 虽然Boolean类型只有两个字面值,但ECMA中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。
    var a = 'dong';
    var b = Boolean(a);
    alert(b); //true

    下表给出各种数据类型及其对应的转换规则。

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined n/a undefine

 

1. 这些转换规则对理解流控制语句自动执行相应的Boolean值转换非常重要。
    var message = 'dong';
    if (message) {  //字符串message被自动转换成了对应的Boolean值(true)。
       console.log('value');
    }
2. 由于存在这种自动执行的Boolean值转换,因此确切地知道在流控制语句中使用的是什么变量至关重要。

    五. Number类型

1. Number类型使用IEEE754格式表示整数和浮点数值,为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。
最基本的数值字面量格式是十进制整数:
    var intNum = 1;  //整数
整数还可以通过八进制(8位数)的字面值来表示。八进制字面值的第一位必须是0,然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值分析。
    var a = 77;  //77
    var b = 077; //八进制的63 (7*81+7*80)
    var c = 079; //无效的八进制数值79
八进制字面量在严格模式下无效,会导致javascript引擎报错。
十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母A~F可以大写,也可以小写。
    var a = 0xA;  //十六进制的10 (10*160)
    var b = 0x1f; //十六进制的31 (1*161+15*160)
在进行算术计算时,所有已八进制和十六进制表示的值最终都转换为十进制数值。

    六. String类型

1. String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(")或单引号(')表示
    var a = 'hello';
    var b = "world";

   String类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者既有其它的用途。

字面量 含义
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号('),在用单引号表示的字符串中使用。例如: ' I am \'wzd\' '
\" 双引号("),在用双引号表示的字符串中使用。例如: " I am \"wzd\"  "
\xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如: \x41表示"A"
\unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如: \u03a3表示希腊字符


    七. Object类型

1. ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象。
    var a = new Object();
2. 在ECMAScript中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号。(不推荐)
    var a = new Object;
3. 仅仅创建Object的实例并没有什么用处,但关键是要理解一个重要的思想:即在ECMAScript中,Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。

   Object的每个实例都具有下列属性和方法

1. constructor: 保存着用于创建当前对象的函数。对面前面的例子来说,构造函数(constructor)就是Object()。
2. hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如: o.hasOwnproperty("name"))。
3. isPrototypeOf(object): 用于检查传入的对象是否是当前对象的原型。
4. propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
5. toLocaleString(): 返回对象的字符串表示,改字符串与执行环境的地区对应。
6. toString(): 返回对象的字符串表示。
7. valueOf(): 返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

⑤ 操作符

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符、位操作符、关系操作符和相等操作符。

⑥ 语句

    一. if语句

    if (condition) statement1 else statement2    

    if (a > 10) {
        alert('a大于10');
    } else if (a = 10) {
        alert('a等于10');
    } else {
        alert('a小于10');
    }

    二. do-while语句

    do {
        statement
    }while(expression)

    var a = 1;
    do{
        a++;      
    }while(a < 10)

    三. while语句

    while(expression) statement

    var a = 1;
    while(a < 10) {
        a++;
    }

    四. for语句

    for (initialization; expression; post-loop-expression) statement

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

    五. for-in语句

    for (property in expression) statement

    for (var propName in window) {
        document.write(propName);
    }

    六. label语句

    label: statement

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

    七. break和continue语句

    var num = 0;
    for (var i = 1; i < 10; i++) {
        if (i % 5 == 0) {
            break;
        }
        num++;
    }
    alert(num);  //4

    var num = 0;
    for (var i = 1; i < 10; i++) {
        if (i % 5 == 0) {
            continue;
        }
        num++;
    }
    alert(num);  //8

    八. with语句

    with (expression) statement
    
    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;

    九. switch语句

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

    switch (i) {
        case 5:
            alert('5');
            break;  
        case 15:
            alert('15');
            break;  
        case 25:
            alert('25');
            break;  
        default:
            alert('other');

⑦ 函数

   函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体。

    function functionName (arg0, arg1, arg2, ...) {
        statement
    }

    function method (name) {
        alert("hello" + name);
    }

   ECMAScript中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。

    function method (num1, num2) {
        return num1 + num2;
    }
    var result = method(5,10);  //15

   函数在return语句之后停止并立即退出,位于return语句之后的任何代码都不会被执行。

    function method (num1, num2) {
        return num1 + num2;
        alert('hello'); //不会被执行
    }
    var result = method(5,10);  //15

    一. 理解参数

   ECMA函数的参数大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接受两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。之所以会这样,原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终是这个数组,而不关心数组中包含哪些参数。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。(第一个参数是arguments[0])

    function method () {
        alert(arguments.length);
    }
    method("string", 45);  //2
    method("string");      //1
    method();              //0

注: ECMAScript中的所有参数传递的都是值,不肯能通过引用传递参数。
arguments的值永远与对应的命名参数保持同步。
arguments[0]获取第一个参数,arguments.length获取传入参数个数。
如果函数只传入一个参数,那么arguments[1]设置的值不会反映到命名参数上。因为arguments对象的长度是由传入的参数个数决定的,而不是定义函数的命名参数个数决定的。

    function fn (a,b) {
        arguments[1] = 10;
        alert(arguments.[1]); //10
    }
    fn(1,2);

    function fn (a,b) {
        arguments[1] = 10;
        alert(arguments.[1]); //undefined
    }
    fn(1);

    二. 没有重载

   ECMAScript函数不能像传统意义上那样实现重载。而在其他语言中(如java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。如前所述,ECMAScript函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。 如果定义了两个名字相同的函数,则该名字只属于后定义的函数。

    function method (num) {
        return num + 10;
    }
    function method (num) {
        return num + 20;
    }
    var result = method(10);  //30

   函数method()被定义了两次,第一个函数给参数加10,而第二个函数给参数加20。由于后定义的函数覆盖了先定义的函数,因此调用函数时,返回的结果是30。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:javascript之input获取的时间减1秒&amp;&amp;t时间恢复

下一篇:原型浅析