JS能力測評經(jīng)典題2

不考慮算法復(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í)行特定代碼)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容