精华内容
下载资源
问答
  • python算是高级语言里面...是编程语感的培养,所以在学习python之前先把相关的概念有个大致的了解,慢慢培养自己的计算机语感,很多老程序员会自然说这么一句话,今天完全没有感觉,等明天再搞,编程代码的编写要...

    python算是高级语言里面入门比较简单的编程语言,集成度非常高,初学很容易培养形成自豪感,对于初学者是一种精神上的鼓励,短短的几行代码就能展示出很炫酷的功能对于初学者而言简直就是一种恩赐,对于零基础的初学者最大的问题,是编程语感的培养,所以在学习python之前先把相关的概念有个大致的了解,慢慢培养自己的计算机语感,

    很多老程序员会不自然说这么一句话,今天完全没有感觉,等明天再搞,编程代码的编写要的就是一种感觉,初学者先了解下常见的概念,操作系统,数据结构,socket编程,多线程,html,css,JavaScript等基础概念这样到真正开始学的时候,起码能有个大概印象。

    现在主流的人工智能开源框架,其实很多是Python完成的。另外Python和C/C++联系非常紧密,这使得Python在AI开发方面占据很大的优势:真正涉及到效率的,可直接通过Python调用底层的C/C++来完成!

    此外Python还广泛应用在WEB开发、网络编程、游戏开发、Linux服务器、自动化运维、金融分析、科学运算等,不计其数……

    Python人才需求量不降反增

    现在中国对Python的使用量已经跃居全球首位,越来越多的高手都使用 Python来编写框架、制作工具、完成功能,那么开发功能的人也将被绑定在这个路径上,只能选择用Python来开发。

    这样的一个正反馈循环,就像在滚雪球。不仅催生出许多Python岗位,更直接推高了Python工程师的人才需求量。我们爬取了全国的Python职位,发现其岗位需求增速174%,达到首位。

    另外Python薪资最高的是一线城市,竟然平均月薪高达20k。

    即便是二线城市,如武汉,Python开发工程师的平均工资也高达¥11280/月。一般都能在11K-20K之间。

    但总有些人说,z自学了半年Python还是找不到工作。

    其实是这样的:

    市场上需要的Python人员非常多,而且按照现在的势头,以后会需要更多的Python开发人员,理由是以后每个人公司都会有自己的网站,有自己的开发部,对于用户体验看的非常重要。所以Python程序员就会很吃香。随时时间的推移,企业对于Python开发者的要求也在不断提高,互联网公司注重效率,所以不会培养新人

    其实零基础学Python,就好比零基础学钢琴。难道1个月学会了弹《小星星》,就能找到工作吗?

    后面接着学,如果想有所建树,不能单单只学Python,而不研究其它。就像学钢琴,还得学乐理和其他乐器,才能慢慢往朗朗的水平靠拢。

    但总有很多人停留在弹小星星的水平,然后抱怨找不到工作。这就好比坐井观天。Python资源分享Q群:855408893 内有安装包,学习视频资料,免费直播实战案例。这里是Python学习者的聚集地,零基础,进阶,都欢迎点击加入Python资源分享

    所以请观望的小伙伴放心:

    学Python不会找不到工作。找不到工作的话,说明你只学了Python。

    学会Python之后,你更应该继续拓展,挖掘自己感兴趣的领域,是Linux运维?数据挖掘?Web?还是人工智能?……这些根正苗红的就业和发展方向,都值得我们为之继续探索。

    一直很喜欢一位网友的分享和三观,在此也分享给大家:

    做个比喻,不从悬崖上跳下去,你怎么知道你不是鹰呢?相对于以往死气沉沉熬资历的时代,现在已是充满希望的时代。

    展开全文
  • JavaScript学习手册五:JS数组

    热门讨论 2021-04-18 22:07:08
    JS数组1、数组的创建、读写和长度任务描述相关知识代码文件2、数组元素的增减任务描述相关知识代码文件3、数组的遍历和多维数组任务描述相关知识代码文件4、数组的常用方法任务描述相关知识代码文件数组的创建、读写...

    1、数组的创建、读写和长度

    任务描述

    本关任务:掌握创建数组的方法,获取数组的元素和长度。

    • 本关的编程任务是补全右侧代码片段中begin至end中间的代码,具体要求如下:
    • 已知两个数组array1和array2,参数a是一个整数,先判断a的值与数组array1的长度值相等,如果相等,返回数组array1的最后一个元素,反之,则返回数组array2的最后一个元素;
    • 平台将读取用户补全后的ArrayCreate.js;
    • 调用其中的mainJs()方法,并输入若干组测试数据作为参数;
    • 接着根据测试的输出判断程序是否正确。

    以下是测试样例:

    测试输入:
    7
    预期输出:
    hello
    

    相关知识

    数组的出现就是为了批量处理数据。

    数组的创建

    • 创建数组有两种方法,一是使用数组字面量,简单来说就是在[]之中列出数组的所有元素:
    var numberArray = [1,2,3,4,5];//数字数组
    var stringArray = ["java","script","edu","coder"];//字符串数组
    var mixArray = [1,2,"java",true,6.6];//混合数组
    

    如上,各元素之间用,隔开。JavaScript中数组的元素可以是不同的数据类型,如上面的第三个数组。

    • 创建数组的第二种方法是新建一个Array对象的实例,如:
    var myArray = new Array();//创建一个初始为空的数组
    var lengthMixArray = new Array(6);//创建一个长为6的数组
    

    这种情况下可以设置数组的长度(即数组中元素的个数),也可以不设置。

    数组元素的读取和写入

    • 数组元素的读取和写入在形式上相似,都是用赋值符号连接的两个表达式。
    • 读取时,存放读入值的变量在左边,数组元素在右边:
    var readArray = [1,3,"js",true,2.22];
    var read = readArray[0];//读取第一个元素到变量read中
    

    写入时,数组元素在左边,待写值在右边:

    var writeArray = [1,3,"js",true,2.22];
    writeArray[0] = 2;//在第一个元素的位置写入2
    console.log(writeArray[0]);//原来的1已经被覆盖,输出2
    

    数组长度

    • 数组长度指数组中元素的个数,等于最大索引值加1,数组的length属性即数组的长度。
    var arrayLength = [1,"js",true];
    console.log(arrayLength.length);//输出3
    
    • 数组的长度也可以写入,当写入的值小于数组的实际长度时,数组会被删除一部分。大于实际长度时,数组会在尾部添加一些空的区域。
    arrayLength.length = 2;
    console.log(arrayLength);//输出[1,"js"]
    

    代码文件

    var array1 = [1,2,3,"js",4,true,"hello"];
    var array2 = [true,true,"java",2.1];
    function mainJs(a) {
    	//请在此处编写代码
        /*********begin*********/
        if(a==array1.length)
        return array1[array1.length-1];
        else
        return array2[array2.length-1];
        /*********end*********/
    }
    

    2、数组元素的增减

    任务描述

    本关任务:掌握数组元素增减的方法。

    • 任务是补全右侧代码片段中begin至end中间的代码,具体要求如下:
    • 将数组testArray的最后a个元素移动到最前面,这a个元素之间的相对位置不变,其余元素之间的相对位置不变;
    • 比如将数组[1,2,3,4,5]最后2个元素移动到最前面,数组变为[4,5,1,2,3];
    • 返回移动结束后数组在索引b处的元素;
    • 平台将读取用户补全后的ArrayAddDelete.js;
    • 调用其中的mainJs()方法,并输入若干组测试数据作为参数;
    • 接着根据测试的输出判断程序是否正确。

    以下是测试样例:

    测试输入:
    2,0
    预期输出:
    c#
    

    相关知识

    • 数组元素的增删是JavaScript的一个特点,因为其他很多编程语言的数组是不允许增加或者删除元素的。

    数组元素的增加

    • 在JavaScript中,为数组增加元素可以在数组头部(索引最小处)或者尾部进行,可以使用数组的方法或者直接使用运算符。

    在尾部添加元素

    • 最直观的方法是直接给当前尾部元素的后一个位置赋值。
    var numberArray = [12,23,34,45];
    numberArray[numberArray.length] = 56;
    console.log(numberArray);//输出[12,23,34,45,56]
    
    • 第二种方法是使用push()函数,往数组的末尾添加一个或多个元素,参数是要添加的元素,返回数组长度。
    //利用push()方法在数组尾部添加元素
    var numberArray = [12,23,34,45];
    var newLength = numberArray.push(56);
    console.log(newLength);//输出5
    console.log(numberArray);//输出[12,23,34,45,56]
    

    在头部添加元素

    • unshift()方法在数组的头部添加元素,并返回数组新的长度,其余元素自动向索引大的方向移动。
    var sArray = ["ja","va","script"];
    var newLength = sArray.unshift("he","llo");
    console.log(newLength)//输出5
    console.log(sArray);//输出["he","llo","ja","va","script"];
    

    数组元素的删除

    • 删除也能在数组头部(索引值小)或者尾部进行。

    在尾部删除元素

    • 上一关介绍过一种方法:直接修改数组长度为更小的值。
    var array = [1,2,true,"hello"];
    array.length = 3;//索引最大的元素被删除
    console.log(array);//输出[1,2,true]
    
    • 第二种方法是使用delete运算符。delete运算符后接要删除的元素,但是删除后,会有一个空占位符,所以数据的长度保持不变。如:
    var dArray = [11,22,33,44,55];
    delete dArray[4];//删除索引最大的元素
    console.log(dArray);//输出[11,22,33,44]
    console.log(dArray.length); //长度为5
    
    • 第三种方法是使用pop(),一次删除一个,并返回被删除的元素。
    //利用pop()方法在数组尾部删除元素
    var numberArray = [3,4,5,6,7];
    var deletedNumber = numberArray.pop();
    console.log(deletedNumber);//输出被删除的元素7
    console.log(numberArray);//删除后的数组为[3,4,5,6]
    

    在头部删除元素

    • 有unshift(),自然有shift(),shift()的作用是删除数组头部一个元素并返回该元素,然后所有元素往索引值小的方向移动一位。

    初学者很容易混淆这两个方法,建议记住shift单词的意思是:删除,去掉。

    var dArray = [11,22,33,44,55];
    console.log(dArray.shift());//输出11,11被从数组中删除
    console.log(dArray);//输出[22,33,44,55]
    

    代码文件

    var testArray = [12,"java","js","c","c++",24,36,"python","c#","css"];
    function mainJs(a,b) {
        a = parseInt(a);
        b = parseInt(b);
        //请在此处编写代码
        /*********begin*********/
        var i;
        for(i=testArray.length-a;i<testArray.length;i++)
            testArray.unshift(testArray.pop());
        return testArray[b];
        /*********end*********/
    }
    

    3、数组的遍历和多维数组

    任务描述

    本关任务:将一个一维数组转换为二维数组,行优先。

    • 任务是补全右侧代码片段中begin至end中间的代码,具体要求如下:
    • 将一维数组arr转为a行b列的二维数组,行优先;
    • 返回该二维数组;
    • 平台将读取用户补全后的MultiArray.js;
    • 调用其中的mainJs()方法,并输入若干组测试数据作为参数;
    • 接着根据测试的输出判断程序是否正确。

    以下是测试样例:

    测试输入:
    6,4
    预期输出:
    [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 23, 22]]
    

    相关知识

    数组的遍历

    • 数组的遍历指按顺序访问你数组的每一个元素。有两种方法:

    使用for循环

    //依次在浏览器的控制台输出one,two,three,four
    var stringArray = ["one","two","three","four"];
    for(var i=0,sLength=stringArray.length;i<sLength;i++) {
        console.log(stringArray[i]);
    }
    

    使用forEach()方法

    • forEach()方法的参数是一个无名字的函数,函数有三个参数,
    • 第一个参数是当前的数组元素,
    • 第二个参数是当前的索引,
    • 第三个参数是数组对象的索引。
    • 与for循环的区别是无法用break中断循环。
    var numArr = [10,11,12,13,14];
    numArr.forEach(function(mem,i,arr) {
        mem *= 10;
        arr[i] = mem;
    });
    console.log(numArr);//输出[100,110,120,130,140]
    

    多维数组的实现

    • 多维数组实际上就是数组的数组,指数组的每一个元素也是一个数组,这里仅讨论二维数组。
    • JavaScript中二维数组的列的长度不唯一,第一列可以有4个元素,第二列可以有5个元素,等等。

    二维数组的创建 创建已知的二维数组:

    var multiArr = [[1,2,3,4],[5,6,7],[8,9]];
    

    创建仅知道长度的二维数组

    //创建一个4行6列的二维数组
    var muArr = new Array(4);
    for(var i = 0;i <4;i++) {
        muArr[i] = new Array(6);
    }
    

    二维数组的读写

    • 二维数组的读写用数组名[][]的方式,
    • 第一个中括号内为行数,从0计数,
    • 第二个中括号内为列数,也从0计数。
      以上面的数组multiArr为例:
    var multiArr = [[1,2,3,4],[5,6,7],[8,9]];
    console.log(multiArr[1][1]);//读元素,输出6
    multiArr[0][0] = 0;//写元素
    

    代码文件

    var arr = [1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15,16,17,18,19,20,21,23,22];
    function mainJs(a,b) {
        a = parseInt(a);
        b = parseInt(b);
        //请在此处编写代码
        /*********begin*********/
        var shuzu = new Array(a);
        for(var i=0;i<a;i++)
            shuzu[i] = new Array(b);
        var hang=0;
        var lie=0;
        for(var i=0;i<arr.length;i++){
            shuzu[hang][lie]=arr[i];
            lie++;
            if(lie==b){
                hang++;
                lie=0;
            }
            if(hang==a)
                break;
        }
        return shuzu;
        /*********end*********/
    }
    

    4、数组的常用方法

    任务描述

    本关任务:掌握数组的常用方法。

    • 获取字符串a在数组myArray的所有位置并组成一个位置数组;
    • 获取字符串b在数组myArray的所有位置并组成一个位置数组;
    • 合并这两个数组然后返回合并后的数组。
    • 平台将读取用户补全后的ArrayMethod.js;
    • 调用其中的mainJs()方法,并输入若干组测试数据作为参数;
    • 接着根据测试的输出判断程序是否正确。
      以下是测试样例:
    测试输入:
    a,a,c,b,b
    预期输出:
    [0,1,3,4]
    

    相关知识

    查找元素的位置

    • 根据值查找元素的位置,有两个方法:indexOf()lastIndexOf(),前者从索引小处往大搜索,后者相反。都返回第一次遇到该元素时的索引。
    • 两者都有两个参数,第一个参数为要查找的元素,第二个参数可选,为搜索的起点索引。如:
    var search = ["a","b","a","b","c","d","a","a","b","a"];
    console.log(search.indexOf("a"));//输出0
    console.log(search.lastIndexOf("a"));//输出9
    console.log(search.indexOf("a",2));//输出2,从索引为2处开始搜索
    
    • 第二个参数可以是负数,-1表示倒数第一个元素,-2表示倒数第二个元素,依次类推。如:
    var search = ["a","b","a","b"];
    console.log(search.indexOf("a"-3));//输出2
    console.log(search.lastIndexOf("a"-3));//输出0
    

    数组的合并

    • concat()实现数组合并,其形式是数组a.concat(数组b),合并之后返回新数组,新数组为数组a后面连接数组b,但是数组a和b不变。
    var a = [1,2,3];
    var b = [4,5,6];
    var c = a.concat(b);//合并后返回新数组
    console.log(c);//输出[1,2,3,4,5,6]
    

    数组倒置

    • reverse()实现数组倒置,无参数,返回倒置后的数组,同时调用该方法的数组也会被倒置。称为就地逆置。
    var a = [1,2,3,4];
    var b = a.reverse();
    console.log(a);//输出[4,3,2,1]
    console.log(b);//输出[4,3,2,1]
    

    元素合并

    • join()将数组的所有元素连接起来组成字符串,参数为元素之间的分隔符,默认逗号。
    var sArray = ["June","July","August"];
    console.log(sArray.join());//输出June,July,August
    console.log(sArray.join("+"));//输出June+July+August
    

    元素排序

    • sort()实现数据元素排序,不带该参数表示元素按照ASCII表从小到大排序(参考JavaScript学习手册三)。如:
    var stringArray = ["a","ab","b","aa"];
    stringArray.sort();
    console.log(stringArray);//输出["a","aa","ab","b"]
    

    需要注意的是数字的排序,例子如下:

    var arr = [1,2,10,5,12];
    arr.sort();
    console.log(arr);//输出[1,10,12,2,5];
    

    带参数的格式如下:

    arr.sort(function(a,b){
                return a-b;  //升序排列
    })
    

    或者:

    arr.sort(function(a,b){
                return b-a;  //降序排列
    })
    

    说明:

    • arr是要排序的数组;
    • a,b是两个参数,返回a-b,升序排列,返回b-a,降序排列。
    • 对于数字的排序,sort()带参数和不带参数是不一样的,例子如下:
    var arr = [1,2,10,5,12];
    arr.sort();
    console.log(arr);//输出[1,10,12,2,5]
    arr.sort(function(a,b){
         return a-b;
    });
    console.log(arr);//输出[1,2,5,10,12]
    

    提取子数组

    • slice()返回切割出的子数组,不修改原来的数组。
    • 它有两个整数参数a和b,a表示切割的起点,该点属于子数组;b可选,表示切割的终点,该点不属于子数组。
    • a和b都可以为负数,如-1表示倒数第一个位置,依次类推。
    var arr = ["a","b","c","d","e"];
    console.log(arr.slice(0,3));//["a","b","c"]
    console.log(arr.slice(0,-2));//["a","b","c"]
    console.log(arr.slice(4));//["e"]
    console.log(arr.slice(-4));//["b","c","d","e"]
    

    代码文件

    function mainJs(myArray) {
        myArray = myArray.split(",");
        //请在此处编写代码
        /*********begin*********/
        var a = new Array();
        var i = 0;
        while(i<myArray.length){
            i = myArray.indexOf("a",i);
            if(i==-1)
                break;
            a.push(i++);
        }
        var b = new Array();
        var j = 0;
        while(j<myArray.length){
            j = myArray.indexOf("b",j);
            if(j==-1)
                break;
            b.push(j++);
        }
        return a.concat(b);
        /*********end*********/
    }
    

    5、数组的应用——内排序

    任务描述

    本关任务:掌握冒泡排序和选择排序。

    具体要求如下:

    • 函数mainJs(a)中的变量arr是一个数组,你需要对该数组进行选择排序;
    • 返回选择排序进行过程中,在每一趟交换前,待排序子数组的最大元素的位置组成的数组;
    • 比如对于上面相关知识中的数组[9,5,8,0,2,6],
    • 第一次交换前,最大的元素9的索引是0,
    • 第二次交换前,最大元素8的索引是2,
    • 第三次交换前,最大元素6的索引是0,
    • 第四次交换前,最大元素5的索引是1,
    • 第五次交换前,最大元素2的索引是1,
    • 第六次交换前,最大元素0的索引是0。
    • 索引需要返回的数组是[0,2,0,1,1,0];

    相关知识

    所谓排序是指将一组数据按照从小到大(或从大到小)的顺序重新排列,排序是面试常考的问题之一。

    1. 排序一般分为两个步骤:比较和移动。比较指判断两个数据之间的大小关系,移动指根据大小关系把数据移动到合适的位置上。
    2. 待排序的数据大多是放置在数组中,一是因为数组中的数据有相对的顺序,二是遍历数组操作起来比较简单。

    下面介绍JavaScript中两种常见的排序方式:冒泡排序和选择排序。

    冒泡排序

    一趟冒泡排序

    • 先介绍一趟冒泡排序的过程。
    • 以升序为例,从第一个元素开始,将第一个元素与第二个元素比较,如果第一个元素大于第二个元素,交换这两者。
    • 如下图所示,9比5大,交换两者的位置后,9就到后面去了。
      在这里插入图片描述
    • 然后第二个元素与第三个元素比较,将大的移动到后面;第三个元素与第四个元素比较……,这样一直进行下去,直到倒数第二个元素和最后一个元素进行比较,称为一趟冒泡排序,结束后最大的元素已经移到了索引最大处。下面的图展示了每一次比较并交换后的数组:
    • 在这里插入图片描述
      可以看到,一趟冒泡排序结束后,最大的元素9移到了索引最大处。

    冒泡排序全过程

    • 接下来对除了最后一个元素的数组进行第二趟冒泡排序,结果是第二大的元素到了索引第二大的地方。这样一直进行下去,直到整个数组有序或者某一趟排序的时候不存在元素的交换。
      在这里插入图片描述
      第四趟冒泡过程中,未发生元素的交换,结束。
    • 因为排序的原理是不断的把大的数据往上浮动,故而命名为冒泡排序。
    //冒泡排序
    var arr = [958026];
    var aLength = arr.length;
    var temp;
    var flag = 0;//元素交换的标志位
    for(var i = 1;i < aLength;i++) {//共进行n-1次冒泡
        flag = 0;
        for(var j = 0;j < aLength-i;j++) {//一次冒泡
            if(arr[j]>arr[j+1]) {//交换元素
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = 1;
            }
        }
        if(flag == 0) break;//本次冒泡没有元素交换
    }
    console.log(arr);
    

    冒泡排序关键在于这两个循环的控制,外层循环控制冒泡的次数,一般是n-1次,n表示数组长度。

    • 内循环j的初值为0,因为不论是第几趟冒泡,都是从arr[0]开始遍历数组,j的上限设置为arr.length-i,因为随着冒泡的进行,越往后需要比较的数组的索引上限越小。

    选择排序

    一趟选择排序

    • 原理:遍历数组,记录下最大元素的索引值,将最大的元素与数组最后一个元素交换,这样最大的元素到了索引值最大的地方,称为一趟选择排序。与冒泡不同的是,只会发生一次交换。
      在这里插入图片描述
      可以看到9移到了索引最大处。

    选择排序全过程

    • 第二趟选择排序是在除了最后一个元素的数组中选择最大的元素,将它与索引值第二大的元素交换,结束后第二大的元素也到了最终的位置上。这样一直进行下去,一共n-1趟选择排序。
      在这里插入图片描述
    //选择排序
    var arr = [6,12,3,34,1,56,77,0,2,43];
    var aLength = arr.length;
    var temp;
    var max = arr[0];
    var maxIndex = 0;
    for(var i = 0;i < aLength-1;i++) {//共进行n-1次选择
        for(var j = 1;j < aLength-i;j++) {//一次选择
            if(arr[j] > max) {
                max = arr[j];
                maxIndex = j;
            }
        }
        //将本次选出的最大元素移动到最终的位置上
       temp = arr[aLength-i-1];
        arr[aLength-i-1] = arr[maxIndex];
        arr[maxIndex] = temp;
        var max = arr[0];
        var maxIndex = 0;
    }
    console.log(arr);
    
    • 这里也有两个大循环,第一个循环控制总的排序趟数,第二个循环求本次选择出的最大元素的索引值,第二个循环结束后将本次的最大值与最终位置上的元素交换。

    代码文件

    function mainJs(a) {
        var arr = a.split(",");
        for(var i = 0;i < arr.length;i++) {
            arr[i] = parseInt(arr[i]);
        }
        //请在此处编写代码
        /*********begin*********/
        var temp;
        var max = arr[0];
        var key;
        var shuzu = new Array();
        for(var i=0;i<arr.length-1;i++){
            for(var j=1;j<arr.length-i;j++){
                 if(arr[j]>max){
                     max = arr[j];
                     key = j;
                 }
            }
            shuzu[i] = key;
            temp = arr[arr.length-i-1];
            arr[arr.length-i-1] = arr[key];
            arr[key] = temp;
            max = arr[0];
            key = 0;
    
        }
        return shuzu;
    
        /*********end*********/
    }
    
    展开全文
  • 从AjaxJQuery Ajax学习

    2021-08-08 02:46:42
    这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some...

    Ajax篇

    XMLDocument和XMLHttpRequest对象

    第一:创建XMLHttpRequest请求对象

    function getXMLHttpRequest() {

    var xRequest=null;

    if(window.XMLHttpRequest) {

    xRequest=new XMLHttpRequest();

    }else if(typeof ActiveXObject != "undefined"){

    xRequest=new ActiveXObject("Microsoft.XMLHTTP");

    }

    return xRequest;

    }

    或者:

    var request=null;

    function createRequest() {

    try {

    request=new XMLHttpRequest(); //非Microsoft IE浏览器

    } catch (trymicrosoft) { //Microsoft IE

    try {

    request=new ActiveXObject(“Msxml2.XMLHTTP”);

    } catch (othermicrosoft) {

    try {

    request=new ActiveXObject(“Microsoft.XMLHTTP”);

    } catch (failed) {

    request=null;

    }

    }

    }

    if (request==null)

    alert(“Error creating request object!”);

    }

    [code]

    这个独立的创建XMLHttpRequest请求对象的函数就可以被调用了。

    注意:XMlHTTP对象不是W3C标准,因此在创建时要分别考虑不同浏览器环境的支持。

    XMLHTTP对象一共就6个方法8个属性,支持两种执行模式:同步和异步。

    XMLHTTP对象的属性和方法列表(来自IXMLHTTPRequest接口): 属性名

    类型

    描述

    onreadystatechange

    N/A

    指定当就绪状态发生改变时调用的事件处理函数,仅用于异步操作

    readyState

    Long

    异步操作的状态:未初始化(0),正在加载(1),已加载(2),交互(3),已完成(4)

    responseBody

    Variant

    将响应信息正文作为unsigned byte数组返回

    responseStream

    Variant

    将响应信息正文作为一个ADO Stream对象返回

    responseText

    String

    将响应信息正文作为一个文本字符串返回

    responseXML

    Object

    通过XMLDom将响应信息正文解析为XMLDocument对象

    status

    Long

    服务器返回的HTTP状态码

    statusText

    String

    服务器HTTP响应行状态

    方法名

    描述

    abort

    取消当前 HTTP 请求

    getAllResponseHeaders

    从响应信息中检索所有的首部字段

    getResponseHeader

    从响应信息正文中获得一个 HTTP 首部字段值

    open(method,url,boolAsync,bstrUser,bstrPassword)

    打开一个与 HTTP 服务器的连接

    send(varBody)

    向HTTP服务器发送请求。可包含正文。

    setRequestHeader(bstrHeader, bstrValue)

    设定一个请求的首部字段

    第二:向服务器发送请求

    通过XMLHttpRequest对象向服务器发送请求是非常简单,只需要给它传递一个服务器页面的URL,这个页面将生成数据。

    [code]

    function sendRequest(url,params,HttpMethod) {

    if(!HttpMethod){

    HttpMethod="POST";

    }

    var req=getXMLHttpRequest();

    if(req){

    req.open(HttpMethod,url,true);

    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    req.send(params);

    }

    }

    通过以上代码对请求进行设置后,会立即将控制权返回给我们,与此同时网络和服务器则忙着执行它们自己的任务。

    第三:使用回调函数监视请求

    通过XMLHttpRequest对象我们向服务器发送了异步请求,那我们怎样才能知道请求已经完成了呢?因此处理异步通信的第二个部分是在代码中设置一个入口点,以便在调用结束的时候可以获取结果信息。这通常是通过分配一个回调函数来实现的。

    回调函数非常适合用于大多数现代UI工具箱中的事件驱动的编程方法。

    以下我们重写sendRequest()函数,如下:

    var req=null; //声明一个全局变量

    function sendRequest(url,params,HttpMethod) {

    if(!HttpMethod){

    HttpMethod="GET";

    }

    req=getXMLHttpRequest();

    if(req){

    req.onreadystatechange=onReadyStateChange; //注意这就是onreadystatechange回调函数用来监视请求。具体是通过自定义的Javascript函数onReadyStateChange()来进行事件处理。

    req.open(HttpMethod,url,true);

    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    req.send(params);

    }

    }

    以下的回调函数onReadyStateChange就是用来处理从服务器得到的响应信息。

    view sourceprint?01 function onReadyStateChange(){

    02 var data=null;

    03 if (req.readyState==4){

    04

    05 if (req.status==200) {

    06 data=req.responseText;

    07 } else {

    08 data="loading.....["+req.readState+"]";

    09 }

    10

    11 }

    12 .....在这可以做一些与此返回信息有关的操作,比如输出信息等。

    13 }

    上述代码中使用了XMLHttpRequest对象的responseText属性,以文本字符串的形式获取响应中的数据。对于简单的数据来说这是有用的。当我们需要服务器返回更大的结构化的数据集,就可以使用responseXML属性。如果已经将响应的MIME类型正确设置为text/xml,这个属性就会返回一个DOM文档,因此我们可以使用DOM的属性和函数(例如getElementById()和childNodes)来对它进行处理。

    JQuery Ajax篇

    jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据

    jQuery 的底层 AJAX 实现。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。$.ajax() 只有一个选项参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。 参数名

    类型

    描述

    url

    String

    (默认: 当前页地址) 发送请求的地址。

    type

    String

    (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。

    timeout

    Number

    设置请求超时时间(毫秒)。此设置将覆盖全局设置。

    async

    Boolean

    (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

    beforeSend

    Function

    发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。

    function (XMLHttpRequest) {

    this; // the options for this ajax request

    }

    cache

    Boolean

    (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。

    complete

    Function

    请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。

    function (XMLHttpRequest, textStatus) {

    this; // the options for this ajax request

    }

    contentType

    String

    (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。

    data

    Object,

    String

    发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如:

    {foo:["bar1", "bar2"]}转换为 '&foo=bar1&foo=bar2'。

    dataType

    String

    预期服务器返回的数据类型。如果不指定,jQuery 将自动根据HTTP 包 MIME 信息返回responseXML 或 responseText,并作为回调函数参数传递,可用值:

    "xml": 返回 XML 文档,可用 jQuery 处理。

    "html": 返回纯文本 HTML 信息;包含 script 元素。

    "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。

    "json": 返回 JSON 数据 。

    "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

    error

    Function

    (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。

    function (XMLHttpRequest, textStatus, errorThrown) {

    // 通常情况下textStatus和errorThown只有其中一个有值

    this; // the options for this ajax request

    }

    global

    Boolean

    (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件

    ifModified

    Boolean

    (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。

    processData

    Boolean

    (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。

    success

    Function

    请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态

    function (data, textStatus) {

    // data could be xmlDoc, jsonObj, html, text, etc...

    this; // the options for this ajax request

    }

    这里Ajax事件里面的 this 都是指向Ajax请求的选项信息的。

    jQuery.ajaxSetup( options ) : 设置全局 AJAX 默认选项。

    如:设置 AJAX 请求默认地址为 "/xmlhttp/",禁止触发全局 AJAX 事件,用 POST 代替默认 GET 方法。其后的 AJAX 请求不再设置任何选项参数。其示例代码:

    $.ajaxSetup({

    url: "/xmlhttp/",

    global: false,

    type: "POST"

    });

    $.ajax({ data: myData });

    serialize() 与 serializeArray()

    serialize() : 序列表表格内容为字符串。

    serializeArray() : 序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。

    以上JQuery Ajax的底层实现,我们一般很少用到,JQuery对jQuery.ajax()进行了封装,使我们能够更加简便的使用Ajax异步调用。

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。

    url (String) : 请求的HTML页的URL地址。

    data (Map) : (可选参数) 发送至服务器的 key/value 数据。

    callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。

    这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector"。

    这个方法可以很方便的动态加载一些HTML文件,例如表单。

    2. jQuery.get( url, [data], [callback] ) :使用GET方式来进行异步请求

    url (String) : 发送请求的URL地址.

    data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示,会作为QueryString附加到请求URL中。

    callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。

    3. jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求

    url (String) : 发送请求的URL地址.

    data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示。

    callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。

    type (String) : (可选)官方的说明是:Type of data to be sent。其实应该为客户端请求的类型(JSON,XML,等等)

    如果你设置了请求的格式为"json", 此时你没有设置Response回来的ContentType 为:Response.ContentType = "application/json"; 那么你将无法捕捉到返回的数据。

    4. jQuery.getScript( url, [callback] ) : 通过 GET 方式请求载入并执行一个 JavaScript 文件。

    url (String) : 待载入 JS 文件地址。

    callback (Function) : (可选) 成功载入后回调函数。

    jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。

    这个方法可以用在例如当只有编辑器focus()的时候才去加载编辑器需要的JS文件。

    展开全文
  • 猿人题库十四题——js_fuck核心代码加密 1. 首先 进入 浏览器的开发者工具, 查看 网页Network的请求,多点击几次,查看请求的参数变化,可以看到 就俩个参数 page: 页数 uc: 加密的参数 (每次请求都...

    猿人学题库十四题——js_fuck核心代码加密

     

    1.  首先 进入 浏览器的开发者工具,

    查看 网页Network的请求,多点击几次,查看请求的参数变化,可以看到 就俩个参数

    1. page:  页数

    2. uc:      加密的参数 (每次请求都是不一样的)

    POST 请求,返回数据是对应的上的 

    2. 解析请求参数

    想找到请求的JS函数,可以在 请求的Initator栏目里面的找到 js 方法行数

    点击跳转进去后,可以看到 [][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]  这些乱七八糟的 【】 的骚操作,肯定看不懂

    把看不懂的【】 东西,复制到 复制到控制台打印,把最后一个 () 去掉就好(这里()结尾是一个 JS的自执行函数),看到的就是 函数本体了

    这里可以看到 js 做了什么操作,执行了 window.a 方法,有赋值给了   window.a

    这里我们看到 上面的 window.a 函数里面是个 加密的操作  CryptoJS.AES,ECB 模式,

    1. 可以用python实现,

    2. 也可以直接搬就好了 (JS 调试工具),或 手动扣 JS 

    AES 加密的参数  是  window.t + '|' + window.num ,window.t 是 上面的时间戳,好实现,

    在上面的请求发送的地方,我们可以看到  window.a 就是 请求的 uc 参数,这样就可以模拟实现 us 参数了,

    点击下一页可以看到 num为2, window.num 也是等于 num 的,call 函数的参数,后面可以看到 就是当前页面的 页数

    到这里就可以知道 俩个参数的由来,可以模拟实现请求的过程了。

     

    3.  撸代码 

    通过 JS调试工具 直接复制出 加密的 JS 方法,用python调用

    1.  扣 JS 代码 

    下面 我打开 JS 调试工具 演示如下:

                       

    # 这里 key 加密的密钥 改成自己的就好
    var k = 'wdf2ff*TG@*(F4)*YH)g430HWR(*)' + 'wse';
    var key = CryptoJS.enc.Utf8.parse(k);
    

    2.  python 代码

    # -*- encoding=utf-8 -*-
    import requests
    import execjs
    import time
    
    cookies = {
        '__jsl_clearance': '1608261821.430^|0^|clD4VpfqhdaLBWywKWy^%^2FZyfi6d_ec7ca97682d99d81fce6db1bdab965553D',
        'Hm_lvt_337e99a01a907a08d00bed4a1a52e35d': '1608000796,1608016679,1608255922,1608624452',
        'sessionid': 'cxmtcjx4lmxe707wp40qdi0n9pvc0v51',
        'Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d': '1608624789',
    }
    headers = {
        'Proxy-Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Origin': 'http://www.python-spider.com',
        'Referer': 'http://www.python-spider.com/challenge/14',
        'Accept-Language': 'zh-CN,zh;q=0.9',
    }
    
    with open('./JS/AES.js') as f:
        Str_code= f.read()
    js=execjs.compile(Str_code)
    
    t = int(time.time())
    word = str(t)+'|'+'1'
    result=js.call('AES_Encrypt',word)
    word2=js.call('AES_Decrypt',result)
    
    
    Count = 0
    for i in range(1,101):
        t = int(time.time())
        word = str(t) + '|' + str(i)
        result = js.call('AES_Encrypt', word)
        data = {
          'page': str(i),
          'uc': result
        }
        response = requests.post('http://www.python-spider.com/api/challenge14', headers=headers,data=data, verify=False)
        res = response.json()
        print(res)
        for data in res['data']:
            Count +=int(data['value'])
    
        print('Count -->>',Count)
    
    # 答案 5175137

     

    总结 :

    通过 参数加密的方式来进去反爬虫,而我们需要找出网站加密参数的方式和逻辑,然后生成参数携带请求获取正确的数据,这里可能要了解一下加密的知识可以补充一些,多活用根据吧

     

     

    展开全文
  • JavaScript 总结 JavaScript是互联网上最流行的脚本语言,这...var 声明的变量会被提升当前作用域的最前面,它的作用域范围也就是当前作用域,即使它是在语句块中声明。 let、const声明的变量会绑定当前语句块(暂时
  • 不过要是自学的话,除非你有非常非常强大的自学能力,还有意志力能够坚持的学下去。之后如果说你对linux有一定的了解了之后,可以去看看linux内核设计与实现,如果说你能读懂这个,你就是大牛了!希望对你有帮助!
  • HTML CSS完了,js和JAVA也在学,计算机本科生明年去实习,有什么好的学习方法和路线推荐?这的啥?前端嘛?找个大厂进去实习,问问目标岗位的前辈们都用的什么,感觉你这几条只是入门啊。毕竟学校出来的学生思路...
  • 猿人题库十四题——js加密_表情包+sojson6.0 1. 首先 进入 浏览器的开发者工具, 进去后首先还是 无线debug ,找到 debugg 对应的行数,右击选择 never pause here ,刷新 就不会再此处 停下了 进去后找逻辑...
  • Kotlin可以不学java吗

    千次阅读 2021-04-17 09:30:41
    可以,但是kotlin毕竟是基于jvm的,会java对学习kotlin会有帮助,尤其是如果你向从事安卓开发的话,毕竟目前安卓的核心类库是java写的,以后会不会移植kotlin不好说,所以还是学学java先吧。1、个人建议学习java,...
  • 随着信息技术的发展,人工...Web方向简单易学,要求高,还是需求岗位最多的就业方向,在web中一枝独秀的Java语言20多年一直都是语言霸主,从未被撼动过,随便在招聘网站上找了一张Java开发的工资表。 跟大多数...
  • JavaScript学习总结(思维导图篇)

    万次阅读 多人点赞 2021-02-18 22:28:51
    javaScript大牛总结篇
  • 现在有很多人想转行学习Java,原因只有一个,想要拿更高的薪资。而确实如此,在大部分岗位中程序员的薪资确实是比较高的,而且行业的上升空间会相对大一些,有更多的创业机会。 Java程序员的工资分布大概是这样的...
  • 猿人爬虫比赛第十二题 地址: http://match.yuanrenxue.com/match/12 后面的题其实想看了,索然无味。码字花的时间比看题的时间要久。 开无痕窗口,打开控制台,访问链接,分析数据包发现有一个m参数。 通过...
  • 最近前端圈曝出一本神书:JavaScript 百炼成仙,我初步了解了一点情况,分享给大家。背景介绍我叶小凡今后一定能突破层层障碍,成为一代 JavaScript 大师。熟悉的字眼,有没有?...
  • 后来,又有读者私信问我,“挺纠结的,知道该选前端还是 Java?” 真不好选,因为“男怕入错行,女怕嫁错郎”,初学者纠结这个问题也是情有可原。 首先来说说 PHP,Web 蛮荒的年代,PHP 真的是王者姿态,连 Java ...
  • 猿人爬虫比赛第十题:...处理方法要么debug要么用js-hook掉吧。然后从堆栈进去找m,拼代码。 不好意思,后面我就不看了,实在浪费时间。 猿人爬虫比赛第十一题:《app so文件协议破解》 地址: http://match.y
  • 一、Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。 Node.js 的包管理器 npm,是全球最大的开源库生态系统。 二、中文官网:...
  • 然而控制台第一次请求后响应并没有set-cookie, 那么说明其实是有响应内容的,我们以代码来请求,或者使用fiddler、charles查看 果然,携带cookie访问返回的是一堆js代码。pycharm中新建一个js文件,粘贴进去然后...
  • 文章目录前言一、网页分析二、解决...太简单了,是yuanrenxue字符串加上页数,进行Base64编码,其实做到这边就已经解出来了,但是为了做练习,还是要继续分析下去 二、解决参数 1.参数定位 2.参数解密 三、源代码 结
  • 原标题:初学前端开发需要什么?「学习必看」遇到很多新手,都会问,如果要学习web前端开发,需要学习什么?难难?多久能入门?怎么能快速建一个网站?工资能拿多少?Web前端开发技术主要包括三个要素:HTML、...
  • 当然,面临这样困惑的人,并是只有你一个,所以,这世界上就出现了许多寓教于乐的通过游戏的形式来教你编程的网站。让你快乐学习编程。学习Python过程中会遇到很多问题,你可以我们的 python学习交流群【七 三 五,...
  • 因为清晰易读的风格 ,广泛的适用性 ,Python已经成为最受欢迎的编程...比如量级稍微大些的数据 ,Office的性能根本能满足需求 ,而用 Python 可以轻松地处理、分析 。而微软也正在考虑将 Python 作为 Excel 的...
  • JavaScript基础学习

    2021-03-14 10:07:59
    今天开始学习javascript,前面已经对HTML和CSS做了一个大致的了解,不过也只是大致了解了他们的语法规则,现在如果让我做出来一个比较完美的网页我可能还做不到,不过给我一个网页的源码我至少能大致看懂每一块的...
  • 一、JavaScript 是一门什么样的语言,它有哪些特点? javaScript 一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它 的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于...
  • JavaScript学习

    2021-05-12 16:01:40
    JavaScript学习 一、数据类型和变量 1. 数据类型 (1).number 包括整数和浮点数 (2).字符串 以单引号或双引号括起来的文本 如果字符内部包含‘,则用“将其括起来 如果字符内部包含’和”,则需要用转义字符\来...
  • 重点:switch加break的话将会执行跳转的case本身以及以下所有的语句!! 举例: var year=Number(prompt('请输入年份')); var mounth=Number(prompt('请输入月份')); var day=Number(prompt('请输入天数'));
  • [javascript] 看知乎学习js闭包2019-01-23编程之家收集整理的这篇文章主要介绍了[javascript] 看知乎学习js闭包,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。搜索热词知乎:到底什么是闭包?寸志...
  • 学习JavaScript 2

    2021-07-21 09:15:49
    js 学习内容: 1.循环 for for (var i = 1; i <= 100; i++) { console.log('你好吗'); } switch: switch (1) { case 1: console.log('这是1'); break; 九九乘法表案例 <script> /...
  • 猿人题库十四题——css加密-雪碧图/数据干扰等 1. 首先 进入 浏览器的开发者工具, 打开就是 俩个无线debugg,正常的操作过掉 1. 找到 debugg 对应的行数,右击选择 never pause here ,刷新 就不会再此处 停...
  • 第一阶段 测试基础第二阶段 工具学习第三阶段 代码学习第四阶段 架构学习以上四个阶段,只是找工作的话,需要全部完,一二阶段完,基本上就能够达到初级测试阶段找到工作了。第三阶段是关于能力提升,路线发展...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,147
精华内容 30,458
关键字:

学到js学不下去了