與函數有關面試題(二)

1.實現add(3,2)與add(3)(2)返回結果都爲5.
代碼如下:

function add(x,y){
    var sum = x;
    if(y){
        return (sum + y);
    }
    else
    {
        var add2 = function(z){
            return (sum + z);
        }
        return add2;
    }
}
var add1 = add(2,3);
console.log(add1);
var add2 = add(2)(3);
console.log(add2);

2.var foo = “Hello”;
(function() { var bar = ” World”; alert(foo + bar); })(); alert(foo + bar);
運行結果:
"Hello World" & ReferenceError: bar is not defined
3.

var foo = [];
foo.push(1);
foo.push(2);

問題:foo.length的值是什麼? 答案:2
4.

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

問題:foo.x的值是什麼?答案是undefined
5.
console.log('one');
setTimeout(function() {
console.log('two');
}, 0);
console.log('three');

問題:返回結果分別是什麼?答案是one,three,two
答案解析:setTimeout最後執行。
6.

var a=[];
for(var i=0; i<10; i++){
   a[i]=function(){
       console.log(i);
   }
}
a[6](); //10

上面代碼中,變量i是var聲明的,在全局範圍內都有效,每一次循環新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i的值,當i爲10的時候不在進行循環,所以結果爲10。

正確的寫法1var a=[];
for(let i=0;i<10;i++){
   a[i]=function(){
       console.log(i);
   }
}
a[6]();  //6

方法二:利用閉包

var a=[];
for (var i = 0; i < 10; i++ ) {
    a[i] = (function(index){
        return function(){
            console.log("ret: " + index);
        }
    })(i);
}
a[6]();

7.數組快速去重拼接:如[1,2,3]和[2,4,5]很快的拼接成[1,2,3,4,5],利用ES6新特性Set

var result = [1,2,3,4]
result = result.concat([2,3,4,5]);
var set = new Set(result);
var array = Array.from(set);

8.[1,2,3,4,5].duplicate(); 變成[1,2,3,4,5,1,2,3,4,5]的方法。

// 方法1
Array.prototype.duplicate = function() {
    var i = 0, 
        arr = [];
        for (i = 0;i < this.length; i++) {
            arr.push(this[i]);
        };
        for (i = 0;i < this.length; i++) {
            arr.push(this[i]);
        };
        return arr;
}
// 方法2
Array.prototype.duplicate = function() {
    var i = 0, 
        arr = this.join("");
        arr += arr;
        return arr.split("").map(function(v){
            return +v;
        });
}

// 方法3
Array.prototype.duplicate = function() {
    return this.concat(this);
}

9.遞歸算法,取出多維數組中的值,組成新數組。
代碼如下:

function steamrollArray(arr) {
  var flattenedArray = [];

  // Create function that adds an element if it is not an array.
  // If it is an array, then loops through it and uses recursion on that array.
  var flatten = function(arg) {
    if (!Array.isArray(arg)) {
      flattenedArray.push(arg);
    } else {
      for (var a in arg) {
        flatten(arg[a]);
      }
    }
  };

  // Call the function for each element in the array
  arr.forEach(flatten);
  return flattenedArray;
}

// test here
steamrollArray([1, [2], [3, [[4]]]]);

10.二進制轉爲Unicode碼
代碼如下:

function binaryAgent(str) {
    str=str.split(" ");
    for(var i=0;i<str.length;i++){
        str[i]=parseInt(str[i],2);//2進制轉爲10進制
        str[i]=String.fromCharCode(str[i]);//找出10進制數字對應的Unicode碼
    }
    return console.log(str.join(""));
}
binaryAgent("01000001 01110010 01101110 00100001 00111111");

11.小技巧判斷瀏覽器類型
代碼如下:

var agt=navigator.userAgent.toLowerCase();
var browserType;
var browserVer;

if (agt.indexOf("opera") != -1)
    {
    browserType = "Opera";

    if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1)
        {  browserVer = "Opera7";  }
    else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1)
        {  browserVer = "Opera8";  }
    else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1)
        {  browserVer = "Opera9";  }
    }

else if (agt.indexOf("applewebkit") != -1)
    {
    browserType = "Safari";

    if (agt.indexOf("version/3") != -1)
        {  browserVer = "Safari3";  }
    else if (agt.indexOf("safari/4") != -1)
        {  browserVer = "Safari2";  }
    }

else if (agt.indexOf("khtml") != -1)
    {
    browserType = "Konqueror";
    }

else if (agt.indexOf("msie") != -1)
    {
    browserType = "IE";

    if (agt.indexOf("msie 6") != -1)
        {  browserVer = "IE6";  }
    else if (agt.indexOf("msie 7") != -1)
        {  browserVer = "IE7";  }
    }

else if (agt.indexOf("gecko") != -1)
    {
    browserType = "Firefox";

    if (agt.indexOf("rv:1.7") != -1)
        {  browserVer = "Firefox1";  }
    else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1)
        {  browserVer = "Firefox15";  }
    else if (agt.indexOf("rv:1.8.1") != -1)
        {  browserVer = "Firefox2";  }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章