020 Day-アルゴリズム、JSON、オブジェクト向け、コンストラクション関数によるオブジェクトの作成

60589 ワード

一、アルゴリズム-二分探索法
二分探索法:折半探索法.binarysearch. 役割:コンテンツ検索を行います.機能は配列のインスタンスメソッドに似ています.indexOf時間複雑度O(n)は通常binarysearchで配列要素のインデックスを検索します.返されるインデックスが見つかりました.そうでない場合は-1を返します.時間複雑度:O(lg(2 n))このアルゴリズムを用いる前提:数列は秩序化しなければならない.
<script>
    function random(min, max) {
      
        return ~~(Math.random () * (max - min) + min);
    }

    function randomArray(len, min, max) {
      
        var arr = [];
        for (let i = 0; i < len; i++) {
      
            arr[i] = random (min, max);
        }
        return arr;
    }

    var counter = 0;

    /**
     *                     。
     *     ,             。         -1
     * @param arr        。
     * @param key       。
     */
    function binarySearch(arr, key) {
      
        if (!Array.isArray (arr))
            return -1;
        const LEN = arr.length;
        if (LEN === 0)
            return -1;

        var low = 0;
        var high = LEN - 1;
        var mid = low + high >> 1;
        //     
        while (low <= high) {
      
            counter ++;
            var value = arr[mid];
            if (value === key) {
      //   
                return mid;
            }
            //key mid   。  low
            if (value < key) {
      
                low = mid + 1;
            } else {
      
                //key  mid   。  high
                high = mid - 1;
            }
            //   low     high。          。
            mid = low + high >> 1;
        }
        return -1;
    }

    var array = randomArray (10000, 0, 20000);
    array.sort (function (num1, num2) {
      
        return num1 - num2;
    })
    // console.log (array);
    var key = 3377;
    var index = binarySearch (array, key);
    console.log (index);
    console.log (counter);
script>

二、アルゴリズム-快速並べ替え
<script>
    function random(min, max) {
      
        return ~~(Math.random () * (max - min) + min);
    }

    function randomArray(len, min, max) {
      
        var arr = [];
        for (let i = 0; i < len; i++) {
      
            arr[i] = random (min, max);
        }
        return arr;
    }

    /**
     *             。
     * @param arr
     */
    function quickSort(arr) {
      
        if (!Array.isArray (arr))
            return;
        const LEN = arr.length;
        if (LEN <= 1)//      1,    。
            return arr;
        //         。
        var midValue = arr.splice (LEN >> 1, 1);
        var small = [];
        var big = [];
        for (let i = 0; i < arr.length; i++) {
      
            if (arr[i] < midValue)
                small.push (arr[i]);
            else
                big.push (arr[i]);
        }
        // small big          。
        var smallArr = quickSort (small);
        var bigArr = quickSort (big);
        return smallArr.concat (midValue, bigArr);
    }

    var arr = randomArray (10, 0, 100);
    console.log (arr);
    console.log (quickSort (arr));

script>

三、JSON紹介
xml:小さなロバeXtendsible markup language拡張可能なタグ言語.保存とデータ交換のフォーマットでもあります.JSON(JavaScript Object Notation,JSオブジェクトプロファイル)は、軽量レベルのデータ交換フォーマットです.ECMAScript(欧州コンピュータ協会が制定したjs仕様)のサブセットに基づいて、プログラミング言語とは完全に独立したテキストフォーマットを用いてデータを格納し、表す.簡潔で明確な階層はJSONを理想的なデータ交換言語にした.読み取りと作成が容易であり、同時に機械の解析と生成が容易であり、ネットワーク伝送効率を効果的に向上させる.JSはJSONのようなデータフォーマットを直接サポートします.対応するタイプのJSONは、jsonデータの解析および生成に使用されます.JSONは本質的に文字列の集合である.文字列は、エンティティオブジェクトを表します.JSONを使用すると、jsonデータとオブジェクトを相互に変換できます.JSONの構成:1:jsでサポートされているタイプでは、Undefindとメソッドはサポートされていません.2:すべてのキーを引用符で囲む必要があります.3:jsonデータは、jsソースコードに直接配置するか、独立したファイルに配置することができます.以jsonエンディング.json文字列オブジェクトとjsオブジェクト間の相互変換:1:jsオブジェクトからjson文字列オブジェクト.方法:JSON.stringify(obj)は、json文字列オブジェクトを返します.2:json文字列オブジェクトからjsオブジェクトへのアプローチ:JSON.parse(文字列)は、jsオブジェクトを返します.
<script>
    var obj = {
      
        name:"  ",
        age:17,
        money:null,
        girlfriend:undefined,
        handsome:true,
        books:["  ","  "],
        brother:{
      
            name:"  ",
            age:20
        },
        study:function () {
      
            console.log ("I love study");
        }
    };
    // {"name":"  ","age":17,"money":null,"handsome":true,"books":["  ","  "],"brother":{"name":"  ","age":20}}
    console.log (JSON.stringify(obj));

    var str = '{"name":"  ","age":17,"money":null,"handsome":true,"books":["  ","  "],"brother":{"name":"  ","age":20}}';

    console.log (JSON.parse(str));
    console.log (JSON.parse(str).name);//  。
script>

四、対象紹介
1:プロセスプログラミング向け:問題を解決する考え方:問題をいくつかの機能モジュールに分解する.これらの機能モジュールを一定の順序で実行します.線形的な問題解決の思考モデルです.c言語は典型的なプロセス向けのプログラミング言語である.プロセス思考向けの問題:1:ソフトウェア規模の拡大に伴い、線形の思考を用いて問題を解決する論理が複雑すぎて、実現が困難である.2:後期のコードのメンテナンスのコストが高く、コードの独立性、多重性が悪い.2:オブジェクト向けプログラミング:問題を解決する思考のモード:問題ドメインにどれだけのオブジェクトが存在するかを分析する.これらのオブジェクトに必要な機能と属性を持たせ、オブジェクト間の相互作用によって最終的なニーズを実現します.プロセスの後に現れる考え方で、典型的な言語:java、c#純粋なオブジェクト向けのプログラミング言語です.c++はプロセス向けにオブジェクト向けの特性を追加したものである.オブジェクト向けの3つのプロパティ:カプセル化、継承、マルチステート.オブジェクト向けの言語にはタイプの概念があります.オブジェクト向けのメリット:1:複雑な問題に対して、解決が比較的容易です.2:コードの多重化がより良い.質問:小さな問題では、オブジェクト向けを使用すると複雑になります.オブジェクト向けには通常、プロシージャ向けが含まれます.作成したオブジェクトに自分の機能を一歩一歩実行させます.3:例:車でラサへ行きます.プロセスに向かう:ドアを開けて、出発、保定、石家荘、太原、西安、蘭州、...ラサ、ブダラ宮を開始します.対象に向かう:運転手を探して(車を運転して)、車を探して(走って)、ナビゲーションがあります(リード方向).例:農夫と蛇.プロセスに向かう:農夫は凍えた蛇を発見し、懐に抱いた.蛇が目を覚まし、蛇が一口噛んだ.農夫は死んだ.オブジェクトに向かう:2つのオブジェクト、農夫+蛇.農夫:蛇を救い、死を遂げる.蛇:目を覚まし、人を噛む.4:javascript言語はオブジェクトに基づく言語であり、パッケージがあり、継承があり、多態がない.javaの継承とjsの継承の違い:javaの継承:テンプレートベースの継承.長城自動車は、スポーツカーを製造し、テンプレートに基づいて継承する方式:既存の生産車の流水線に基づいてスポーツカーを生産する流水線に改造する.流水ラインがあれば、無数のスポーツカーを作ることができます.従来の流水線が初期のテンプレートです.このテンプレートを継承して応答の改造を行った.jsの継承は、プロトタイプオブジェクトの継承に基づいています.万里の長城の自動車は、スポーツカーを作らなければならない.原型オブジェクトの継承方式に基づく:既存の車をテンプレートとしてスポーツカーの改造を行う.既存の車が原型オブジェクトです.5:jsのオブジェクト:本質的にオブジェクトはキー値ペアの無秩序な集合である.6:オブジェクトの作成方法:1:字面量は直接値を割り当てます.2:関数を構築する方法.7:以前はオブジェクトの作成方法があまり満足していませんでしたが、両方に問題がありました.次に他の方法を見ます.
<script>
    /* function step1() {
         console.log ("           ,    ");
     }
     function step2() {
         console.log ("   ,      ");
     }
     function step3() {
         console.log ("    ");
     }
     step1();
     step2();
     step3();*/

    //   
    var farmer = {
      
        name: "     ",
        save: function (snake) {
      
            console.log (this.name + "    " + snake.name + "     ");
            snake.wakeup ();
            //         
            snake.attack (this);
        },
        die: function () {
      
            console.log (this.name + "  ");
        }
    }

    var snake = {
      
        name: "  ",
        wakeup: function () {
      
            console.log (this.name + "   ");
        },
        attack: function (farmer) {
      
            console.log (`${
        this.name}   ${
        farmer.name}`);
            farmer.die ();
        }
    }

    farmer.save (snake);

    //      
    var obj = new Object ();
    obj.name = "123";

script>

五、コンストラクション関数によるオブジェクトの作成
1:以前に関連したコンストラクション関数ですが、異なるタイプのオブジェクトを作成するコンストラクション関数はどれらがありますか?Array、Function、Object、Number、String、Boolean、RegExp、Date上記のオブジェクトはコンストラクション関数オブジェクトであり、コンストラクション関数オブジェクトが作成したオブジェクトのタイプでもあります.これらのタイプはいくつかの基礎的なタイプにすぎません.需要を満たすことができない.2:コンストラクション関数を使用して異なるオブジェクトを作成する場合は、コンストラクション関数をカスタマイズする必要があります.カスタムコンストラクション関数の構文:functionコンストラクション関数名(){this.属性1=値1;this.属性2=値2;this.属性3=値3;...this.機能1=function(){};this.機能2=function(){};...}コンストラクション関数は、キーワードnewを使用して呼び出すオブジェクトを作成するために使用されます.3:上記のコンストラクション関数を使用して作成したオブジェクトのプロパティは同じです.オブジェクト間のプロパティの差異化の要件を満たすことはできません.パラメータによって差別化を実現できます.カスタムコンストラクション関数の構文:functionコンストラクション関数名(参照1,参照2,参照3){this.属性1=参照1;this.属性2=参照2;this.属性3=参照3;...this.機能1=function(){};this.機能2=function(){};...}4:コンストラクション関数は本質的にテンプレートを定義し、テンプレートにはそのコンストラクション関数名のタイプのオブジェクトにどのような属性と機能があるかを規定しています.このコンストラクション関数テンプレートを使用すると、各オブジェクトのプロパティと機能に独自のメモリがある任意のオブジェクトを作成できます.5:コンストラクション関数の定義:a:コンストラクション関数の名前の先頭文字を大文字にし、アルパカの名前の仕様に従います.b:コンストラクション関数の名前は、関数の名前であり、作成するオブジェクトのタイプを表します.c:コンストラクション関数の属性は通常の変数であり、変数の命名規則に従う.d:コンストラクション関数作成オブジェクトはnewキーワード呼び出しを使用します.e:コンストラクション関数のthis:現在のオブジェクト.このコンストラクション関数で作成したばかりのオブジェクト.
<script>
    //          ,        。
    function Student() {
      
        this.name = "  ";
        this.age = 16;
        this.score = 90;
        this.study = function () {
      
            console.log (this.name + "    ");
        };
        this.eat = function () {
      
            console.log (this.name + "    ");
        }
    }
    //          
    // var student = new Student();
    // //           
    // console.log (student.name);
    // student.study();
    // student.eat();
    // console.log (student);
    // console.log (new Student());

    //      ,           
    function Student(name,age,score) {
      
        // this       。
        this.name = name;
        this.age = age;
        this.score = score;
        this.study = function () {
      
            console.log (this.name + "    ");
        };
        this.eat = function () {
      
            console.log (this.name + "    ");
        }
    }

    //  10          。      
    var students = [];
    const COUNT = 10;
    var names = ["  ","  ","  ","  ","  ","  ","  ","  ","  ","  "];
    for (let i = 0; i < COUNT; i++) {
      
        students.push(new Student(names[i],10+i,80+i));
    }
    console.log (students);
    students[7].study();
    students[7]["name"] = "  ";
    console.log (students[7].name);
script>

六、構造関数の練習
コンストラクション関数の練習:1:長方形オブジェクトを作成するコンストラクション関数を定義します.プロパティ:幅、高さ.方法:周長、面積.長方形のオブジェクトを作成し、周長と面積を求めます.2:コンストラクション関数を使用して、以前の練習の農夫と蛇を作成します.農夫と蛇の2つのオブジェクトを作成し、物語の過程を展示します.
<script>
    //1                 。
    var Rectangle = function (width,height) {
      
        this.width = width;
        this.height = height;
        this.perimeter = function () {
      
            return this.width + this.height << 1;
        };
        this.area = function () {
      
            return this.width * this.height;
        }
    }

    //      
    var rect = new Rectangle(6,8);
    console.log (rect.perimeter());//28
    console.log (rect.area());//48

    //2
    function Farmer(name) {
      
        this.name = name;
        this.save = function (snake) {
      
            console.log (`${
        this.name}        ${
        snake.name}`);
            snake.love(this);
        };
        this.marry = function (snake) {
      
            console.log (`${
        this.name}       ${
        snake.name}`);
        };
    }
    function Snake(name) {
      
        this.name = name;
        this.hurt = function () {
      
            console.log (`${
        this.name}   !`);
        };
        this.love = function (farmer) {
      
            console.log (`${
        this.name}      ${
        farmer.name}`);
        }
    }
    function Story(farmer,snake) {
      
        this.farmer = farmer;
        this.snake = snake;
        this.start = function () {
      
            this.snake.hurt();
            this.farmer.save(this.snake);
            this.farmer.marry(this.snake);
        }
    }

    new Story(new Farmer("  "),new Snake("   ")).start();
script>

七、構造関数と普通の関数の違い
コンストラクション関数と一般関数の違い:1:文法の違いa:コンストラクション関数の最初の文字は大文字でなければなりません.アルパカの命名の規範に従う.b:一般関数の週文字小文字.アルパカの命名の規範に従う.2:意味の違い:a:コンストラクション関数を定義するのは、コンストラクション関数名に対応するタイプのオブジェクトを作成するためです.b:一般関数の定義は、ある機能を実現するためである.機能は、オブジェクトを作成することもできます.3:使用の違い:a:コンストラクション関数の使用、オブジェクトの作成にnewキーワード呼び出しを使用する必要がある場合.作成して初期化したオブジェクトを返します.newキーワードで呼び出さなくてもいいです.直接使用します.普通の関数として使いました.通常の関数として呼び出すとオブジェクトを作成できません.undefinedを返します.b:一般関数の使用.ダイレクトコール.newキーワード呼び出しでオブジェクトを作成することもできます.ただし、通常の関数でオブジェクトを作成することは推奨されません.4:関数のthisの違い:a:関数のthisを構築します.newを使用してコンストラクション関数を呼び出します.これは作成したばかりのオブジェクトです.コンストラクション関数を直接呼び出します.これがwindowオブジェクトです.b:一般関数のthis.通常はwindowオブジェクトです.
<script>
    var Rectangle = function (width,height) {
      
        this.width = width;
        this.height = height;
        this.perimeter = function () {
      
            return this.width + this.height << 1;
        };
        this.area = function () {
      
            return this.width * this.height;
        }
    }

    // Rectangle {width: 10, height: 20, perimeter: ƒ, area: ƒ}
    console.log (new Rectangle(10,20));//  
    console.log (Rectangle(20,30));//undefined
script>