不考虑算法复杂度,用递归做:
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 参数 : slice(start,end);
slice 方法,在string对象和array对象 的用法上类似。
对于数组对象来说,slice 方法提取 从 start下标起 以end下标 为结尾的 一段元素(但不包括end下标的元素),然后返回新的数组,对原数组没有任何是影响,
当start 为0 时, 等于说是 克隆一个新的数组,克隆后 两个数组进行各自的操作,都互不影响
var clone = array.slice(0);
var clone= array.concat();
常规循环:
function sum(arr) {
var s = 0;
for (var i=arr.length-1; i>=0; i--) {
s += arr[i];
}
return s;
}
函数式编程 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 全局对象的一个函数属性,`eval(string)`函数可计算某个字符串,并执行其中的的 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()的参数不是字符串,eval()将会将参数原封不动的返回。
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")); // 直接调用,使用本地作用域,结果是 6
var geval = eval;
console.log(geval("x + y")); // 间接调用,使用全局作用域,throws ReferenceError 因为x
未定义
}
###eval解析JSON###
var dataObj=eval("("+data+")");//转换为json对象
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
比如JSON.parse(JSON对象解析),比如new Function()(执行特定代码)