前端笔试题小结(一)

前端笔试题小结(一)

2020-03-13
题目一:
将一个js数组去重。
样例:
输入:[ 1, “apple”, 3, “a”, 3, 1, 5, 6, “a”, 4 ]
输出:[ 1, “apple”, 3, “a”, 5, 6, 4 ]

分析1:
将两个数组循环嵌套一个个的比较是否相等,如果此元素没有雷同,则把它放入新的数组中。

function test(arr){let arr2 = [arr[0]];
            for (let i = 1; i < arr.length; i++) {
                let repeat = false;
                for (let j = 0; j < arr2.length; j++) {
                    if (arr[i] == arr2[j]) {
                        repeat = true;
                        break;//跳出for的嵌套循环
                    }else{
                        
                    }
                }
                if (!repeat) {
                    arr2.push(arr[i]);
                }
            }
            return arr2;
        }

        console.log(test([1, "apple", 3, "a", 3, 1, 5, 6, "a", 4]));
        //结果为[1, "apple", 3, "a", 5, 6, 4]

分析2:
将一个数组中的元素进行排序,然后对前后元素进行比较,结果放入新的数组中。

function test2(arr){
			var formArr=arr.sort();
			var arr2=[formArr[0]];
            for (let i = 1; i < formArr.length; i++) {                
                    if (formArr[i]!= formArr[i-1]) {
                        arr2.push(formArr[i]);                  
                }
            }
            return arr2;
        }
        console.log(test2([1, "apple", 3, "a", 3, 1, 5, 6, "a", 4]));
        //结果为[1, 3, 4, 5, 6, "a", "apple"]

其中,let主要定义块级变量,只在定义的区域内有效。var定义全局变量或函数变量。

js的三等于号和双等于号区别:双等于号属于一般比较,可以自动转化数据类型,三等于号表示恒等于,比较的两边要绝对的相同先判断类型,如果不是同一类型直接为false。


更新:

2020-03-14
题目二:
问:
1.变量i,s,a在堆还是在栈中?
2.第8行执行完后a.i的值是什么?

class A {
    String i = "op";
    void func(String s) {
        s = ""+9;
    }
    static void test() {
        A a = new A();
       a.func(a.i);
    }
}

答案:
(1) i,s,a在栈中,new出来的对象A在堆上。
(2) 执行完后a.i的值还是字符串op。
解析:
1、考察js堆与栈:栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null以及对象变量的指针,堆主要存储object
所以字符串变量i,s以及对象指针a都存在栈中,new出来的对象开辟内存存在堆上,对应地址是指针a存的内容
2、考察参数传递按值传递:a是A类的实例,所以a.i=‘op’,a.func(a.i)这句执行函数,把a.i作为参数传递,该函数会复制一个变量,两个变量完全独立,所以在函数体里只是把复制的那个变量(一个新的局部变量)改变为’op9’,在函数体外的a.i并没有被改变

题目三:
请按顺序写出打印结果,并说明原因。

var name = 'global';
var obj = {
    name: 'local',
    foo: function(){
        this.name = 'foo';
    }.bind(window)
};
var bar = new obj.foo();
setTimeout(function() {
    console.log(window.name);
}, 0);
console.log(bar.name);
  
var bar3 = bar2 = bar;
bar2.name = 'foo2';
console.log(bar3.name);

答案:foo,foo2,global
解析:
‘foo’ //bind返回一个函数,该函数体中的this绑定到window上,然后new对该函数进行构造调用,返回一个新对象,函数体中的this指向该对象。bind是硬绑定,new绑定的优先级高于硬绑定。所以this还是绑定在bar这个新对象上。this.name='foo’就是bar.name=‘foo’
‘foo2’ //复杂类型值地复制是引用复制,bar3、bar2和bar指向的都是同一个对象,所以bar2.name='foo2’对对象的属性进行修改时,bar3和bar的数据同样收影响
‘global’ //setTimeout设置一个定时器,定时器到时后调用回调函数,但定时器到时后只能将回调的执行放到事件队列的末尾,不能插队,所以console.log(window.name)这条输出语句是最后执行的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值