一些值得问问题的js代码小片段

  • 你会用typeof f*ck = ‘object’来判断是否是对象吗?你有何高见?显然如果f*ck是个数组的话,typeof也会返回true,应该用的是
object.prototype.tostring.call(f*ck) === 'object Object'; //return true
object.prototype.tostring.call(f*ck) === 'object Array'; //return false

  • 请你解释一下以下两个函数返回值的区别;
function foo1()
{
  return {
      bar: "hello"
  };
}

function foo2()
{
  return
  {
      bar: "hello"
  };
}

重点;JS 解析器会根据能否正常编译来决定是否自动填充分号: 第二个函数的return让js解析器认为可以结束了就自动填充了分号:
所以反回了undefined

function foo2()
{
  return;
  {
      bar: "hello"
  };
}

  • 你来说说下面程序的执行顺序?
(function() {
    console.log(1); 
    setTimeout(function(){console.log(2)}, 1000); 
    setTimeout(function(){console.log(3)}, 0); 
    console.log(4);
})();

settimeout()是会在执行队列后面的,所以一定是先执行完iife,再计时,也就是: 1 4 3 2


  • 如何实现以下的输出?
console.log(sum(2,3)  // 5
console.log(sum(2)(3))  //5

function sum (){
    var first = arguments[0];
    if(arguments.length === 2){
        return arguments[0]+arguments[1];
    }else{
     return function(secound){
        return first + secound;
        }
    }
};

  • 如何实现以下的输出?
var arr1 = "john".split(''); j o h n
var arr2 = arr1.reverse(); n h o j
var arr3 = "jones".split(''); j o n e s
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));

重点:数组的 reverse()是返回数组本身的,这里的arr1 ==== arr2 ;
输出:

array 1: length=5 last=j,o,n,e,s
array 2: length=5 last=j,o,n,e,s

  • 以下输出什么?
console.log(2 + 1 + '3'); / /‘33’
console.log('3' + 2 + 1); //'321'
console.log(+'1' +  '1' + '2'); //112 //

数字字符串之前存在数字中的正负号(+/-)时,会被转换成数字
你可以理解为:+’1’运算符与字符串靠近就相当于+1 === 1;

console.log( "A" - "B" + "2");
console.log( "A" - "B" + 2);

你可以理解为:’a’ - ‘a’ = NAN,但NAN+”就变成了 NAN2
typeof(NAN)其实是’number’,且NAN !== NAN;所以NAN+2应该还是NAN;


  • 小面的list很大,怎么才能防止溢出?
var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        nextListItem();
    }
};

改进:加一个计数器,因为计数器是放在执行队列后面的,只要是运行完了这个nextListItem,才会执行计数器的回调函数,所以肯定不
会溢出:运行完了就会出栈,再进来一个回调函数,理论上,是永远只有一层,不怕他多大嘿嘿嘿~

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

  • 以下代码输出的是什么?
console.log("0 || 1 = "+(0 || 1));
console.log("1 || 2 = "+(1 || 2));
console.log("0 && 1 = "+(0 && 1));
console.log("1 && 2 = "+(1 && 2));

1/1/0/2
逻辑与返回第一个是 false 的操作数 或者 最后一个是 true的操作数
逻辑或返回第一个是 true 的操作数 或者 最后一个是 false的操作数


  • 代码输出的是什么?
var a={},
    b={key:'b'},
    c={key:'c'};

a[b]=123;
a[c]=456;

console.log(a[b]);

答案是:456
其原因如下:当设置对象属性时,JavaScript将隐式地字符串化参数值。在这种情况下,由于b和c都是对象,因此它
们都将转换为“[object Object]”。因此,a [b]和a [c]都等价于[“[object Object]”],并且可以互换使用。因此,设置或参
考a [c]与设置或参考a [b]完全相同。


  • 以下代码输出什么?
var hero = {
    _name: 'John Doe',
    getSecretIdentity: function (){
        return this._name;
    }
};

var stoleSecretIdentity = hero.getSecretIdentity;

console.log(stoleSecretIdentity());          // undefined
console.log(hero.getSecretIdentity());       // John Doe

stoleSecretIdentity 的上下文是全局环境,所以第一个输出 undefined。若要输出 John Doe,则要通过 call 、apply 和 bind 等方式改变
stoleSecretIdentity 的this 指向(hero)。
第二个是调用对象的方法,输出 John Doe。


  • 给你一个 DOM 元素,创建一个能访问该元素所有子元素的函数,并且要将每个子元素传递给指定的回调函数。函数接受两个参数:DOM,指定的回调函数
    原文利用 深度优先搜索(Depth-First-Search) 给了一个实现:
function Traverse(p_element,p_callback) {
   p_callback(p_element);
   var list = p_element.children;
   for (var i = 0; i < list.length; i++) {
       Traverse(list[i],p_callback);  // recursive call
   }
}
  • 如何做到二维数组降维为一维数组
function reduceDimension(arr) {
    return Array.prototype.concat.apply([], arr);
} // 利用apply的第二个参数可以传一个数组,同时会依次调用concat的办法:

Array.prototype.concat.apply([], [[99, 98], [97, 96], [95]]) // [99, 98, 97, 96, 95]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值