js 面试题

1:toString

   function A() {
        this.name = "a";
        this.toString = function () {
            return this.name
        }
    }

    function B() {
        this.name = "b";
    }

    var b1 = new B();
    console.log(b1.toString()); //[object Object]
    B.prototype = new A();
    var b2 = new B();
    console.log(b2.toString());  // b

这里非常巧妙的用到了toString()

对与普通的Number,Array,Boolean, 用toString是转化为字符串,但是object.prototype.toString中的toString是

返回当前方法执行执行的主体(方法中的this)所属类的详细信息即"[object Object]",其中第一个object代表当前实例是对象数据类型的(这个是固定死的),第二个Object代表的是this所属的类是Object。

看实例化这句:

var b1 = new B()

里面存在一个原型链:b1.__proto__ ==B.prototype.__proto__==Objec.prototype

所以最后b1.toString 实际上是 Objec.prototype.toString 

 

B.prototype = new A();
var b2 = new B();
console.log(b2.toString());  // b

2:call apply

 // call和apply(数组)
function AA() {
    this.name = "a";
    this.say = function () {
        console.log("my name is" +" "+ this.name)
    }
}
function BB() {
    this.name = "b";
}
var aa = new AA();
var bb = new BB();
    aa.say.apply(bb); // my name is bb

    // bb调用aa的方法

 

3:定时器  异步事件

// 每隔一秒弹框,五秒结束弹框
    var id = setInterval(function () {
        alert("123")
    }, 1000)
    setTimeout(function () {
        clearInterval(id)
    }, 5000)

 

4: 匿名函数,闭包,let解决作用域问题

首先创建一个input:document.createElement

设置自定义属性:setAttribute(类型) setAttribute(值)

将自定义属性创建的元素添加到页面 documrnt.body.appendChild()

难点是点击按钮,弹出数字。由于for循环(同步)和点击事件(异步),js的执行机制是,先执行执行栈里面的同步事件,再执行任务队列的异步代码,这个时候,q已经是,所以永远弹出的是,不可能是每个按钮对应的值。这个时候,用闭包就爽歪歪

使用闭包以后:就可以访问函数内部的变量 也就是点击函数形参,可以是for循环的实参

   //使用js代码 ,为页面动态添加5个按钮,button1,button2,button3...
    // 单击每个按钮,分别弹出1 2 3 4 5
    for (var q = 0; q < 5; q++) {
        var input = document.createElement("input");
        input.setAttribute("type", "button");
        input.setAttribute("value", "button" + q);
        (function (n) {
            input.onclick = function () {
                alert(n)
            }
        })(q)
        document.body.appendChild(input);

    }

另外一种简单的方法:

将var 变为let

for (let q = 0; q < 5; q++) {
        var input = document.createElement("input");
        input.setAttribute("type", "button");
        input.setAttribute("value", "button" + q);
            input.onclick = function () {
                alert(q)
            }
        document.body.appendChild(input);

    }

let是es6引入的,用他声明的变量代表块级作用域。变量只要在{},内部的函数都可以同步访问。你可能会好奇

js机制怎么被一个块级作用域给解决了?其实闭包又何尝不是,在整个函数体内,所以函数都可以同时访问变量,不存在同步异步。这里需要指出:

一个是同步任务和异步任务的优先顺序

一个是同步任务和异步任务的执行时间

5: 数组方法的使用 转为驼峰

  // 已经有一个字符串
    //foo = "get-element-by-id"; 转化为驼峰表示法 getElementById
    var foo = "get-element-by-id"
    var arr = foo.split("-");
    console.log(arr); //["get", "element", "by", "id"]
    // charAt(n) //返回字符串中的第几个字符串,从0开始
    for (var i = 1; i < arr.length; i++) { //注意这里的i从1开始,是因为转化为驼峰表达式,第一个单词字母开头小写
        // arr[i].charAt(0).toUpperCase() 返回大写字母  E  B  I
        // arr[i].slice(1) +(拼接) splice分割,除了第一个字母(大写)  lement  y, d
        arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
//现在的结果是:字符串数组:["get", "Element", "By", "Id"]
    }
    // 想要变为字符串,用join()
    var arr = arr.join("");//里面什么也不写 get,Element,By,Id.join("") 中间什么也没有,返回我们要的结果
    console.log(arr); //getElementById

6: 数组倒排,升序 降序

// 数组倒排
    var numberArray = [5, 1, 4, 2, 6, 3];
    var arr3 = [];
    // 将numberArray的长度作为下标放入数组,最大肯定是length-1,但是总的数量不变,所以i要=0
    for (var i = numberArray.length - 1; i >= 0; i--) {
        arr3.push(numberArray[i]);
    }
    console.log(arr3);
    // 数组降序
    var number = [5, 1, 4, 2, 6, 3];

    for (var m = 0; m < number.length - 1; m++) {
        for (var n = 0; n < number.length - 1 - m; n++) {
            if (number[n] > number[n + 1]) {
                var temp = number[n];
                number[n] = number[n + 1];
                number[n + 1] = temp;
            }
        }
    }
    console.log(number);//[1, 2, 3, 4, 5, 6]
    // 改变if里面的判断条件 ,就是降序
    // if(number[n]<number[n+1])

 

7:输出日期

 //输出今天的日期,以yyy-mm-dd的方式,比如2019年6月28日输出2019-06-28
    var d = new Date();
    console.log(d);
    var year = d.getFullYear();
    console.log(year)
    var month = d.getMonth() + 1;  //比较特殊  0-11
    month = month < 10 ? '0' + month : month;
    console.log(month);
    var day = d.getDate();
    day = day < 10 ? "0" + day : day;
    console.log(day);
    alert(year + '-' + month + '-' + day)

8:数组去重

  function f3(arr) {
        var a3 = []
        for (var i = 0; i < arr.length; i++) {
            if (a3.indexOf(arr[i]) == -1) { //a3的索引没有和arr[i] 一样的,放入a3
                a3.push(arr[i])
            }
        }
        return a3;
    }
    var arr = [1, 1, 1, 2, 2, 2, 3]
    console.log(f3(arr));

9:闭包

下面这个 ul,如何点击每一列的时候 alert index?(闭包)

var lis = document.getElementById("test").querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = function (i) {
        // console.log(i)
        return function () {
            console.log(i)
        }
    }(i);
}

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值