zoukankan      html  css  js  c++  java
  • doc

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码,浏览器可以解释并作出相应的处理。

    一、JavaScript的用法

    1、JavaScript代码存在形式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!--第一种方式-->
        <script type="application/javascript" src="外部JS文件"></script>
    </head>
    <body>
         <!--第二种方式-->
        <script type="text/javascript">
    //        JS代码
        </script>
    </body>
    </html>

    2、JavaScript代码存放位置

    • HTML的head中;

    • HTML的body代码块的底部(推荐使用)。

    由于HTML代码是从上到下执行,如果Head中的js代码耗时严重,就会导致用户长时间无法看到页面,如果放置body代码块底部,那么即使JS代码耗时严重,也不会影响到用户看到页面效果,只是JS实现渲染的效果慢而已。

    二、JavaScript输出

    JavaScript可以通过不同的方式来输出数据:

    • 使用alert()弹出警告框

    • 使用document.write()方法将内容写到HTML文档中

    • 使用innerHTML写入到HTML元素

    • 使用console.log() 写入到浏览器的控制台

    三、JavaScript变量

    JavaScript中变量的声明是一个非常容易出错的点,局部变量必须以var开头,如果未加var,则默认表示声明的是全局变量。

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <script type="text/javascript">
     
        //全局变量
        name = 'haifeng';
         
        function func() {
         
            //局部变量
            var age = 18;
             
            //全局变量
            gender = "男";
        }
    </script>

    JavaScript中代码注释:

    • 单行:  //

    • 多行:  /*  */

    四、JavaScript数据类型

    JavaScript中数据类型分为原始类型和对象类型:

    • 原始类型(数字、字符串、布尔值)

    • 对象类型(数组、字典.......)

    特别的,数字、布尔值、null、undefined、字符串是不可变。

    • null:JavaScript语言的关键字,它表示一个特殊值,常用来描述"空值";

    • undefined:一个特殊值,表示变量未定义。

    1、数字(Number)

    JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值来表示。

    转换:

    • parseInt(...):将某值转换成数字,不成功则NaN

    • parseFloat(...):将某值转换成浮点数,不成功则NaN

    特殊值:

    • NaN:非数字,可使用isNaN(num)来判断

    • Infinity:无穷大,可使用isFinite(num)来判断

    更多类型转换,请参考:http://www.w3school.com.cn/js/pro_js_typeconversion.asp

    2、字符串(String)

        字符串是由字符组成的数组,但在JavaScript中字符串是不可变的;可以访问字符串任意位置的文本,但是JavaScript并未提供修改已知字符串内容的方法。

    常见功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    obj.length                           #长度
    obj.trim()                           #移除空白
    obj.trimLeft()                       #移除左侧空白
    obj.trimRight)                       #移除右侧空白
    obj.charAt(n)                        #返回字符串中的第n个字符
    obj.concat(value, ...)               #拼接
    obj.indexOf(substring,start)         #子序列位置
    obj.lastIndexOf(substring,start)     #子序列位置
    obj.substring(from, to)              #根据索引获取子序列
    obj.slice(start, end)                #切片
    obj.toLowerCase()                    #大写
    obj.toUpperCase()                    #小写
    obj.split(delimiter, limit)          #分割
    obj.search(regexp)                   #从头开始匹配,返回匹配成功的第一个位置(g无效)
    obj.match(regexp)                    #全局搜索,如果正则中有g表示找到全部,否则只找到第一个。
    obj.replace(regexp, replacement)     #替换,正则中有g则替换所有,否则只替换第一个匹配项,
                                         #$数字:匹配的第n个组内容;
                                         #$&:当前匹配的内容;
                                         #$`:位于匹配子串左侧的文本;
                                         #$':位于匹配子串右侧的文本
                                         #$$:直接量$符号

    3、布尔值类型(Boolean)

    布尔类型仅包含真假,与Python不同的是其首字母小写。true or flase

    • ==:比较值相等

    • != :不等于

    • === :比较值和类型相等

    • !== :不等于

    • ||:逻辑或

    • && :且

    4、数组

    JavaScript中的数组类似于Python中的列表。

    常用功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    obj.length          #数组的大小
                        #
    obj.push(ele)       #尾部追加元素
    obj.pop()           #尾部获取一个元素
    obj.unshift(ele)    #头部插入元素
    obj.shift()         #头部移除元素
    obj.splice(start, deleteCount, value, ...)  #插入、删除或替换数组的元素
                        obj.splice(n,0,val)     #指定位置插入元素
                        obj.splice(n,1,val)     #指定位置替换元素
                        obj.splice(n,1)         #指定位置删除元素
    obj.slice( )        #切片
    obj.reverse( )      #反转
    obj.join(sep)       #将数组元素连接起来以构建一个字符串
    obj.concat(val,..)  #连接数组
    obj.sort( )         #对数组元素进行排序

    5、JSON序列化

    • JSON.string(obj):序列化

    • JSON.parse(str):反序列化

    五、语句和异常

    1、条件语句

    JavaScript中支持两个条件语句,分别是:if和switch。

    具体用法

    1
    2
    3
    4
    5
    6
    7
    if(条件){
     
    }else if(条件){
     
    }else{
     
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch(name){
        case '1':
            age =123;
            break;
        case '2':
            age = 456;
            breack;
        default:
            age = 777;
    }

    2、循环语句

    JavaScript中支持三种循环语句,分别是:

    1
    2
    3
    4
    5
    6
    var names = ["jack","tony","rain"];
     
    for(var i=0;i<names.length;i++){
        console.log(i);
        console.log(names[i]);
    }
    1
    2
    3
    4
    5
    6
    7
    var names = ["jakc","tony","rain"]
     
    for(var index in names){
        console.log(index);
        console.log(names[index]);
     
    }
    1
    2
    3
    4
    5
    while(条件){
            
        //break;
        //continue;
    }

    3、异常处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    try{
     
        //这段代码从上而下运行,其中任何一个语句抛出异常改代码块就结束运行
    }
     
    catch (e){
     
        //如果try代码块抛出了异常,catch代码块中的代码就会被执行;
        //e是一个局部变量,用来指向Error对象或其他抛出的对象。
    }
     
    finally{
     
        //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
    }

    提示:主动抛出异常--->throw Error('xxx')

    六、函数

    1、基本函数

    JavaScript中函数基本上可以分为一下三类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>函数</title>
    </head>
    <body>
        <script>
    //        普通函数
    //        function func() {
    //            return ture;
    //        }
    //        匿名函数
    //        functions(arg){
    //            return "tony";
    //        }
    //           setInterval(function () {
    //               alert(123);
    //           },100);
    //        自执行函数
    //          (function(arg){
    //              console.log(arg);
    //          })('123')
        </script>
     
    </body>
    </html>

    提示:对于JavaScript中函数的参数,实际参数的个数可能小于形式参数的个数,函数内的特殊值arguments中封装了所有实际参数。

    2、作用域(★★★)

       JavaScript中每个函数都有自己的作用域,当出现函数嵌套时,就出现了作用域链。当内层函数使用变量时,会根据作用域链从内到外一层层的循环,如果不存在,则异常。

    提示:所有的作用域在创建函数且未执行时候就已经存在

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function f2(){
        var arg= 111;
        function f3(){
            console.log(arg);
            //自己这一级没有往上找,直到找到为止
         }
    return f3;
    }
      
    ret = f2();
    ret();
     
     
    //结果为:111
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <script>
        function f2(){
            var arg= [11,22];
            function f3(){
                console.log(arg);
            }
            arg = [44,55];
            return f3;
        }
      
        ret = f2();
        ret();
    </script>
     
    //执行结果为[44,55],
    //结果为对象

    下面开始引用一下大神的5句话搞定JavaScript作用域:

    • JavaScript中无块级作用域

    • JavaScript采取函数作用域

    • JavaScript的作用域链

    • JavaScript的作用域链执行前已创建

    • 声明提前

    "JavaScript中无块级作用域"

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script>
        function Main(){
            if(1==1){
                var name = 'seven';
            }
            console.log(name);
        }
        Main()
    </script>
     
     
    //执行结果:serven

    补充:标题之所以添加双引号是因为JavaScript6中新引入let关键字,用于指定变量属于块级作用域

    JavaScript采取函数作用域

    在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script>
        function Main(){
            var innerValue = 'seven';
        }
     
        Main();
     
        console.log(innerValue);
    </script>
     
     
    //报错信息:Uncaught ReferenceError: innerValue is not defined

    JavaScript的作用域链

    由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <script>
        name = 'jack';
     
        function Func() {
            var name = "seven";
            function inner() {
                //var name = 'six';
                console.log(name);
            }
            inner()
        }
        Func()
    </script>

    如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序

    当执行console.log(name)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。


    JavaScript的作用域链执行前已创建

    JavaScript的作用域链在执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。

    示例一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <script>
        name = 'jack';
     
        function Func() {
            var name = "seven";
            function inner() {
     
                console.log(name);
            }
            return inner;
        }
        var ret = Func();
        ret();
    </script>
     
    //结果:seven

    上面代码,在函数被调用之前作用域链已经存在,当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域-->Func函数作用域-->inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。

    示例二:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <script>
        name = 'jack';
      
        function Func() {
            var name = "seven";
            function inner() {
      
                console.log(name);
            }
            name = 'eric';
            return inner;
        }
        var ret = Func();
        ret();
    </script>
     
    //结果:eric

    示例二和示例一不同的是,在执行【var ret= Func();】时,Func作用域中的name变量的值已经由seven变成了eric,所以之后执行【ret();】时,就只能找到eric了。

    示例三:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <script>
        name = 'jack';
      
        function Bar() {
            console.log(name);
        }
        function Func() {
            var name = "seven";
            return Bar;
        }
        var ret = Func();
        ret();
    </script>
     
    //结果:jack

    上述代码,在函数被执行之前已经创建了两条作用域链:

    • 全局作用域-->Bar函数作用域

    • 全局作用域-->Func函数作用域

    当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域-->Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。

    声明提前:

    在JavaScript中如果不创建变量直接去使用,则报错:

    1
    2
    3
    console.log(name);
     
    // 报错:Uncaught ReferenceError: xxoo is not defined

    JavaScript中如果创建值而不赋值,则该值为undefined,如:

    1
    2
    3
    4
    5
    var name;
     
    console.log(name);
     
    //输出:undefined

    在函数内如果这么写:

    1
    2
    3
    4
    5
    6
    7
    8
    function  FOO(){
        console.log(name);
        var name = 'seven';
    }
     
    Foo();
     
    //结果输出:undefined

    上述代码,不报错而是输出undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在"预编译"时,已经执行了var name; 所以上述代码输出结果为undefined。

    3、闭包

        【闭包】是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    闭包是个函数,而它记住了周围发生了什么,表现为由一个函数体中定义了另一个函数,由于作用域链只能从内向外找,默认外部无法获取函数内部变量。闭包,在外部获取函数内部的变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <script>
        function f1(){
            var n=999;
        function f2(){
            alert(n);
           }
          return f2;
      }
      var result=f1();
        result();
    </script>
     
    //结果:警告框999

    4、面向对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Foo (name,age) {
        this.Name = name;
        this.Age = age;
        this.Func = function(arg){
            return this.Name + arg;
        }
    }
       
    var obj = new Foo('alex', 18);
    var ret = obj.Func("sb");
    console.log(ret);

    提示:

    • Foo充当的构造函数;

    • this代指对象;

    • 创建对象时需要使用new。

    ​上述代码中每个对象均保存了一个相同的Func函数,从而浪费内存。使用原型可以解决这个问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Foo (name,age) {
        this.Name = name;
        this.Age = age;
    }
    Foo.prototype = {
        GetInfo: function(){
            return this.Name + this.Age
        },
        Func : function(arg){
            return this.Name + arg;
        }
    }

    最后附上大神五句话搞定JavaScript作用域地址:

    http://www.cnblogs.com/wupeiqi/p/5649402.html

  • 相关阅读:
    计算任意两个日期的间隔天数
    题目标题: 排它平方数
    历届试题 剪格子
    历届试题 翻硬币
    C语言中%d,%o,%f,%e,%x的意义
    历届试题 买不到的数目
    九度 OJ1008 hdu 3790
    南洋理工 OJ 115 城市平乱 dijstra算法
    蓝桥杯 错误票据 原创代码+思路
    历届试题 连号区间数
  • 原文地址:https://www.cnblogs.com/phennry/p/5805036.html
Copyright © 2011-2022 走看看