zoukankan      html  css  js  c++  java
  • 常见前端面试代码题

    一、this绑定

    //this绑定,立即执行函数表达式
    var num = 1;
    var myObject = {
        num:2,
        add:function(){
            this.num = 3;
            (function(){
                console.log(this.num);
                this.num = 4;
            })();
            console.log(this.num);
        },
        sub:function(){
            console.log(this.num);
        }
    }
    myObject.add();
    console.log(myObject.num);
    console.log(num);
    var sub = myObject.sub;
    sub();
    //结果  1 3 3 4 4
    var number = 5;
    var obj = {
        number: 3,
        fn1: (function () {
            var number;
            this.number *= 2;
            number = number * 2;
            number = 3;
            return function () {
                var num = this.number;
                this.number *= 2;
                console.log(num);
                number *= 3;
                console.log(number);
            }
        })()
    }
    var fn1 = obj.fn1;
    fn1.call(null);
    obj.fn1();
    console.log(window.number);
    //结果  10 9 3 27 20

    二、函数调用(函数表达式、箭头函数)

    var name = 'window'
    var person1 = {
        name:'person1',
        show1:function(){
            console.log(this.name);
        },
        show2:()=>console.log(this.name),
        show3:function(){
            return function(){
                console.log(this.name);
            }
        },
        show4:function(){
            return ()=>console.log(this.name)
        }
    }
    var person2 = {name:'person2'};
    person1.show1();//person1
    person1.show1.call(person2);//person2
    
    person1.show2();//window
    person1.show2.call(person2);//window
    
    person1.show3()();//person1错    window
    person1.show3().call(person2);//person2
    person1.show3.call(person2)();//person2错   window
    
    person1.show4()();//window错     person1
    person1.show4().call(person2);//person1
    person1.show4.call(person2)();//window错    person2
    var name = "hanmeimei";
    var f = function(){
        var name = "lilei";
        return function(){
            console.log(this.name);
        } 
    }
    
    f()();//hanmeimei

    三、10个随机数,不重复

    function getRandom(num){
        var numb = [];
        var newArr = [];
        while(numb.length<num){
            let n = parseInt(Math.random() * 32);
            if(n>=2&&n<=32){
                numb.push(n);
                newArr = Array.from(new Set(numb));
            } 
        }
        console.log(newArr);
        //return newArr;
    }
    getRandom(10);

    四、数组展开函数

    // 写出一个数组展开函数, 如输入:[1,[2,[3,4,2],2],5,[6]],  则输出:[1,2,3,4,2,2,5,6] 
    // 因为和深度无关,所以说最简单可以这样
    function flatten(arr){
        var res = arr.join().split(',');
        res = res.map( ele => +ele)
        return res;
    }
    // 还有吗,递归,写一下
    function flatten(arr){
        var array = [];
        arr.forEach(ele => {
            if(Array.isArray(ele)){
                array.push(...flatten(ele));
            } else {
                array.push(ele);
            }
        })
        return array;
    }
    var arr1 = [1,[2,[3,4,2],2],5,[6]];
    flatten(arr1)

    五、eventloop

    console.log('begin');
    setTimeout(() => {
        console.log('setTimeout 1');
        Promise.resolve().then(() => {
            console.log('promise 1');
            setTimeout(() => {
                console.log('setTimeout2 between promise1&2');
            })
        }).then(() => {
            console.log('promise 2');
        });
    }, 0);
    console.log('end');

    begin
    end
    setTimeout 1
    promise 1
    promise 2
    setTimeout2 between promise1&2

    console.log('script start')
    
    async function async1() {
      await async2()
      console.log('async1 end')
    }
    async function async2() {
      console.log('async2 end') 
    }
    async1()
    
    setTimeout(function() {
      console.log('setTimeout')
    }, 0)
    
    new Promise(resolve => {
      console.log('Promise')
      resolve()
    })
      .then(function() {
        console.log('promise1')
      })
      .then(function() {
        console.log('promise2')
      })
    
    console.log('script end')
    //结果
    script start
    end
    Promise
    end
    end
    promise1
    promise2
    undefined
    setTimeout

    六、基本数据类型判断

    console.log(Number([1]))
    if([]==false){console.log(1)}//1
    if({}==false){console.log(2)}
    if([]){console.log(3)}//3
    if([1]==[1]){console.log(4)}

    七、裴波纳锲数列

    function Fibonacci(n)
    {
      if (n == 0) {
        return 1;
      }
      var pre = 1, // 前一个值
        cur = 1; // 当前值
      for (var i = 2; i <= n; i++) { // 更新两个值
        cur += pre;
        pre = cur - pre;
      }
      return cur;
    }
    
    function Fibonacci2(n)
    {
        var f = [0, 1];
        for(let i = 2; i <= n; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f[n];
    }
    
    Fibonacci(5)
    function fibonacci(n){
        if(n==1||n==2)
            return 1;
        return fibonacci(n-1)+fibonacci(n-2);
    }

    八、读取url中的参数

    var getUrlParam2 = function(sUrl, sKey){
        // 捕获组两枚,一枚负责Key 一枚负责获取Value
        var reg = new RegExp('([0-9a-zA-Z%]+)=([0-9a-zA-Z%]+)&*', 'ig');
        // 结果集保存
        var result = {};
        var temp;
        var key, value;
        while(temp = reg.exec(sUrl)) {
            key = temp[1];
            value = temp[2];
            if (result[key] && !(result[key] instanceof Array)) {
                result[key] = [result[key], value];     // 如果发现了第二个同名参数,则从字符串变为数组
            } else if (result[key] instanceof Array) {
                result[key].push(value);    // 已经是数组,又找到了,就push进去
            } else {
                result[key] = value;    // 第一次,还是普通保存
            }
        }
        if (sKey) {
            return result[sKey] ? result[sKey] : '';    // 为了避免undefined的情况
        } else {
            return result;  // 返回全部的对象参数
        }
     
    }
    getUrlParam2("http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe")

    九、jsonp

    //http://www.baidu.com?aa=11&callback=my_jsonp04349289664328899
        var jsonp = function(url,param,callback){
            //处理url地址,查找?,如果没有?这个变量就有一个"?",有?这个变量接收一个&
            var querystring = url.indexOf("?") == -1?"?":"&";
    
            //处理参数{xx:xx}
            for(var k in param) {
                querystring += k + "=" + param[k] + '&';//?k=para[k]
            }
            //处理回调函数名
            var random = Math.random().toString().replace(".","");
            var cbval = "my_jsonp" + random;
            var cb = "callback="+cbval;
            querystring += cb;
            var script = document.createElement("script");
            script.src = url + querystring;
            //把回调函数的名字附给window
            window[cbval] = function(param) {
                //这里执行回调的操作,用回调来处理参数
              callback(param);
              //拿到了就删掉这个script
              document.body.removeChild(script);
            };
            document.body.appendChild(script);
        }
        jsonp(
            "https://www.baidu.com",
            {aa:11},
            function(){
                console.log(param);
            }
            );
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript">
        // 得到航班信息查询结果后的回调函数
        var flightHandler = function(data){
            alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
        };
        // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
        var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
        // 创建script标签,设置其属性
        var script = document.createElement('script');
        script.setAttribute('src', url);
        // 把script标签加入head,此时调用开始
        document.getElementsByTagName('head')[0].appendChild(script); 
        </script>
    </head>
    <body>
    </body>
    </html>

    十、深克隆

    //js的深克隆
    function deepCopy(obj){
        //判断是否是简单数据类型,
        if(typeof obj == "object"){
            //复杂数据类型
            var result = obj.constructor == Array ? [] : {};
            for(let i in obj){
                result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
            }
        }else {
            //简单数据类型 直接 == 赋值
            var result = obj;
        }
        return result;
    }

    十一、判断是否是数组

    //判断是否为数组  通过toString()方法  通过constructor 通过instanceof  Array.isArray
    var arr = [1, 2, 3];
            var obj = {
                name: 'lyl',
                age: 18,
                1: 'name'
            }
            console.log(Object.prototype.toString.call(arr) === '[object Array]'); //true
            console.log(Object.prototype.toString.call(boj) === '[object Array]'); //false

    十二、promise

    // 这里我们创建了一个构造函数 参数就是执行器
    function Promise(exector) {
        // 这里我们将value 成功时候的值 reason失败时候的值放入属性中
        let self = this;
        // 这里我们加入一个状态标识
        this.status = 'pending';
        this.value = undefined;
        this.reason = undefined;
        // 成功执行
        function resolve(value) {
            // 判断是否处于pending状态
            if (self.status === 'pending') {
                self.value = value;
                // 这里我们执行之后需要更改状态
                self.status = 'resolved';
            }
        }   
        // 失败执行
        function reject(reason) {
            // 判断是否处于pending状态
            if (self.status === 'pending') {
                self.reason = reason;
                // 这里我们执行之后需要更改状态
                self.status = 'rejected';
            }
        }  
        // 这里对异常进行处理
         try {
            exector(resolve, reject);
        } catch(e) {
            reject(e)
        }
    }
    // 我们将then方法添加到构造函数的原型上 参数分别为成功和失败的回调
    Promise.prototype.then = function(onFulfilled, onRejected) {
        // 获取下this
        let self = this;
        if (this.status === 'resolved') {
            onFulfilled(self.value);
        }
        if (this.status === 'rejected') {
            onRejected(self.reason);
        }
    }
    //运行
    let promise = new Promise((resolve, reject) => {
         resolve("haha");
    })
    promise.then(data => {
        console.log(data); //输出 haha
    }, err=> {
        console.log(err);
    })
    // 多次调用
    promise.then(data => {
        console.log(data); //输出 haha
    }, err=> {
        console.log(err);
    })
    //完整版实现
    function MyPromise (executor) {
        var self = this;
        self.status = 'pending';
        self.resolveValue = null;
        self.rejectReason = null;
        self.ResolveCallBackList = [];
        self.RejectCallBackList = [];
    
        function resolve (value) {
            if (self.status === 'pending') {
                self.status = 'Fulfilled';
                self.resolveValue = value;
                self.ResolveCallBackList.forEach(function (ele) {
                    ele();
                });
            }  
        }
    
        function reject (reason) {
            if (self.status === 'pending') {
                self.status = 'Rejected';
                self.rejectReason = reason;
                self.RejectCallBackList.forEach(function (ele) {
                    ele();
                });            
            }  
        }
        
        try {
            executor(resolve, reject);
        }catch(e) {
            reject(e);
        } 
    };
    function ResolutionRetrunPromise (nextPromise, returnValue, res, rej) {
        if (returnValue instanceof MyPromise) {
            // Promise 对象
            returnValue.then(function (val) {
                res(val);
            }, function (reason) {
                rej(reason)
            });
        }else {
            res(returnValue);
        }
    }
    
    MyPromise.prototype.then = function (onFulfilled, onRejected) {
        if (!onFulfilled) {
            onFulfilled = function (val) {
                return val;
            }
        }
        if (!onRejected) {
            onRejected = function (reason) {
                throw new Error(reason);
            }
        }    
        var self = this;
    
        var nextPromise = new MyPromise(function (res, rej) {
            if (self.status === 'Fulfilled') {
                setTimeout(function () {
                    try {
                        // var nextResolveValue = onFulfilled(self.resolveValue);
                        // res(nextResolveValue);
                        var nextResolveValue = onFulfilled(self.resolveValue);
                        ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
    
                }, 0);
            }
        
            if (self.status === 'Rejected') {
                setTimeout(function () {
                    try {
                        var nextRejectValue = onRejected(self.rejectReason);
                        ResolutionRetrunPromise(nextPromise, nextRejectValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
    
                }, 0);
            }
        
            // 
            if (self.status === 'pending') { 
                self.ResolveCallBackList.push(function () {
                    try {
                        var nextResolveValue = onFulfilled(self.resolveValue);
                        ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
                    }catch(e) {
                        rej(e);
                    }
                });
        
                self.RejectCallBackList.push(function () {
                    setTimeout(function () {
                        try {
                            var nextRejectValue = onRejected(self.rejectReason);
                            ResolutionRetrunPromise(nextPromise, nextRejectValue, res, rej);
                        }catch(e) {
                            rej(e);
                        }
                    }, 0);
                });        
            }
        });
        return nextPromise;
    };
    
    MyPromise.prototype.catch = function (onRejected) {
        return this.then(null, onRejected);
    };
    
    MyPromise.prototype.finally = function (callback) {
        return this.then(function (data) {
            callback();
            return data;
        }, function (reason) {
            callback();
            throw reason;
        });
    };
    MyPromise.all = function (promiseArr) {
        // console.log(0)
        return new MyPromise(function (res, rej) {
            // promiseArr 所有的值都看一下, 如果全都是成功 res
            // rej  
            // then
            var arr = [];
            var times = 0;
            function processResult (index, result) {
                arr[index] = result;
                times++;
                // arr.length == promiseArr.length
                if (times ==  promiseArr.length) {
                    res(arr);
                }
            };
    
            for (let i = 0; i < promiseArr.length; i++) {
                var oPromise = promiseArr[i];
                if (typeof oPromise.then == 'function') {
                    oPromise.then(function (val) {
                        // val
                        // 我要存一下这个val val -> arr -> i
                        processResult(i, val)
                    }, function (reason) {
                        // reason
                        rej(reason);
                    })
                }else {
                    processResult(i, oPromise);
                }
            }
        });
    };
    MyPromise.race = function(promiseArr) {
        return new MyPromise(function (resolve, reject) {
            promiseArr.forEach(function (promise, index) {
               promise.then(resolve, reject);
            });
        });
    };
    MyPromise.reject = function (reason) {
        return new MyPromise(function (resolve, reject) {
            reject(reason);
        });
    };
    
    
    MyPromise.resolve = function (val) {
        return new MyPromise(function (resolve, reject) {
            resolve(val);
        });
    };

    十三、JS如何判断一组数字是否连续

    // 当出现连续数字的时候以‘-’输出  [1, 2, 3, 4, 6, 8, 9, 10]
    // 期望结果  ["1-4", 6, "8-10"]
    var arrange = function(arr){
        var result = [],temp = [];
        arr.sort(function(source, dest){
            return source - dest;
        }).concat(Infinity).reduce(function(source, dest){
            temp.push(source);
            if(dest-source > 1){
                result.push(temp);
                temp = [];
            }
            return dest;
        });
        return result;
    };
    var formatarr = function(arr) {
        var newArr = []
        var arr1 = arrange(arr)
        for (var i in arr1) {
            var str = '';
            if (arr1[i].length > 1) {
                str = arr1[i][0] + '-' + arr1[i][arr1[i].length - 1];
                newArr.push(str)
            } else {
                newArr.push(arr1[i][0]);
            }
       }
       return newArr;
    }

    十四、请自定义一个函数,实现字符串反转。

    function revStr(str){
        var temStr = "";
        var len = str.length;
        for(var i=len-1;i>=0;i--){
            temStr = str.charAt(i);
        }
        return temStr;
    }
    //字符串的完全翻转
    str.split("").reverse().join("")
    //翻转字符串中单词顺序,但单词字母顺序不变,注意:单词间可能有多空格,并且前后可能也有空格
    function reverseStr(param){
        var arr = param.split(/s+/);
        var newArr = [];
        for(i=0;i<arr.length;i++){
            newArr[arr.length-i] = arr[i];
        }
        return newArr.join(" ").trim();
    }
    document.write(reverseStr("smile at life"));        

    十五、JavaScript中如何检测一个变量是一个string/数组类型?

    var str = "hello world";
    function isString(str){
        if(typeof str == "string" || str.constructor == String){
            return true;
        }else{
            return false;
        }
    }
    if(typeof Array.isArray==='undefined'){
      Array.isArray=function(arg){
        return Object.prototype.tostring.call(rag)==='[Object Array]';
      };
    }

    十六、找到第一个数组array1中出现,而在第二个数组array2中没有出现的数字

    function findNullOfNum(arr1,arr2){
        var str = arr2.split("");
        var result = [];
        for(var i=0,x=0;i<arr1.length;i++){
            if(str.indexOf(arr1[i] == -1){
               result[x] = arr1[i];
               x++;
            }
         }
        return result;
    }

    十七、数组去重

    function select(arr){
      var temp=[];
      for(var i = 0;i < arr.length;i++){
        //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。ie8不兼容
        if(temp.indexOf(arr[i]) == -1){
          temp.push(arr[i]);
        }
      }
      return temp;
    }
    //具体验证
    var arr=[4,5,1,53,5,1,3];
    console.log(select(arr));
    
    //includes():判断当前数组是否包含某个值,若有则返回true,若没有则返回false;
    function select(arr){
      var temp=[];
      arr.forEach((v)=>{
        temp.includes(v)||temp.push(v);
      })
      return temp;
    }
    //循环判断
    function select(arr){
      var temp=[];
      for(var i = 0; i < arr.length; i++){
        for(var j = i+1; j < arr.length; j++){
          if(arr[i] === arr[j]){
            j = ++i;
          }
        }
        temp.push(arr[i]);
      }
      return temp;
    }

    //输入[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
    //输出[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
    Array.prototype.uniq = function () {
       var resArr = [];
       var flag = true;  
       for(var i=0;i<this.length;i++){
           if(resArr.indexOf(this[i]) == -1){
               if(this[i] != this[i]){   //排除 NaN
                  if(flag){
                       resArr.push(this[i]);
                       flag = false;
                  }
               }else{
                    resArr.push(this[i]);
               }
           }
       }
        return resArr;
    }

    十八、字符串全排列

    function Permutation(str)
    {
        let res=[];
        if(str.length<=0) return res;
        arr=str.split("");//将字符串转化为字符数组
        res=permutate(arr,0,res);
        res=[...new Set(res)];//去重
        res.sort();//排序
        return res;
    }
    function permutate(arr,index,res){
        if(arr.length==index){
            let s="";
            for(let i=0;i<arr.length;i++){
                s+=arr[i];
            }
            return res.push(s);
        }else{
            for(let i=index;i<arr.length;i++){
                [arr[index],arr[i]]=[arr[i],arr[index]];//交换
                permutate(arr,index+1,res);
                [arr[index],arr[i]]=[arr[i],arr[index]];//交换
            }
        }
        return res;
    }

    十九、找出数组中重复数字

    function findSame(arr) {
        let map = {}, res=[];
        for (let i = 0; i < arr.length; i++) {
            if (!map[arr[i]]) {
                map[arr[i]] = 1;
            } else {
                map[arr[i]]++;
            }
        }
        for (let i in map) {
            if (map[i] > 1) {
                res.push(i);
            }
        }
        return res;
    }

    二十、转换obj

    var obj =[
        {id: 1, parent: null},
        {id: 2, parent: 1},
        {id: 3, parent: 2},
    ]
    function transform(obj, index) {
        let node;
        if(obj.length - 1 == index){
            node = {
                id: obj[index].id,
                parent: obj[index].parent
            }
        }else{
            node = {
                id: obj[index].id,
                parent: obj[index].parent,
                child: transform(obj,++index)
            }
        }
        return node;
    }
    let obj2 = {
        obj: transform(obj, 0)
    }
    console.log(obj2);

    二十一、实现log函数

    function log(...args){
        let str = args.join(" ");
        return "(app)"+str;
    }

    二十二、动态插入p标签

    let p = document.createElement("p");
    p.setAttribute("class", "pdd-slogan");
    p.textContent = "多拼多实惠"
    div.appendChild(p);
    document.body.appendChild(div);

    二十三、let a = new A("test");发生了什么?(笔试简答题)

    1.先对A构造函数RHS查询标识符。
    2.使用new 调用构造函数A
    //创建一个新的对象,并设置__proto__
    //将构造函数的作用域赋值给新对象(因此this就指向了这个新对象)
    //执行函数中的代码(为这个对象添加新的属性)
    //返回这个新的对象
    3.创建变量a,并把之前的调用结果赋值给变量a
    下面是new的原理实现
    //实现一个new方法
    function New(f) {
        //返回一个func
        return function () {
            var o = {"__proto__": f.prototype};
            f.apply(o, arguments);//继承父类的属性
            return o; //返回一个Object
        }
    }

    二十四、输入一个数字,不以0开头,找到相同数字组合的最小数字

    function nextSmaller (num) {
      // your code here 例:输入:210215,输出:101225   输入:21,输出:12  找不到满足的输出-1
        var arr = num.toString().split("");
        if(arr[0]!=0){
            arr.sort();
            console.log(arr);
            var i = 0;
            while(arr[i]==0){
                i = i+1;
            }
            if(i!=0){
                arr[0] = arr[i];
                arr[i] = 0;
            }
            if(num>=parseInt(arr.join(""))){
               return parseInt(arr.join(""));
            }else{
               return -1;
            }
        }else{
            return -1;
        }
    }

    二十五、图片懒加载和预加载

    function throttle(fn, delay, atleast) {//函数绑定在 scroll 事件上,当页面滚动时,避免函数被高频触发,
            var timeout = null,//进行去抖处理
            startTime = new Date();
            return function() {
            var curTime = new Date();
            clearTimeout(timeout);
            if(curTime - startTime >= atleast) {
                fn();
                startTime = curTime;
            }else {
                timeout = setTimeout(fn, delay);
            }
            }
        }
        function lazyload() {
            var images = document.getElementsByTagName('img');
            var len    = images.length;
            var n      = 0;      //存储图片加载到的位置,避免每次都从第一张图片开始遍历        
            return function() {
            var seeHeight = document.documentElement.clientHeight;
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            for(var i = n; i < len; i++) {
                if(images[i].offsetTop < seeHeight + scrollTop) {
                    if(images[i].getAttribute('src') === 'images/loading.gif') {
                     images[i].src = images[i].getAttribute('data-src');
                    }
                n = n + 1;
                 }
            }
            }
        }
        var loadImages = lazyload();
        loadImages();          //初始化首页的页面图片
        window.addEventListener('scroll', throttle(loadImages, 500, 1000), false);
      //函数节流(throttle)与函数去抖(debounce)处理,
    //500ms 的延迟,和 1000ms 的间隔,当超过 1000ms 未触发该函数,则立即执行该函数,不然则延迟 500ms 执行该函数
    /**
     * 遍历imgs数组,将所有图片加载出来
     * 可以通过控制台查看网络请求,会发现所有图片均已加载
     */
    for (let i = 0; i < len; i++) {
        let imgObj = new Image(); // 创建图片对象
        imgObj.src = imgs[i];
    
        imgObj.addEventListener('load', function () { // 这里没有考虑error,实际上要考虑
            console.log('imgs' + i + '加载完毕');
        }, false);
    }

    二十六、二叉树前序遍历

    function Node (data, left, right) {
        this.data = data;
        this.left = left;
        this.right = right;
        this.show = function () {
            return this.data;
        };
    }
    
    
    function BST () {
        this.root = null;
        this.insert = function (data) {
            var node = new Node(data, null, null);
            if (this.root === null) {
                this.root = node;
            } else {
                var current = this.root;
                var parent;
                while (true) {
                    parent = current;
                    if (data < current.data) {
                        current = current.left;
                        if (current === null) {
                            parent.left = node;
                            break;
                        }
                    } else {
                        current = current.right;
                        if(current === null) {
                            parent.right = node;
                            break;
                        }
                    }
                }
            }
        };
        // 中序遍历
        this.inOrder = function (node) {
            if (node !== null) {
                this.inOrder(node.left);
                console.log(node.show());
                this.inOrder(node.right);
            }
        };
        // 先序遍历
        this.preOrder = function (node) {
            if (node !== null) {
                console.log(node.show());
                this.preOrder(node.left);
                this.preOrder(node.right);
            }
        };
        // 后序遍历
        this.afterOrder = function (node) {
            if (node !== null) {
                this.afterOrder(node.left);
                this.afterOrder(node.right);
                console.log(node.show());
            }
        };
    
        this.getMin = function () {
            var current = this.root;
            while (current.left !== null) {
                current = current.left;
            }
            return current.data;
        };
    
    
        this.getMax = function () {
            var current = this.root;
            while (current.right !== null) {
                current = current.right;
            }
            return current.data;
        };
    
        this.find = function (data) {
            var current = this.root;
            while (current !== null) {
                if (data < current.data) {
                    current = current.left;
                } else if (data > current.data) {
                    current = current.right;
                } else {
                    return current;
                }
            }
            return null;
        };
    
        
    
        this.remove = function (data) {
            this.root = this._removeNode(this.root, data); //将根节点转换
        };
    
        this._getSmallest = function (node) {
            while(node.left!=null){
                node=node.left;
            }
            return node;
        };
    
    
        this._removeNode = function (node, data) {
            if (node === null) {
                return null;
            }
            if (data === node.data) {
                // 如果没有子节点
                if (node.right === null && node.left === null) {
                    return null;
                }
                // 如果没有左子节点
                if (node.left === null) {
                    return node.right;//直接指向其右节点
                }
                // 如果没有右子节点
                if (node.right === null) {
                    return node.left;
                }
                // 如果有两个节点
                if (node.right !== null && node.left !== null) {
                    var tempNode = this._getSmallest(node.right);   // 找到最小的右节点
                    node.data = tempNode.data;
                    node.right = this._removeNode(node.right, tempNode.data);    // 依次寻找
                    return node;
                }
            } else if (data < node.data){
                node.left = this._removeNode(node.left, data);
                return node;
            } else {
                node.right = this._removeNode(node.right, data);
                return node;
            }
        };
    }

     二十七、js大数相加

    原文连接:https://blog.csdn.net/u013362969/article/details/86544785

    function add (str1, str2) {
        let len1 = str1.length;
        let len2 = str2.length;
        // let len = len1<len2 ? len1 : len2;
        let len = Math.max(len1, len2);
        let res = '';
        let jin = 0;
        for (let i = 0; i < len; i++) {
          let ad1 = str1.charAt(len1 - i - 1) ;
          let ad2 = str2.charAt(len2 - i - 1) ;
          //str1.charAt(-1)==='';Number('')===0;
          let sum = Number(ad1) + Number(ad2) + jin;
          res = sum % 10 + res;
          jin=sum>9
          // jin = Math.floor(sum / 10);
        }
        return res.replace(/^0+/, '');
      };
    
    function addBigNumber(a, b) {
      var res = '',
        temp = 0;
      a = a.split('');
      b = b.split('');
      while (a.length || b.length || temp) {
        temp += ~~a.pop() + ~~b.pop();
        res = (temp % 10) + res;
        temp = temp > 9;
      }
      return res.replace(/^0+/, '');
    }

    二十八、sort方法将数组内的对象进行排序

    var presonArr = [
        { name:'freddy', age:24, score:97 },
        { name:'nick', age:18, score:87 },
        { name:'mike', age:26, score:80 },
        { name:'james', age:34, score:90 },
        { name:'curry', age:30, score:83 }
    ];
    //年龄升序排序
    presonArr.sort(function(a,b){
        return a.age - b.age;    
    });
    console.log(presonArr);

    后续会继续补充······

  • 相关阅读:
    一步步介绍如何给项目添加单元测试
    日期格式化在移动端的问题
    使用VW时,图片的问题
    转:vw适配中使用伪类选择器遇到的问题
    ES6模块的import和export用法总结
    转:如何在Vue项目中使用vw实现移动端适配
    PhpStrom添加调试功能
    小程序商城笔记
    使用TortoiseGit对android studio工程进行代码版本控制
    Android Studio 常见异常解决办法
  • 原文地址:https://www.cnblogs.com/lxy-starry/p/11302746.html
Copyright © 2011-2022 走看看