• JS基础学习(一)


    JavaScript概述

    JavaScript的历史

    • 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)
    • Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript
    • 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript.
    • 为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范.

    ECMAScript 

    尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:

    • 核心(ECMAScript) 
    • 文档对象模型(DOM) Document object model (整合js,css,html)
    • 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)
    • Javascript 在开发中绝大多数情况是基于对象的.也是面向对象的.

    简单地说,ECMAScript 描述了以下内容:

    • 语法 
    • 类型 
    • 语句 
    • 关键字 
    • 保留字 
    • 运算符 
    • 对象 (封装 继承 多态) 基于对象的语言.使用对象.

    JavaScript的引入方式

    {#1 直接编写#}
        <script>
            alert('hello yuan')
        </script>
    {#2 导入文件#}
        <script src="hello.js"></script>  

    二 JavaScript的基础

    2.1 变量

    在 JavaScript 中:

    0 变量是弱类型的(很随便);

    1 声明变量时不用声明变量类型. 全都使用var关键字;

    1
    var a;

    一行可以声明多个变量.并且可以是不同类型.

    1
    var name="yuan", age=20, job="lecturer";

    (了解) 声明变量时 可以不用var. 如果不用var 那么它是全局变量.

    变量命名,首字符只能是字母,下划线,$美元符 三选一,且区分大小写,x与X是两个变量

    变量还应遵守以下某条著名的命名规则:

    Camel 标记法
    首字母是小写的,接下来的字母都以大写字符开头。例如:
    var myTestValue = 0, mySecondValue = "hi";
    Pascal 标记法
    首字母是大写的,接下来的字母都以大写字符开头。例如:
    Var MyTestValue = 0, MySecondValue = "hi";
    匈牙利类型标记法(推荐)     
    在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“
    Var iMyTestValue = 0, sMySecondValue = "hi";

    2.2 基础规范

    每行结束可以不加分号. 没有分号会以行符作为每行的结束

    a=1;b=2;
    a=1 b=2;------错误
    
    a=1
    b=2
    
    //推荐
    a=1;
    b=2;
    
    {
     a=1;
     b=2;
        //推荐加tab
        a=1;
        b=2;
    }

    注释 支持多行注释和单行注释. /* */  //

    使用{}来封装代码块

    2.3 常量和标识符

    常量 :直接在程序中出现的数据值

    标识符

    1. 不以数字开头的字母、数字、下划线(_)、美元符号($)组成
    2. 用于表示函数、变量等的名称
    3. 例如:_abc,$abc,abc,abc123是标识符,而1abc不是
    4. JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符

    2.4 数据类型

    console.log(typeof x)   在命令行输出X的数据类型

    alert(x)在网页弹窗输出

    数字类型(Number)

    最基本的数据类型
    不区分整型数值和浮点型数值
    所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式
    能表示的最大值是±1.7976931348623157 x 10308 
    能表示的最小值是±5 x 10 -324 

       整数:
               在JavaScript中10进制的整数由数字的序列组成
               精确表达的范围是
-9007199254740992 (-253) 到 9007199254740992 (253)
               超出范围的整数,精确度将受影响
      浮点数:
               使用小数点记录数据
               例如:3.4,5.6
               使用指数记录数据
               例如:4.3e23 = 4.3 x 1023

      16进制和8进制数的表达
               16进制数据前面加上0x,八进制前面加0
               16进制数是由0-9,A-F等16个字符组成
               8进制数由0-7等8个数字组成
               16进制和8进制与2进制的换算

    字符串(String)

    是由Unicode字符、数字、标点符号组成的序列
    字符串常量首尾由单引号或双引号括起
    JavaScript中没有字符类型
    常用特殊字符在字符串中的表达
    字符串中部分特殊字符必须加上右划线
    常用的转义字符 
    :换行  ':单引号   ":双引号  \:右划线

    String数据类型的使用

    • 特殊字符的使用方法和效果
    • Unicode的插入方法
     
    <script>
            var str="u4f60u597d 欢迎来到"JavaScript世界"";
            alert(str);
    </script>
    结果:
    你好
    欢迎来到"JavaScript世界"

    布尔型(Boolean)   布尔值可以参加运算

    Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0
    布尔值也可以看作on/off、yes/no、1/0对应true/false
    Boolean值主要用于JavaScript的控制语句,例如
        if (x==1){
        y=y+1;
        }else    {
        y=y-1;
        }

    Null(返回尚未存在的对象) & Undefined(声明变量确未赋值)

    Undefined 类型
    Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。
    当函数无明确返回值时,返回的也是值 "undefined";
    Null 类型
    另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义
    为相等的。尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,
    null 则用于表示尚未存在的对象(在讨论
    typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 nullvar person=new Person() var person=null

    数据类型转换(弱类型语言的特征)

    JavaScript属于松散类型的程序语言
    变量在声明的时候并不需要指定数据类型
    变量只有在赋值的时候才会确定数据类型
    表达式中包含不同类型数据则在计算过程中会强制进行类别转换
    
    
    数字 + 字符串:数字转换为字符串
    数字 + 布尔值:true转换为1,false转换为0
    字符串 + 布尔值:布尔值转换为字符串true或false

    强制类型转换函数

    函数parseInt:   强制转换成整数   例如parseInt("6.12")=6  ; parseInt(“12a")=12 ; 
              parseInt(“a12")=NaN(当涉及数据转换成数字时,得不到结果时) ;parseInt(“1a2")=1 函数parseFloat: 强制转换成浮点数 parseFloat("6.12")=6.12 函数eval: 将字符串强制转换为表达式并返回结果 eval("1+1")=2 ; eval("1<2")=true

    类型查询函数(typeof)    查看数据类型

    ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。

    函数typeof :查询数值当前类型
 (string / number / boolean / object )
    
    例如typeof("test"+3)      "string"
    例如typeof(null)          "object "
    例如typeof(true+1)        "number"
    例如typeof(true-false)    "number"
    

    ECMAScript 运算符

    ECMAScript 算数运算符

    加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )  加、减、乘、除、余数和数学中的运算方法一样  例如:9/2=4.5,4*5=20,9%2=1
    
    -除了可以表示减号还可以表示负号  例如:x=-y
    
    +除了可以表示加法运算还可以用于字符串的连接  例如:"abc"+"def"="abcdef"

     递增(++) 、递减(--)

    假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1
    i++(先赋值,再自加)相当于i=i+1,i--(先赋值,再自减)相当于i=i-1
    递增和递减运算符可以放在变量前也可以放在变量后:++i(先自加,再赋值) --i(先自减,再赋值)
        
    var i=1;
    console.log(i++);
    console.log(++i);
    console.log(i--);
    console.log(--i);

    一元加减法:

    var a=1;
        var b=1;
        a=-a;  //a=-1
    
        var c="10";
        alert(typeof (c));
        c=+c;    //类型转换
        alert(typeof (c));
    //    -------------------
        var d="yuan";
        d=+d;
        alert(d);//NaN:属于Number类型的一个特殊值,当遇到将字符串转成数字无效时,就会得到一个NaN数据
        alert(typeof(d));//Number
    
        //NaN特点:
        
        var n=NaN;
        
        alert(n>3);
        alert(n<3);
        alert(n==3);
        alert(n==NaN);
        
        alert(n!=NaN);//NaN参与的所有的运算都是false,除了!=

    ECMAScript 逻辑运算符

    等于 ( == )  、不等于( != ) 、 大于( > ) 、 小于( < ) 
大于等于(>=) 、小于等于(<=)
    与 (&&)有false就false 、或(||)有ture就ture 、非(!)
    1&& 1 = 1  1 || 1 = 1
    1&& 0 = 0  1 || 0 = 1
    1&& 0 = 0  0 || 0 = 0
    
    !0=1
    !1=0
    console.log(2=="2"); //类型转换,ture   
    console.log(2==="2");//全等于符号===,false          
    console.log(2===2);

     逻辑 AND 运算符(&&)

    逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。

    如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:

    • 如果某个运算数是 null,返回 null。 
    • 如果某个运算数是 NaN,返回 NaN。 
    • 如果某个运算数是 undefined,返回undefined。 

    逻辑 OR 运算符(||)

    与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值 

    ECMAScript 赋值运算符

    赋值 = 
    JavaScript中=代表赋值,两个等号==表示判断是否相等
    例如,x=1表示给x赋值为1
    if (x==1){...}程序表示当x与1相等时
    if(x==“on”){…}程序表示当x与“on”相等时
     配合其他运算符形成的简化表达式
    例如i+=1相当于i=i+1,x&=y相当于x=x&y

    实例:

    2== “2”   true     
    2=== “2”  true  
    2!= “4”   flse         
    2!== “4”  ture      
    
    var a = 2; var b = 4; 
    var c = a<b | --b>--a; //1
    var c = a<b || --b>--a; //ture
    var c = a<b &&--b>--a; //ture
    var c = a<b & --b>--a; //1

    ECMAScript等性运算符

    执行类型转换的规则如下:

    • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。 
    • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。 
    • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。 
    • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。 

    在比较时,该运算符还遵守下列规则:

    • 值 null 和 undefined 相等。 
    • 在检查相等性时,不能把 null 和 undefined 转换成其他值。 
    • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。 
    • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。 

    ECMAScript 关系运算符(重要)

    var bResult = "Blue" < "alpha";
    alert(bResult); //输出 true  

    在上面的例子中,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。

    比较数字和字符串

    另一种棘手的状况发生在比较两个字符串形式的数字时,比如:

    var bResult = "25" < "3";
    alert(bResult); //输出 "true"
    

    上面这段代码比较的是字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。

    不过,如果把某个运算数该为数字,那么结果就有趣了:

    var bResult = "25" < 3;
    alert(bResult); //输出 "false"

    这里,字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较,结果不出所料。

    总结:

    比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.
    比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.

    Boolean运算符(重要)

    var temp=new Object();// false;[];0; null; undefined;object(new Object();)
    
        if(temp){
            console.log("yuan")
        }else {
            console.log("alex")
        }

    全等号和非全等号

     等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。

    控制语句

    if 控制语句

    if-else基本格式
    if (表达式){
    语句1;
    ......
    }else{
    语句2;
    .....
    }
    功能说明
    如果表达式的值为true则执行语句1,
    否则执行语句2

    var x= (new Date()).getDay();
    //获取今天的星期值,0为星期天
    var y;
    
    if ( (x==6) || (x==0) ) {
    y="周末";
    }else{
    y="工作日";
    }
    
    alert(y);

    if 可以单独使用

    if语句嵌套格式
    if (表达式1) {
        语句1;
    }else if (表达式2){
        语句2;
    }else if (表达式3){
        语句3;
    } else{
        语句4;
    }

    if (x==1){
        y="星期一";
    }else if (x==2){
        y="星期二";
    ...
    }else if (x==6){
        y="星期六";
    }else if (x==0){
        y="星期日";
    }else{
        y="未定义";
    }
    View Code

    switch  选择控制语句

    switch基本格式
    switch (表达式) {
        case 值1:语句1;break;
        case 值2:语句2;break;
        case 值3:语句3;break;
        default:语句4;
    }

         var x= (new Date()).getDay();
            switch (x){
                case 0:console.log("Sunday");break;
                case 1:console.log("Monday");break;
                case 2:console.log("Tuesday");break;
                case 3:console.log("周三");break;
                case 4:console.log("周四");break;
                case 5:console.log("Friday");break;
                case 6:console.log("周六");break;
                default :console.log("未定义");
            }

    switchelse if结构更加简洁清晰,使程序可读性更强,效率更高。

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
    说到基本类型的数值比较,那当然要有两个数。然后重点来了——
    if 语句每一句都是独立的,看下面的语句:
    if (a == 1) ...
    else if (a == 2) ...
    这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
    于是 switch case 就出来了,把上面的改成 switch case 版本:
    switch (a) {
            case 0:
                    break;
            case 1:
    }
                    
    总结:
    
    1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
    2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
      择执行哪一个case的语句块
    3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
      一次。
    所以在多路分支时用switch比if..else结构要效率高。
    switch为什么效率高?

    for  循环控制语句

    for循环基本格式
    for (初始化;条件;增量){
        语句1;
        ...
    }
    功能说明
    实现条件循环,当条件成立时,执行语句1,否则跳出循环体

            for (var i=0;i<10;i++){
                console.log("ok")
                document.write("<h1>hello"+i+"</h1>")    //拼接
            }
    
    //        1+2+3+...+100
            var sum=0;
            for (var i= 1;i<=100;i++){
                sum+=i;
            }
            alert(sum)

    注意:for i in 不推荐使用,使用doms会有bug

           s=[12,"yuan",true,3.14];   // 数组
    
            console.log(s);
            console.log(typeof s);
    
    
            for(var i in s){
                console.log(s[i]);
            }
    View Code

    while  循环控制语句

    while循环基本格式
    while (条件){
    语句1;
    ...
    }
    功能说明
    运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环

    var i=1;
    while (i<=7) {
        document.write("<H"+i+">hello</H "+i+"> ");
        document.write("<br>");
        i++;
    }

    异常处理

    try {
        //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
    }
    catch (e) {
        // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
        //e是一个局部变量,用来指向Error对象或者其他抛出的对象
    }
    finally {
         //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
    }
            try {
                console.log("hello");
                console.log(x);
            }
            catch(e){
                console.log(e);
            }
            finally{
                console.log("finally");
            }
    View Code

    三 JavaScript的对象

     简介:

    在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String、Math、Array、Date、RegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数功能都是基于对象实现的。

    3.1 String对象

    字符串对象创建

    字符串创建(两种方式)
           ① 变量 = “字符串”
           ② 字串对象名称 = new String (字符串)
      

       var s="hello";
       console.log(typeof s);   //类型字符串
       ar s1=new String(" hello|word ");
       console.log(typeof s1); //类型数组

    字符串对象的属性和函数

    x.length         ----获取字符串的长度
    
    x.toLowerCase()        ----转为小写
    x.toUpperCase()        ----转为大写
    x.trim()               ----去除字符串两边空格       
    
    
    ----字符串查询方法
    
    x.charAt(index)         ----str1.charAt(index);----获取指定位置字符,其中index为要获取的字符索引
    
    x.indexOf(findstr,index)----查询的字符串,字符串索引
    x.lastIndexOf(findstr)  
    
    x.match(regexp)         ----match返回匹配字符串的数组,如果没有匹配则返回null
    x.search(regexp)        ----search返回匹配字符串的首字符位置索引
    
                            示例:
                            var str1="welcome to the world of JS!";
                            var str2=str1.match("world");
                            var str3=str1.search("world");
                            alert(str2[0]);  // 结果为"world"
                            alert(str3);     // 结果为15
                            
    
    ----子字符串处理方法
    
    x.substr(start, length) ----start表示开始位置,length表示截取长度
    x.substring(start, end) ----start表示开始位置,end是结束位置
    
    x.slice(start, end)     ----切片操作字符串,顾头不顾尾
                      
    示例: var str1="abcdefgh"; var str2=str1.slice(2,4); var str3=str1.slice(4);//一个数值表示起始位置 var str4=str1.slice(2,-1); var str5=str1.slice(-3,-1); alert(str2); //结果为"cd" alert(str3); //结果为"efgh" alert(str4); //结果为"cdefg" alert(str5); //结果为"fg" x.replace(findstr,tostr) ---- 字符串替换 x.split(); ----分割字符串 var str1="一,二,三,四,五,六,日"; var strArray=str1.split(","); alert(strArray[1]);//返回一个数组对象,结果为"二" x.concat(addstr) ---- 拼接字符串

    3.2 Array对象

    3.2.1 数组创建

    创建数组的三种方式:

    创建方式1:
    var arrname = [元素0,元素1,….];          // var arr=[1,2,3];
    
    创建方式2:
    var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true);
    
    创建方式3:
    var arrname = new Array(长度); 
                //  初始化数组对象:
                    var cnweek=new Array(7);
                        cnweek[0]="星期日";
                        cnweek[1]="星期一";
                        ...
                        cnweek[6]="星期六";

    创建二维数组:

    var cnweek=new Array(7);
    for (var i=0;i<=6;i++){
        cnweek[i]=new Array(2);
    }
    cnweek[0][0]="星期日";
    cnweek[0][1]="Sunday";
    cnweek[1][0]="星期一";
    cnweek[1][1]="Monday";
    ...
    cnweek[6][0]="星期六";
    cnweek[6][1]="Saturday";

    数组的遍历:

            //遍历数组:
            for (var i in arr1){
                console.log(arr1[i])
            }
    
            d1={"name":"copila","age":23};  // d1是object数据类型
            console.log(d1);
            console.log(typeof d1);
    
            d2={name:'copila','age':34};      // 键可有可无
            console.log(d2);
            console.log(typeof d2);          //  值单引号双引号都可以
            for (var i in d1){
                console.log(i);     //遍历出来的值是key
            }

    3.2.2 数组对象的属性和方法

    js中数据对象都有toString方法,将数据对象转换成字符串

    join方法:(将数组变成字符串)

    x.join(bystr)       ----将数组元素拼接成字符串
    
                                var arr1=[1, 2, 3, 4, 5, 6, 7];
                    var str1=arr1.join("-");
                    alert(str1);  //结果为"1-2-3-4-5-6-7" 

    concat方法:

    x.concat(value,...)    ---- 
                       var a = [1,2,3];
                      var b=a.concat(4,5) ;
                      alert(a.toString());  //返回结果为[1,2,3]            
                      alert(b.toString());  //返回结果为[1,2,3,4,5]            
               console.log(arr1.concat([1,2,3]).length)   

    数组排序-reverse sort:

    //x.reverse()
    //x.sort()
    
    var arr1=[32, 12, 111, 444];
    //var arr1=["a","d","f","c"];
    
    arr1.reverse(); //颠倒数组元素
    alert(arr1.toString());
    //按第一位的ASSIC表排序,结果为444,111,12,32
    
    arr1.sort();    //排序数组元素
    alert(arr1.toString());
    //排序按ASSIC表排序,结果为111,12,32,444
    
    //------------------------------
    arr=[1,5,2,100];
    
    //arr.sort();
     //alert(arr);
    //如果就想按着数字比较呢?
    
    function intSort(a,b){
        if (a>b){
            return 1;//-1
        }
        else if(a<b){
            return -1;//1
        }
        else {
            return 0
        }
    }
    
    arr.sort(intSort);
    
    alert(arr);
    
    function IntSort(a,b){
    //重写sort方法
        return a-b;
    }
    arr.sort(IntSort);

    alert(arr);

    数组切片操作:

    //x.slice(start, end)
    //
    //使用注解
    //
    //x代表数组对象
    //start表示开始位置索引
    //end是结束位置下一数组元素索引编号
    //第一个数组元素索引为0
    //start、end可为负数,-1代表最后一个数组元素
    //end省略则相当于从start位置截取以后所有数组元素
    
    var arr1=['a','b','c','d','e','f','g','h'];
    var arr2=arr1.slice(2,4);
    var arr3=arr1.slice(4);
    var arr4=arr1.slice(2,-1);
    
    alert(arr2.toString());
    //结果为"c,d" 
    alert(arr3.toString());
    //结果为"e,f,g,h"
    alert(arr4.toString());
    //结果为"c,d,e,f,g"
    View Code

    删除子数组:

    //x. splice(start, deleteCount, value, ...)
    
    //使用注解
    
    //x代表数组对象
    //splice的主要用途是对数组指定位置进行删除和插入
    //start表示开始位置索引
    //deleteCount删除数组元素的个数
    //value表示在删除位置插入的数组元素
    //value参数可以省略       
            
    var a = [1,2,3,4,5,6,7,8];
    a.splice(1,2);
    
    alert(a.toString());//a变为 [1,4,5,6,7,8]
    
    a.splice(1,1);
    
    alert(a.toString());//a变为[1,5,6,7,8]
    
    a.splice(1,0,2,3);
    //第二位数字为0,第三位数字就是插入的值,相当于替换
    alert(a.toString());
    //a变为[1,2,3,5,6,7,8]

    数组的push和pop:(压栈和弹栈   在数组最后)

    //push pop这两个方法模拟的是一个栈操作
    
    //x.push(value, ...)  压栈
    //x.pop()             弹栈      
    //使用注解
    //
    //x代表数组对象
    //value可以为字符串、数字、数组等任何值
    //push是将value值添加到数组x的结尾
    //pop是将数组x的最后一个元素删除
    
    
    var arr1=[1,2,3];
    arr1.push(4,5);
    alert(arr1);
    //结果为"[1,2,3,4,5]"
    arr1.push([6,7]);//[6,7]相当于占了一个位置
    alert(arr1)
    //结果为"[1,2,3,4,5,6,7]" arr1.pop(); alert(arr1); //结果为"1,2,3,4,5"

    数组的shift和unshift:(压栈和弹栈 在数组最前)

    //x.unshift(value,...)
    //x.shift()
    //使用注解
    
    //x代表数组对象
    //value可以为字符串、数字、数组等任何值
    //unshift是将value值插入到数组x的开始
    //shift是将数组x的第一个元素删除
    
    var arr1=[1,2,3];
    arr1.unshift(4,5);
    alert(arr1);  //结果为"4,5,1,2,3"
    
    arr1. unshift([6,7]);
    alert(arr1);  //结果为"6,7,4,5,1,2,3"
    
    arr1.shift();
    alert(arr1);  //结果为"4,5,1,2,3"

    总结js的数组特性:

    //  js中数组的特性
           //java中数组的特性,  规定是什么类型的数组,就只能装什么类型.只有一种类型.
             //js中的数组特性1: js中的数组可以装任意类型,没有任何限制.
             //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长.
             var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')];
            /*  alert(arr5.length);//8
             arr5[10] = "hahaha";//索引8、9都没有赋值,直接10赋值不报错
             alert(arr5.length); //11,8、9没有赋值,但是占位
             alert(arr5[9]);// undefined 

    3.3 Date对象

    3.3.1 创建Date对象

    //方法1:不指定参数
    var nowd1=new Date();//获取当前的结构化时间
    alert(nowd1.toLocaleString( ));//得到时间字符串
    //方法2:参数为日期字符串
    var nowd2=new Date("2004/3/20 11:12");
    alert(nowd2.toLocaleString( ));
    var nowd3=new Date("04/03/20 11:12");
    alert(nowd3.toLocaleString( ));
    //方法3:参数为毫秒数
    var nowd3=new Date(5000);
    alert(nowd3.toLocaleString( ));
    alert(nowd3.toUTCString());/格林尼治时间字符串/
    
    //方法4:参数为年月日小时分钟秒毫秒
    var nowd4=new Date(2004,2,20,11,12,0,300);
    alert(nowd4.toLocaleString( ));//毫秒并不直接显示

    Date对象的方法—获取日期和时间

    获取日期和时间
    getDate()                 获取日
    getDay ()                 获取星期
    getMonth ()               获取月(0-11)
    getFullYear ()            获取完整年份
    getYear ()                获取年
    getHours ()               获取小时
    getMinutes ()             获取分钟
    getSeconds ()             获取秒
    getMilliseconds ()        获取毫秒
    getTime ()                返回累计毫秒数(从1970/1/1午夜)

    实例练习:

    //1. 创建Date对象
            var date = new Date(); //没有填入任何参数那么就是当前时间
            //2. 获得当前年份
            var year = date.getFullYear();
            //3. 获得当前月份 js中月份是从0到11.
            var month = date.getMonth()+1;
            //4. 获得当前日
            var day = date.getDate();
            //5. 获得当前小时
            var hour = date.getHours();
            //6. 获得当前分钟
            var min = date.getMinutes();
            //7. 获得当前秒
            var sec = date.getSeconds();
            //8. 获得当前星期
            var week = date.getDay(); //没有getWeek
    
            // 2012-12-12 12:12:12 星期四
            str=year+"-"+month+"-"+day+" "+hour+":"+min+":"+sec+" "+change(week);
    
            function change(week){
                var arr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
                return arr[week]
            }
    
    
            console.log(str);
            
        //解决 自动补齐成两位数字的方法
            function changeNum(num) {
                if (num < 10) {
                    return "0" + num;
                } else {
                    return num;
                }
            }

    Date对象的方法—设置日期和时间

    //设置日期和时间
    //setDate(day_of_month)       设置日
    //setMonth (month)                 设置月
    //setFullYear (year)               设置年
    //setHours (hour)         设置小时
    //setMinutes (minute)     设置分钟
    //setSeconds (second)     设置秒
    //setMillliseconds (ms)       设置毫秒(0-999)
    //setTime (allms)     设置累计毫秒(从1970/1/1午夜)
        
    var x=new Date();
    x.setFullYear (1997);    //设置年1997
    x.setMonth(7);        //设置月7
    x.setDate(1);        //设置日1
    x.setHours(5);        //设置小时5
    x.setMinutes(12);    //设置分钟12
    x.setSeconds(54);    //设置秒54
    x.setMilliseconds(230);        //设置毫秒230
    document.write(x.toLocaleString( )+"<br>");
    //返回1997年8月1日5点12分54秒
    
    x.setTime(870409430000); //设置累计毫秒数
    document.write(x.toLocaleString( )+"<br>");
    //返回1997年8月1日12点23分50秒
    View Code

    Date对象的方法—日期和时间的转换

    日期和时间的转换:
    
    getTimezoneOffset():8个时区×15度×4分/度=480;
    返回本地时间与GMT的时间差,以分钟为单位
    toUTCString()
    返回国际标准时间字符串
    toLocalString()
    返回本地格式时间字符串
    Date.parse(x)
    返回累计毫秒数(从1970/1/1午夜到本地时间)
    Date.UTC(x)
    返回累计毫秒数(从1970/1/1午夜到国际时间)
    View Code

    3.4 Math对象

    //该对象中的属性方法 和数学有关.
       
    
    abs(x)    返回数的绝对值。
    exp(x)    返回 e 的指数。
    floor(x)对数进行下舍入。
    log(x)    返回数的自然对数(底为e)。
    max(x,y)    返回 x 和 y 中的最高值。
    min(x,y)    返回 x 和 y 中的最低值。
    pow(x,y)    返回 x 的 y 次幂。
    random()    返回 0 ~ 1 之间的随机数。
    round(x)    把数四舍五入为最接近的整数。
    sin(x)    返回数的正弦。
    sqrt(x)    返回数的平方根。
    tan(x)    返回角的正切。
    
    //方法练习:
            //alert(Math.random()); // 获得随机数 0~1 不包括1.
            //alert(Math.round(1.5)); // 四舍五入
            //练习:获取1-100的随机整数,包括1和100
                 //var num=Math.random();
                 //num=num*100;
                 //num=Math.round(num);
                 //alert(num)
            //============max  min=========================
            /* alert(Math.max(1,2));// 2
            alert(Math.min(1,2));// 1 */
            //-------------pow--------------------------------
            alert(Math.pow(2,4));// pow 计算参数1 的参数2 次方.

    3.5 Function 对象(重点)

    3.5.1 函数的定义

    function 函数名 (参数){
 
        函数体;
        return 返回值;
    }

    功能说明:

    可以使用变量、常量或表达式作为函数调用的参数
    函数由关键字function定义
    函数名的定义规则与标识符一致,大小写是敏感的
    返回值必须使用return
    Function 类可以表示开发者定义的任何函数。

    用 Function 类直接创建函数的语法如下:

    var 函数名 = new Function("参数1","参数n","function_body");

    虽然由于字符串的关系,第二种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。

    示例:

    function func1(name){
        alert('hello'+name);
        return 8
    }
    
        ret=func1("yuan");
        alert(ret);
    
    
    var func2=new Function("name","alert("hello"+name);")
    func2("egon")
    View Code

    注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:

    <script>
        //f(); --->OK
    
        function f(){
            console.log("hello")
    
        }
    
        f() //----->OK
             
    </script>

    3.5.2 Function 对象的属性

    如前所述,函数属于引用类型,所以它们也有属性和方法。
    比如,ECMAScript 定义的属性 length 声明了函数期望的参数个数。

    alert(func1.length)

    3.5.3 Function 的调用

    function func1(a,b){
    
        alert(a+b);
    }
    
        func1(1,2);  //3
        func1(1,2,3);//3
        func1(1);    //NaN
        func1();     //NaN
    
        //只要函数名写对即可,参数怎么填都不报错.
    
    -------------------面试题-----------
     function a(a,b){
        alert(a+b);
    }
    
       var a=1;
       var b=2;
       a(a,b)//a被1重写,报错

    3.5.4 函数的内置对象arguments(接收任意个数的参数,并以数组的形式存起来)

    function add(a,b){
    
            console.log(a+b);//3
            console.log(arguments.length);//2
            console.log(arguments);//[1,2]
    
        }
        add(1,2)
    
        ------------------arguments的用处1 ------------------
        function nxAdd(){
            var result=0;
            for (var num in arguments){
                result+=arguments[num]
            }
            alert(result)
    
        }
    
        nxAdd(1,2,3,4,5)
    
    //     ------------------arguments的用处2 ------------------
    
        function f(a,b,c){
            if (arguments.length!=3){
                throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments")
            }
            else {
                alert("success!")
            }
        }
    
        f(1,2,3,4,5)

    3.5.4 匿名函数

    / 匿名函数的应用
        (function(){
            alert("tony");
        } )()
    
        (function(arg){
            console.log(arg);
        })('123')

    3.5.5函数的作用域链和闭包

    作用域

    js的作用域和py相似,if while等控制语句并没有自己作用域;而函数是有自己的作用域的;

    if(1==1){
    
            var s=12;
        }
        console.log(s);//12
    
       // ----------------------
        function f(){
            var temp=666;
        }
        f();
        console.log(temp);//Uncaught ReferenceError: temp is not defined

    嵌套函数的作用域:

    例1:

    var city = 'beijing';
    
        function func(){
            var city = 'shanghai';
            function inner(){
                var city = 'shenzhen';
                console.log(city);
            }
            inner();
        }
        func();

    例2:

    var city = 'beijing';
    function Bar(){
        console.log(city);
    }
    function func(){
    
        var city = 'shanghai';
        return Bar;
    }
    var ret = func();
    ret();    //beijing

    闭包:

    var city = 'beijing';
    
    function func(){
        var city = "shanghai";
        function inner(){        
            console.log(city);
        }
        return inner;
    }
    var ret = func();
    ret();

     作用域链(Scope Chain):

          在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

    var x=1;
    function foo() {
        var y = 2;
        
        function bar() {
            var z = 3;
        }
    }
    
    #bar的作用域链: barScopeChain=[bar.AO, foo.AO, global.VO];
    
    #foo的作用域链: fooScopeChain=[foo.Ao, global.VO];
    什么是AO,VO?
           在函数创建时,每个函数都会创建一个活动对象Active Object(AO),全局对象为Global Object(VO),创建函数的过程也就是为这个对象添加属性的过程,作用域链就是由这些绑定了属性的活动对象构成的。
            例如:找x变量;bar函数在搜寻变量x的过程中,先从自身AO对象上找,如果bar.AO存在这个属性,那么会直接使用这个属性的值,如果不存在,则会转到父级函数的AO对象,也就是foo.AO
            如果找到x属性则使用,找不到继续 在global.VO对象查找,找到x的属性,返回属性值。如果在global.VO中没有找到,则会抛出异常ReferenceError
    
    执行上下文。
           函数在执行时会创建一个称为“执行上下文(execution context)”的内部对象,执行上下文定义了函数
           执行时的环境。每个执行上下文都有自己的作用域链,用于标识符解析,当执行上下文被创建时,而它的作用
           域链初始化为当前运行函数的[[Scope]]所包含的对象。
    函数执行
           在函数执行过程中,每遇到一个变量,都会检索从哪里获取和存储数据,该过程从作用域链头部,也就是从活
           动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没有则继续搜索作用域
           链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义,函数执行过程中,每个标识符都
           要经历这样的搜索过程。
    AO、VO

    创建作用域链的过程

    函数进入全局,创建VO对象,绑定x属性<入栈>
         global.VO={x=underfind; foo:reference of function}(这里只是预解析,为AO对象绑定声明的属性,函数执行时才会执行赋值语句,
    所以值是underfind) 遇到foo函数,创建foo.AO,绑定y属性
    <入栈> foo.AO={y=underfind, bar:reference of function} 遇到bar函数,创建bar.AO,绑定z属性<入栈> bar.AO={z:underfind} 作用域链和执行上下文都会保存在堆栈中,所以: bar函数的scope chain为:[0]bar.AO-->[1]foo.AO-->[2]global.VO foo函数的scope chain为:[0]foo.AO-->[1]global.Vo //建议:少定义全局变量 //理由:因为作用域链是栈的结构,全局变量在栈底,每次访问全局变量都会遍历一次栈,//这样会影响效率

    函数的scope等于自身的AO对象加上父级的scope,也可以理解为一个函数的作用域等于自身活动对象加上父级作用域.

     
     
  • 相关阅读:
    【洛谷 1536】村村通
    【洛谷 1551】亲戚
    【UOJ 300】感冒病毒
    【洛谷 2299】Mzc和体委的争夺战
    【洛谷 3371】模板_单源最短路径(弱化版)
    【洛谷 2910】寻宝之路
    【洛谷 1359】租用游艇
    【UOJ 275】最短路径问题
    【UOJ 38】 股票经济人通信网络
    【UOJ 276】无向图最小环
  • 原文地址:https://www.cnblogs.com/domestique/p/6895780.html
Copyright © 2020-2023  润新知