美文网首页
JS能力测评经典题2

JS能力测评经典题2

作者: 这很重要吗 | 来源:发表于2017-05-15 20:21 被阅读0次

    不考虑算法复杂度,用递归做:

    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()(执行特定代码)

    相关文章

      网友评论

          本文标题:JS能力测评经典题2

          本文链接:https://www.haomeiwen.com/subject/atjhxxtx.html