不考慮算法復(fù)雜度,用遞歸做:
function sum(arr) {
var len = arr.length;
if(len == 0){
return 0;
} else if (len == 1){
return arr[0];
} else {
return arr[0] + sum(arr.slice(1));
}
}
slice 參數(shù) : slice(start,end);
slice 方法,在string對象和array對象 的用法上類似。
對于數(shù)組對象來說,slice 方法提取 從 start下標(biāo)起 以end下標(biāo) 為結(jié)尾的 一段元素(但不包括end下標(biāo)的元素),然后返回新的數(shù)組,對原數(shù)組沒有任何是影響,
當(dāng)start 為0 時, 等于說是 克隆一個新的數(shù)組,克隆后 兩個數(shù)組進(jìn)行各自的操作,都互不影響
var clone = array.slice(0);
var clone= array.concat();
常規(guī)循環(huán):
function sum(arr) {
var s = 0;
for (var i=arr.length-1; i>=0; i--) {
s += arr[i];
}
return s;
}
函數(shù)式編程 map-reduce:
function sum(arr) {
return arr.reduce(function(prev, curr, idx, arr){
return prev + curr;
});
}
//IE9
array1.reduce(callbackfn[, initialValue])
function callbackfn(previousValue, currentValue, currentIndex, array1)
*******
forEach遍歷:
function sum(arr) {
var s = 0;
arr.forEach(function(val, idx, arr) {
s += val;
}, 0);
return s;
};
******
eval:
function sum(arr) {
return eval(arr.join("+"));
};
JavaScript 全局對象的一個函數(shù)屬性,`eval(string)`函數(shù)可計算某個字符串,并執(zhí)行其中的的 JavaScript 代碼
<script type="text/javascript">
eval("x=10;y=20;document.write(x*y)")
document.write(eval("2+2"))
var x=10
document.write(eval(x+17))
</script>
輸出:
200
4
27
如果eval()的參數(shù)不是字符串,eval()將會將參數(shù)原封不動的返回。
eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串對象
eval("2 + 2"); // returns 4
從[ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.2)起它工作在全局作用域而不是局部作用域中;
function test() {
var x = 2, y = 4;
console.log(eval("x + y")); // 直接調(diào)用,使用本地作用域,結(jié)果是 6
var geval = eval;
console.log(geval("x + y")); // 間接調(diào)用,使用全局作用域,throws ReferenceError 因為x
未定義
}
###eval解析JSON###
var dataObj=eval("("+data+")");//轉(zhuǎn)換為json對象
為什么要 eval這里要添加 “("("+data+")");//”呢?
原因在于:eval本身的問題。 由于json是以”{}”的方式來開始以及結(jié)束的,在JS中,它會被當(dāng)成一個語句塊來處理,所以必須強(qiáng)制性的將它轉(zhuǎn)換成一種表達(dá)式。
加上圓括號的目的是迫使eval函數(shù)在處理JavaScript代碼的時候強(qiáng)制將括號內(nèi)的表達(dá)式(expression)轉(zhuǎn)化為對象,而不是作為語句(statement)來執(zhí)行。舉一個例子,例如對象字面量{},如若不加外層的括號,那么eval會將大括號識別為JavaScript代碼塊的開始和結(jié)束標(biāo)記,那么{}將會被認(rèn)為是執(zhí)行了一句空語句。所以下面兩個執(zhí)行結(jié)果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
比如JSON.parse(JSON對象解析),比如new Function()(執(zhí)行特定代碼)