本課程爲網易雲課堂 - - 前端開發工程師 - - 《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) + "}";
}
};