《JavaScript程序設計》課堂交流區問題彙總(基礎篇)

本課程爲網易雲課堂 - - 前端開發工程師 - - 《JavaScript程序設計》學習總結

問題一:獲取隨機整數

  獲取一個大於等於0且小於等於9的隨機整數?

解答:

// 方法一:Math.random() -- 返回0和1之間的僞隨機數 可能爲0,但總是小於1,即取值範圍爲[0,1)。
   Math.floor(Math.random()*10);
 // 方法二 : 先取0-1的隨機數,然後乘以10,獲得0-10的隨機數,然後向上取整,然後減1,或者乘以9,獲得0-9的隨機數,然後向上取整
 var number=(Math.ceil(Math.random()*10))-1;
 var number=Math.ceil(Math.random()*9);
// 方法三:先取0-1的隨機數,然後乘以10,獲得0-10的隨機數,然後保留0位小數點,獲得整數
 var number=(Math.random()*10).toFixed(0);
//方法四:先取0-1的隨機數,然後乘以9.5,獲得0-9.5的隨機數,然後四捨五入,獲得整數
 var number=Math.round(Math.random()*9.5);
//方法五:先取0-1的隨機數,然後乘以10,獲得0-10的隨機數,然後使用parseInt進行數值轉換
 var number=parseInt(Math.random()*10);

問題二:字符刪除

  想要去除一個字符串的第一個字符,有哪些方法可以實現?

解答:

    "hellomiaomiao".replace("hellomiaomiao".charAt(0),"");
    "ellomiaomiao"//運行結果
    "hellomiaomiao".slice(1);
    "ellomiaomiao"//運行結果
    "hellomiaomiao".substr(1);
    "ellomiaomiao"//運行結果
    "hellomiaomiao".substring(1);
    "ellomiaomiao"//運行結果

問題三:數組求和

  對一個數組(每項都是數值)求和,有哪些方法?

解答:

  首先設定一個作爲數據源的數組

    var arr = [1, 2, 3, 4, 5, 6,7,8,9,10];
  • every()方法:
    (function() {
        var sum = 0;
        function getSum(item, index, array) {
            sum += item;
            console.log(sum);
            return true;//由於every方法是會在遇到回調函數返回的第一個false時停止遍歷所以需要始終返回true
        };
        arr.every(getSum);
        console.log("use every:sum = " + sum);})();
  • some()方法:
   (function() {
        var sum = 0;
        function getSum(item, index, array) {
            sum += item;
            console.log(sum);
        };
        arr.some(getSum);
        console.log("use some:sum = " + sum);})();
  • array.filter()方法:
  (function() {
        var sum = 0;
        function getSum(item, index, array) {
            sum += item;
            console.log(sum);
        };
        arr.filter(getSum);
        console.log("use filter:sum = " + sum);})();
  • array.map()方法:
 (function() {
        var sum = 0;
        function getSum(item, index, array) {
            sum += item;
            console.log(sum);
        };
        arr.map(getSum);
        console.log("use map:sum = " + sum);})();
  • array.froEach()方法:
 (function() {
        var sum = 0;
        function getSum(item, index, array) {
            sum += item;
            console.log(sum);
        };
        arr.forEach(getSum);
        console.log("use forEach:sum = " + sum);})();
  • array.reduce()正向歸併方法:
 arr.reduce(function(prevResult, item, index, array) {
        return prevResult += item;
    });
  • array.reduceRight()逆向歸併方法:
  arr.reduceRight(function(prevResult, item, index, array) {
        return prevResult += item;
    });
  • for循環方法
 (function() {
        for (var i = 0, sum = 0; i < arr.length; i++) {
            sum += arr[i];
            console.log(sum);
        }
        console.log("use for:sum = " + sum);})();
  • while循環方法
  (function(){
        var i = 0, sum = 0;
        while(i<arr.length){
            sum+=arr[i];
            console.log(sum);
            i++;
        }
        console.log("use while:sum = " + sum);})();
  • for -in方法
 (function() {
        var sum = 0;
        for (var index in arr) {
            sum += arr[index];
            console.log(sum);
        }
        console.log("use for-in:sum = " + sum);})();
  • forEach()方法
 var calc = {    sum: 0};
    function getSum(item, index, array) {
        this.sum += item;
        console.log(this.sum);
    }
    arr.forEach(getSum,calc);
    console.log('use forEach and change this:sum=' + calc.sum);
  • join()方法
 eval(arr.join("+"));
    /*這裏先將所有數組項通過字符串"+"連爲一個字符串"1+2+3+4+5+6",然後返回的這個字符串傳給eval()方法,eval()方法接收了這段字符串後,就直接將這段字符串中的代碼放在當前作用域下執行了。*/

重點相關文章推薦:《數組求和方法比較 》

問題四:量詞

  正則表達式中,量詞的貪婪模式與惰性模式有什麼區別?

解答:

  貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行爲,貪婪模式在整個表達式匹配成功的前提下,儘可能多的匹配,而非貪婪模式在整個表達式匹配成功的前提下,儘可能少的匹配。非貪婪模式只被部分NFA引擎所支持。

  貪婪量詞:先看整個字符串是否匹配,如果不匹配就把最後一個字符去掉在進行匹配,不匹配繼續去掉最後一個字符,指導找到一個匹配或者不剩任何字符才停止。

  惰性量詞:先看第一個字符串是否匹配,如果第一個不匹配就在加入第二個字符串依此類推,指導找到一個匹配或者不剩任何字符才停止,貪婪量詞與貪婪量詞的方法正好相反.

  瀏覽器對量詞的支持還不完善,IE和OPERA都不支持量詞,MOZILLA把支配量詞看作是貪婪的。

  參考文章:

問題五:JSON.stringify兼容

  JSON.stringify函數在ie6/7中不支持,如何兼容?

解答:

  • jQuery插件支持的轉換方式:
    $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以將json字符串轉換成json對象
  • Javascript支持的轉換方式:
    eval('(' + jsonstr + ')'); //可以將json字符串轉換成json對象,注意需要在json字符外包裹一對小括號

  **注:**ie8(兼容模式),ie7和ie6可以使用eval()將字符串轉爲JSON對象,但不推薦這些方式,這種方式不安全eval會執行json串中的表達式。

  • JSON官方的轉換方式:

  http://www.json.org/提供了一個json.js,這樣ie8(兼容模式),ie7和ie6就可以支持JSON對象以及其stringify()和parse()方法;
可以在https://github.com/douglascrockford/JSON-js上獲取到這個js,一般現在用json2.js。

    <!--[if lt IE 9]>
        <script src="json2.js"></script>
    <![endif]-->

  這樣JSON.stringify 便可以正常使用!

  • 判斷類型加算法實現:
    function forIn(obj, handler) {
        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                handler(i, obj[i]);
            }
        }
    }
    function each(arr, handler) {
        for (var i = 0, len = arr.length; i < len; i += 1) {
            handler(i, arr[i]);
        }
    }
    if (!JSON) {
        JSON = {};
    }
    if (!JSON.parse) {
        JSON.parse = function(json) {
            return eval('1,' + json)
        };
    }
    if (!JSON.stringify) {
        (function(JSON) {
            var arr = '[object Array]',
                obj = '[object Object]';
            JSON.stringify = function(json) {
                var t = '';
                var m = Object.prototype.toString.call(json);
                if (m == arr) {
                    t = ArrPartten(json);
                } else if (m == obj) {
                    t = ObjectJson(json);
                } else {
                    t = json;
                }
                return t;
            }
            function ObjectParse() {
                var t = '{';
                forIn(json, function(i, ele) {
                    var m = Object.prototype.toString.call(ele);
                    if (m == arr) {
                        t += i + ':' + ArrPartten(ele) + ',';
                    } else if (m == obj) {
                        t += i + ':' + ObjectJson(ele) + ',';
                    } else {
                        t += i + ':' + ele + ',';
                    }
                });
                if (t.length != 1) {
                    t = t.substring(0, t.length - 1);
                }
                return t + '}';
            }
            function ArrayParse() {
                var t = '[';
                each(json, function(i, ele) {
                    var m = Object.prototype.toString.call(ele);
                    if (m == arr) {
                        t += ArrPartten(ele) + ',';
                    } else if (m == obj) {
                        t += ObjectJson(ele) + ',';
                    } else {
                        t += ele + ',';
                    }
                });
                if (json.length > 0) {
                    t = t.substring(0, t.length - 1);
                }
                return t + ']';
            }
        }(JSON));
    }
  • 判斷類型加算法實現(版本二)
    if(!window.JSON){
        window.JSON = {
            parse: function(sJson){
                return eval("(" + sJSON + ")");
            },
            stringify: function(obj){
                var result = "";
                for(var key in obj){
                    if(typeof obj[key] == "string"){
                        // 如果屬性值是String類型,屬性值需要加上雙引號
                        result += "\"" + key + "\":\"" + obj[key] + "\",";
                    }else if(obj[key] instanceof RegExp){
                        // 如果屬性是正則表達式,屬性值只保留一對空大括號{}
                        result += "\"" + key + "\":{},";
                    }else if(typeof obj[key] == "undefined" || obj[key] instanceof Function){
                        // 如果屬性值是undefined, 該屬性被忽略。忽略方法。
                    }else if(obj[key] instanceof Array){
                        // 如果屬性值是數組
                        result += "\"" + key + "\":[";
                        var arr = obj[key];
                        for(var item in arr){
                            if(typeof arr[item] == "string"){
                                // 如果數組項是String類型,需要加上雙引號
                                result += "\"" + arr[item] + "\",";
                            }else if(arr[item] instanceof RegExp){
                                // 如果屬數組項是正則表達式,只保留一對空大括號{}
                                result += "{},";
                            }else if(typeof arr[item] == "undefined" || arr[item] instanceof Function){
                                // 如果數組項是undefined, 則顯示null。如果是函數,則顯示null?。
                                result += null +",";
                            }else if(arr[item] instanceof Object){
                                //如果數組項是對象(非正則,非函數,非null),調用本函數處理
                                result += this.stringify(arr[item]) +",";
                            }else{
                                result += arr[item] + ",";
                            }
                        }
                        result = result.slice(0,-1)+"],"

                    }else if(obj[key] instanceof Object){
                        // 如果屬性值是對象(非null,非函數,非正則),調用本函數處理
                        result += "\"" + key + "\":" + this.stringify(obj[key]) + ",";
                    }else{
                        result += "\"" + key + "\":" + obj[key] + ",";
                    }
                }
                // 去除最後一個逗號,兩邊加{}
                return "{" + result.slice(0,-1) + "}";
            }
        };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章