• 一些被忽略掉的面试题


    
        //indexOf  没有出现返回-1
        //split 拆分字符串
        function queryURLParameter(url) {
            let obj = {};
            if (url.indexOf('?') < 0) return obj;
            let ary = url.split('?');
            url = ary[1];
            ary = url.split('&');
            for (let i = 0; i < ary.length; i++) {
                let cur = ary[i],
                    curAry = cur.split('=');
                obj[curAry[0]] = curAry[1];
            }
            return obj;
        }
    
        //charAt charCodeAt substr subString slice substr
        console.log(queryURLParameter('https://www.google.com/search?q=%E5%BC%A0%E4%B8%89'));
    
        //indexOf split charAt slice
        function queryURLParameter(url) {
            let reg = /([^&?=]+)=([^&?=]+)/g,
                obj = {};
            url.replace(reg, function () {
                obj[arguments[1]] = arguments[2];
            });
            return obj;
        }
    
        String.prototype.myQueryURLParmeter = function () {
            let reg = /([^&?+]+)=([^&?+]+)/g;
            let obj = {};
            this.replace(reg, (...arg) => {
                obj[arg[1]] = arg[2];
            });
            return obj;
        };
        url.myQueryURLParmeter();
    
        //2
        console.log(a); //undefined
        var a = 12;
    
        function fn() {
            console.log(a); //由于局部作用域a声明了,a=>undefined
            var a = 13;
        }
    
        fn();
        console.log(a); //12
    
        //3
        console.log(a); //undefined
        var a = 12;
    
        function fn() {
            console.log(a); //12
            a = 13;
        }
    
        fn();
        console.log(a); //13
    
        //4
        console.log(a); //程序报错后面不执行
        a = 12;
    
        function fn() {
            console.log(a);
            a = 13;
        }
    
        fn();
        console.log(a);
    
        //5
        var foo = 1;
    
        function bar() {
            if (!foo) {
                var foo = 10;
            }
            console.log(foo);
        }
    
        bar(); //10
    
        //6
        //全局下的变量提升 var n;var c; a=地址
        var n = 0;
    
        function a() {
            //私有作用域:var a;b=地址;
            var a = 10;
    
            function b() {
                n++;
                console.log(n);
            }
    
            b();
            return b; //地址
        }
    
        var c = a(); //11
        c();//12
        console.log(n);//0
    
        //7
        var a = 10, b = 11, c = 12;
        function test(a) {
            //私有作用域: a=10  var b
            a=1; //私有 A=1
            var b=2;  //私有b=2
            c=3; //全局c=3
        }
        test(10);
        console.log(a, b, c);//10 ,11,3
    
        //8
        //变量提升 :var a;=>window.a=undefined=>a in window 为true
        if (!("a" in window)) {//条件不成立
            var a=1;
        }
        console.log(a); //undefined
    
        //9
        //变量提升: var a; b=地址
        var a=4;
        function b(x,y,a) {
            //=> 私有作用域 : x=1,y=2;a=3
            console.log(a);//3
            arguments[2]=10;//让第三个传递进来的实参等于10
            console.log(a);//10
        }
    
        a = b(1, 2, 3);//undefined  因为B函数执行没有返回值
        console.log(a);//3,10,undefined
        /*
        * 在js的非严格模式下,函数的参数集合域形式变量存在"映射"关系
        * 不管其中谁改变了,另外一个都跟着改变
        * 在js严格模式下,arguments和形参变量的映射关系被切断了
        * 互不干扰
        * */
    
        //10
        //变量提升 var foo;
        var foo='hello';
        (function (foo) {
            //私有作用域 foo='hello'(我们的foo和外面的foo是不同的变量
            console.log(foo);//hello
            var foo = foo || 'world';
            console.log(foo);//hello
        })(foo); //把全局Foo的值当做实参传递给私有作用域中的形参
        console.log(foo);//hello
        /*
        * A&&B  A为假返回A,A为真返回B
        * A||B  A为真返回A,A为假返回B
        * 逻辑与的优先级高于逻辑或
        * */
        function fn(num,callBack) {
            //如果num没有传递至:让其默认值为0
            //if(typeOf num==="undefined') num=0;
            num=num||0;//ES6可以给形参添加默认值
            callBack&&callBack();//符合条件就去执行
        }
    
        //11
        var a=9;
        function fn() {
            a=0;
            return function (b) {
                return b+a++;
            }
        }
        var f=fn();
        console.log(f(5));//5 a=1
        console.log(fn()(5));//5 fn()=>a=0, a=1
        console.log(f(5));//6 a=2
        console.log(a);//2
    
        //12
        //变量提升 var ary; var res;fn=地址
        var ary = [1, 2, 3, 4];
        function fn(ary) {
            ary[0]=0;
            ary=[0];
            ary[0]=100;
            return ary;
        }
        var res=fn(ary);
        console.log(ary);//[0,2,3,4]
        console.log(res);//100
    

    //13
    function fn(i) {
        return function (n) {
            console.log(n + (--i));
        }
    }
    var f=fn(2);
    f(3); //4  i=1
    fn(4)(5);//8
    fn(6)(7);//12
    f(8);//8  i=0
    
    //14
    var num=10;//60  65
    var obj={num: 20};//30
    obj.fn=(function (num) {
        this.num=num*3;
        num++;//21 22 23
        return function (n) {
            this.num+=n;
            num++;
            console.log(num);
        }
    })(obj.num);//自执行函数
    var fn=obj.fn;
    fn(5);//22
    obj.fn(10);// 23
    console.log(num, obj.num);//65 30
    
    //15
    function Fn() {
        this.x=100;
        this.y=200;
        this.getX=function () {
            console.log(this.x);
        }
    }
    Fn.prototype={
        y:400,
        getX:function () {
            console.log(this.x);
        },
        getY:function () {
            console.log(this.y);
        },
        sum:function () {
            console.log(this.x + this.y);
        }
    };
    var f1=new Fn;
    var f2=new Fn;
    console.log(f1.getX === f2.getX);//false 地址不一样
    console.log(f1.getY === f2.getY);//true两个的原型是一致的
    console.log(f1.__proto__.getY === Fn.prototype.getY);//true
    console.log(f1.__proto__.getX === f2.getX());//false
    console.log(f1.constructor);//f1私有没有去原型找,Object
    

    //16
    for(var i=0;i<inputs.length;i++){
        input[i].onclick=function(){
            alert(i); //5
        }
    }
    //同步异步编程
    //解决方法
    //自定义属性
    for(var i=0;i<inputs.length;i++){
    	input[i].myIndex=i;
        input[i].onclick=function(){
            console.log(this.myIndex)
        }
    }
    //闭包
    for(var i=0;i<inputs.length;i++){
        input[i].onclick=(function(i){
            return function(){
                alert(i)
            }
        })(i)
    }
    //ES6  (块级作用域)
    for(let i=0;i<inputs.length;i++){
        input[i].onclick=function(){
            alert(i); //5
        }
    }
    

    学东西不要学表面要学原理要学核心

    //17
    var fullName='language';
    var obj={
        fullName:'javascript',
        prop:{
            getFullName:function(){
                return this.fullName;
            }
        }
    };
    console.log(obj.prop.getFullName());//undefined
    //this=>obj.prop=>obj.prop.getFullName=>undefined
    //this指向问题 ,方法执行看前面有没有点,点谁,this指向this
    var test=obj.prop.getFullName;
    console.log(test());//this=>window  language
    
     //18
        var name='window';
        var Tom={
            name:"Tom",
            show:function () {
                console.log(this.name);
            },
            wait:function () {
                var fun=this.show;
                fun();
            }
        };
        Tom.wait();//this:Tom=>fun=Tom.show=> fun()  没有点this是window=> 打印'window'
    

    undefined

    • 变量提升:只声明未定义默认值就是undefined
    • 严格模式下:没有明确的执行主体,this就是undefined
    • 对象没有这个属性名,属性值是undefined
    • 函数定义形参不传值,默认就是undefined
    • 函数没有返回值,默认返回就是undefined

    null

    • 手动设置变量的值或者对象某一个属性值为null(此时不赋值,后面赋值)
    • 在js的DOM元素获取中,如果没有获取到指定对象,结果一般都是null
    • object.prototype.__proto__的值也是null
    • 正则捕获的时候,没有捕获到结果,默认也是null
  • 相关阅读:
    mybatis plus 执行sql
    springboot 打印 mybatisplus 的sql
    easyexcel 简单使用
    springboot ehcache
    easyexcel 时间转换
    springboot stopwatch
    c# 开机自动启动
    sqlHelper
    DirectX录音
    c# 发邮件
  • 原文地址:https://www.cnblogs.com/fangdongdemao/p/10186946.html
Copyright © 2020-2023  润新知