• python基础-第十一篇-11.1JavaScript基础


    • JavaScript是一门解释型编程语言,主要是增强html页面的动态效果
    • JavaScript是有三部分组成:ECMAScript、BOM、DOM
    • 单行注释//   多行/*   */(必须是script代码块里)
    • javascript代码可以直接在浏览器上调试,按F12调出console

       注:javascript是一门能够让前端动起来的编程语言,其中浏览器充当了解释器,光javascript本身是不能让前端动起来的,必须结合浏览器的内置模块或者说是内置接口DOM,DOM可以用来操作HTML、CSS,对文档树进行操作,比如如果要把文档树中的所有的a标签替换成P标签,第一步就是用DOM找到所有的a标签,这是个集合,第二步就需要javascript来循环把a标签替换成功p标签

    引入方式

      引入外部文件

    <script type="text/javascript" src="js文件"></script>  
    
    • 除了以文件的方式引入,还是写在HTML的<head>或<body>中
    • 推荐写在body的底部,这样可以让网页尽快的呈现给用户,减少浏览者的等待时间

    变量

    •  在JavaScript里局部变量必须以var申明,如果不写var则为全局变量
    • 编写script代码时,每行代码后跟分号,这是一种优秀的编码习惯

      记忆要诀:全局变量地位高,到哪都不用标

        <script type="text/javascript">
            //全局变量  
            name = alex
    
            function func(){
            //局部变量
            var age = 18
            
            //全局变量
            gender = "women"
            }
        </script>
    

    运算符

      1、算术运算符

    • +  加法(如果是一元运算,而且是非数值,会调用Number()转型函数对这个值进行转换)
    • -  减法(一元转为负数)
    • ++  递增1(通过Number(),加1后重新赋值给操作数)
    • --   递减1
    • *  乘法
    • /  除法
    • %  取模

      2、比较运算符

    • === 与 !==  严格运算符,比较过程没有任何类型转换
    • ==  与 !=  如果两个操作值不是同一类型,会先尝试进行一些类型的转换,然后再进行比较
    • > 与 < 大于和小于
    • >= 与 <=  大于等于和小于等于

      3、逻辑运算符

    • !  非(返回布尔值)
    • &&  与
    • ||    或
    1> 取代if语句
    //前面条件成立则运行后面操作
    (a == b) && dosomething();
    
    2> 用于回调函数
    //若没有给参数a传值,则a默认为undefined假值,所以不执行a()。
    function fn(a){
        a && a();
    }
    

    数据类型

    • javascript只提供了数字,字符串,布尔值,数组四种基本数据类型,而其他的,比如字典,就是由类创建的对象,其中数字和字符串和布尔值,null,undefined值不可变,这点和python相似,其他的可变
    • null  表示一个空对象指针,常用来描述空值;
    • undefined  表示变量未定义

      1、数字

    • 对于javascript来说,没有整型和浮动点型之说,通通都叫Number,创建方式,可以直接赋值,也可以new关键字实例一个对象,查看值为 什么类型可以用      typeof  变量
    • parseInt()  将其他类型值转换成整数,不成功则NaN(这个叫非数字)
    • parseFloat()  将其他类型值转换成浮点数,不成功则NaN
    • NaN  非数字,可以使用isNaN(num)来判断
    • Infinity  无穷大,可以用isFinite(num)来判断(Flase--无穷,True--有限数)

      2、字符串

    • javascript的字符串和python有很多相似之处,索引取值:s1.charAt(0) 或 s1[0],切片取值:s1.slice(1,3),长度:s1.length,分割:s1.split('xxx')  也支持正则分割(/(d+)/)

      3、布尔类型

    • true(真)和false(假) 和python的区别就是这里逻辑值为小写,转换为布尔值Boolean()

      4、数组

    var name = Array("nick","alex");
    var name = ["nick","alex"]
    

     

      5、Math

    • Math对象是一个静态对象,而不是构造函数,实际上,Math只是一个有JavaScript设置的对象命名空间,用于存储数学函数,作用是执行普通的算数任务
    常量
    
    Math.E
    常量e,自然对数的底数。
    
    Math.LN10
    10的自然对数。
    
    Math.LN2
    2的自然对数。
    
    Math.LOG10E
    以10为底的e的对数。
    
    Math.LOG2E
    以2为底的e的对数。
    
    Math.PI
    常量figs/U03C0.gif。
    
    Math.SQRT1_2
    2的平方根除以1。
    
    Math.SQRT2
    2的平方根。
    
    静态函数
    
    Math.abs( )
    计算绝对值。
    
    Math.acos( )
    计算反余弦值。
    
    Math.asin( )
    计算反正弦值。
    
    Math.atan( )
    计算反正切值。
    
    Math.atan2( )
    计算从X轴到一个点的角度。
    
    Math.ceil( )
    对一个数上舍入。
    
    Math.cos( )
    计算余弦值。
    
    Math.exp( )
    计算e的指数。
    
    Math.floor( )
    对一个数下舍人。
    
    Math.log( )
    计算自然对数。
    
    Math.max( )
    返回两个数中较大的一个。
    
    Math.min( )
    返回两个数中较小的一个。
    
    Math.pow( )
    计算xy。
    
    Math.random( )
    计算一个随机数。
    
    Math.round( )
    舍入为最接近的整数。
    
    Math.sin( )
    计算正弦值。
    
    Math.sqrt( )
    计算平方根。
    
    Math.tan( )
    计算正切值。
    View Code

    语句

      1、条件语句

    • if语句

    if(条件){
            
            }else if(条件){
            
            }else{
            
            }
    
    •  switch语句

        //switch语句,name等于alex执行第一个case,等于nick执行第二个case,其他执行default
        switch(name){
            case "alex":
                age = 18;
                break;
            case "nick":
                age = 21;
                break;
            default:
                age = 0
        }
    

      2、循环语句

    • for循环

            var names = ["alex","nick"];
            for(var i=0;i<names.length;i++){
                console.log(i);
                console.log(names[i]);
            }
    
    •  for in循环

            var names = ["alex","nick"];
            for(var index in names){
                console.log(index);
                console.log(names[index]);
            }
    
    • while循环

            while(条件){
                //break;
                //continue;
            }
    
    •  do-while循环

            //循环的代码至少执行一次,结果为1
            var num = 0;
            do{
            num++;
            }while(num>10);
    

      判断和循环练手

        //数组for循环
        li = ['he','ni',123];
        console.log('for...each');
        for(var index in li){
            console.log(index);
            console.log(li[index]);
        }
        console.log('for...');
        for(var i=0;i<li.length;i++){
            console.log(i);
            console.log(li[i]);
        }
        //字典for循环
        dic = {'k1':'nimei','k5':'hello'}
        for(var item in dic){
            console.log(item);
            console.log(dic[item]);
        }
         //switch case
        function f1(name){
            switch(name){
                case 'alex':
                    age = 18;
                    console.log(age);
                    break;
                default:
                    age = 100;
                    console.log(age);
            }
        };
        f1('alex');
        f1('sb');
        //if else..
        console.log('if .. else..')
        name = 'alex'
        if(name==='alex'){
            age = 18;
        }else if(name==='eric'){
            age = '60';
        }else{
            age = '100';
        }
        console.log(age)
        //while循环
        var i = 0;
        while(i<10){
            if(i == 5){
                i++;
                continue;
            }else if(i == 8){
                i++;
                break;
            }else{
                console.log(i);
                i++;
            }
        }
    

      3、label语句

    • label语句可以理解为跳出任意循环

      4、异常处理

    • 主动抛出异常throw Error(‘xxx’)

            try{
                //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
            }
            catch (e){
                //如果try代码块中跑出了异常,catch代码块中的代码就会被执行
                //e是一个局部变量,用来指向Error对象或者其他抛出的对象
            }
            finally{
                //无论上述代码怎么,finally代码块始终会执行
            }
    

    函数Function

    • 函数定义的三种方式

    • 记忆要诀:普通函数--function 函数名();而匿名函数则是把函数名拿掉,然后函数体赋值给一个变量,变量名就是函数名(在javascript里定义类的方法时,要用到匿名函数);自执行函数则是把匿名函数体括起来然后传参执行--  (函数体)(参数)
            //普通函数
            function func(arg){
                return true;
            }
            //匿名函数
            var func = function(arg){
                return "nick";
            }
            //自执行函数
            (function(arg){
                console.log(arg);
            })("nick")
    
    •  函数参数:函数传参的个数可以小于实际需传参的个数,没传参的默认为undefined,参数传多默认不起作用

        function man(name,age){
            console.log(name,age);
        }
        man("nick",18); //nick 18
        man("nick");  //nick undefined
        man("nick",18,19); // nick 18
    
    •  arguments可接受所有参数,返回一个数组

        function man(){
            console.log(arguments);
        }
        man("nick",18); //["nick",18]
        man("nick");  //["nick"]
        man("nick",18,19); //["nick",18,19]
    

      函数的作用域与作用域链

    • JavaScript中没有块级作用域
         var name = "nick";
            (function Main(){
                console.log(name); //undefined
                if(1){
                    var name = "alex";
                }
                console.log(name);//alex
            })();
            console.log(name);//nick
            //声明需提前,在JavaScript引擎“预编译”时进行,函数在被执行之前,会江其中的变量全部声明,而不赋值
    
    • 作用域链:每个构造函数都有一个内部对象指针,指向原型对象,而原型对象也包含一个指向构造函数的指针,如此层层递进,形成作用域链条
          var name = "nick";
            function Main(){
                function F1(){
                    var name = "alex";
                    console.log(name);
                }
                function F2(){
                    console.log(name);//nick
                }
                F1();
                F2();
            }
            Main();
            //从内到外的优先级寻找
            //F2()的作用域链为F2()--》Main()
    

      闭包

    • 闭包就是能读取其他函数内部变量的函数

        function f1(){
            var n = 1;
            add = function(){
                n++;
            }
            function f2(){
                console.log(n);
            }
            return f2;
        }
        var result = f1();
        result();//1
        add();
        result();//2
    

       闭包使函数的变量都被保存在内存中,内存消耗大,所以少用闭包,否则会造成网页的性能低,在IE中可能导致内存的泄露,在退出函数之前,将不使用的局部变量全部删除

    面向对象

      三大特性

    • 封装:隐藏代码的实现的细节,实现代码的模块化
    • 继续:扩展已经存在的代码模块,实现代码的重用
    • 多态:接口的不同实现方式,实现接口重用

      关键词

    • this  代指此时的对象
    • new  创建对象时必须使用
    • 定义类联想:在javascript里,没有类,只有函数,定义类时,借用的还是函数的核,绑定属性通过this.啥来实现,而绑定方法通过 类.prototype = 字典,字典里定义方法,键为函数名,值为匿名函数,实例对象时,在调用类前加new关键词

    构造函数模式:不过这样把同样的函数封装到了不同的对象,造成了内存浪费

        function Foo(name,age){
            this.Name = name;
            this.Age = age;
            this.Func = function(){
                return this.Name + this.Age
            }
        }
        var obj = new Foo("nick",18);
        var ret = obj.Func();
        console.log(ret);
        var obj2 = new Foo("alex",22);
    

    原型模式

        function Foo(name,age){
            this.name = name;
            this.age = age;
        }
        Foo.prototype = {
            GetInfo:function(){
                var str = "is good";
                return this.name + str;
            },
            Func:function(){
                return this.name + this.age;
            }
        }
        var obj = new Foo("alex",22);
        console.log(obj.name);//alex
        console.log(obj.age);//22
        var ret = obj.GetInfo();
        console.log(ret);//alex is good
        var ret2 = obj.Func();
        console.log(ret2);//alex18
    

       所有的构造函数的prototype属性都指向另一个对象(同一块内存地址),这个对象的所有属性和方法,都会被构造函数的实例继承

      Prototype模式的验证方法

    • isPrototypeOf()  用来判断一个对象是否存在于另一个对象的原型链中

        Foo.prototype.isPrototypeOf(obj)  //true
        Foo.prototype.isPrototypeOf(obj2)  //true
    
    •  hasOwnProperty()  用来判断某一个对象(不包括原型链)是否具有执行属性

        obj.hasOwnProperty("name")  //true
        obj.hasOwnProperty("age")  //true
    
    •  in运算符  判断某个实例是否有某个属性

        "name" in obj  //true
        "age" in obj  //true
    

    其它

      1、序列化

    • JSON.stringify(obj)  序列化
    • JSON.parse(str)  反序列化

      2、转义

    • decodeURI( )                   URl中未转义的字符
    • decodeURIComponent( )   URI组件中的未转义字符
    • encodeURI( )                   URI中的转义字符
    • encodeURIComponent( )   转义URI组件中的字符
    • escape( )                         对字符串转义
    • unescape( )                     给转义字符串解码
    • URIError                         由URl的编码和解码方法抛出

      3、eval

      JavaScript中的eval不仅可以进行数学运算还可以运行代码,并且可以获取返回值

        a = eval("1+1");
        console.log(a);
    

       4、正则表达式

        var p = /nick/g;
        console.log(p.test("nickalexnick"));//true
        console.log(p.exec("nickalexnick"));//["nick",index:8,input:"nickalexnick"]
    

       JavaScript中支持正则表达式,其主要提供了两个功能:

    • test(string)  用做判断,返回true或false,用来检测正则是否匹配
    • exec(string)  用来获取正则匹配的内容,如果正则没加g,也就是全局搜索,每次执行都只会返回最后匹配到的内容;如果是全局搜索,每次执行exec函数,返回的匹配内容为从后往前,每次一个,要获取所有符合匹配模式的匹配内容的话,就需要循环获取

      匹配模式:

    • g:表示全局模式,匹配所有字符串,不会匹配到第一项时停止
    • i:表示不区分大小写(case-insensitive)模式
    • m:表示多行模式,到达一行文本末尾时还会继续查找下一行中是否存在匹配的项
    元字符         名称              匹配对象
    .             点号              单个任意字符(除回车
    、换行
    、行分隔符u2028和段分隔符u2029外)
    []            字符组             列出的单个任意字符
    [^]           排除型字符组        未列出的单个任意字符
    ?             问号               匹配0次或1次
    *             星号               匹配0交或多次
    +             加号               匹配1次或多次
    {min,max}     区间量词           匹配至少min次,最多max次
    ^             脱字符             行的起始位置
    $             美元符             行的结束位置
    |             竖线               分隔两边的任意一个表达式
    ()            括号               限制多选结构的范围,标注量词作用的元素,为反向引用捕获文本
    1,2...      反向引用            匹配之前的第一、第二...组括号内的表达式匹配的文本
    元字符
    d     数字,等同于[0-9]
    D     非数字,等同于[^0-9]
    s     空白字符
    S     非空白字符
    w     字母、数字、下划线,等同于[0-9A-Za-z_](汉字不属于w)
    W     非字母、数字、下划线,等同于[^0-9A-Za-z_]
    View Code

      5、时间处理

      时间操作中有两种时间:

    • 统一时间
    • 本地时间(东八区)
    Date    操作日期和时间的对象
    Date.getDate( )    返回一个月中的某一天
    Date.getDay( )    返回一周中的某一天
    Date.getFullYear( )    返回Date对象的年份字段
    Date.getHours( )    返回Date对象的小时字段
    Date.getMilliseconds( )    返回Date对象的毫秒字段
    Date.getMinutes( )    返回Date对象的分钟字段
    Date.getMonth( )    返回Date对象的月份字段
    Date.getSeconds( )    返回Date对象的秒字段
    Date.getTime( )    返回Date对象的毫秒表示
    Date.getTimezoneOffset( )    判断与GMT的时间差
    Date.getUTCDate( )    返回该天是一个月的哪一天(世界时)
    Date.getUTCDay( )    返回该天是星期几(世界时)
    Date.getUTCFullYear( )    返回年份(世界时)
    Date.getUTCHours( )    返回Date对象的小时字段(世界时)
    Date.getUTCMilliseconds( )    返回Date对象的毫秒字段(世界时)
    Date.getUTCMinutes( )    返回Date对象的分钟字段(世界时)
    Date.getUTCMonth( )    返回Date对象的月份(世界时)
    Date.getUTCSeconds( )    返回Date对象的秒字段(世界时)
    Date.getYear( )    返回Date对象的年份字段(世界时)
    Date.parse( )    解析日期/时间字符串
    Date.setDate( )    设置一个月的某一天
    Date.setFullYear( )    设置年份,也可以设置月份和天
    Date.setHours( )    设置Date对象的小时字段、分钟字段、秒字段和毫秒字段
    Date.setMilliseconds( )    设置Date对象的毫秒字段
    Date.setMinutes( )    设置Date对象的分钟字段和秒字段
    Date.setMonth( )    设置Date对象的月份字段和天字段
    Date.setSeconds( )    设置Date对象的秒字段和毫秒字段
    Date.setTime( )    以毫秒设置Date对象
    Date.setUTCDate( )    设置一个月中的某一天(世界时)
    Date.setUTCFullYear( )    设置年份、月份和天(世界时)
    Date.setUTCHours( )    设置Date对象的小时字段、分钟字段、秒字段和毫秒字段(世界时)
    Date.setUTCMilliseconds( )    设置Date对象的毫秒字段(世界时)
    Date.setUTCMinutes( )    设置Date对象的分钟字段和秒字段(世界时)
    Date.setUTCMonth( )    设置Date对象的月份字段和天数字段(世界时)
    Date.setUTCSeconds( )    设置Date对象的秒字段和毫秒字段(世界时)
    Date.setYear( )    设置Date对象的年份字段
    Date.toDateString( )    返回Date对象日期部分作为字符串
    Date.toGMTString( )    将Date转换为世界时字符串
    Date.toLocaleDateString( )    回Date对象的日期部分作为本地已格式化的字符串
    Date.toLocaleString( )    将Date转换为本地已格式化的字符串
    Date.toLocaleTimeString( )    返回Date对象的时间部分作为本地已格式化的字符串
    Date.toString( )    将Date转换为字符串
    Date.toTimeString( )    返回Date对象日期部分作为字符串
    Date.toUTCString( )    将Date转换为字符串(世界时)
    Date.UTC( )    将Date规范转换成毫秒数
    Date.valueOf( )    将Date转换成毫秒表示
    View Code

    详见:http://www.cnblogs.com/suoning/p/5656403.html3

  • 相关阅读:
    第二周作业
    求最大值及下标编程总结
    查找整数编程总结
    课程设计第一次实验总结
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5766926.html
Copyright © 2020-2023  润新知