js 基础代码(面试,平时都可以用)🚀

输出时间差

console.time('测试');
console.timeEnd('测试);

//2
performance.mark('start')
setTimeout(()=>{
    performance.mark('end')
    performance.measure('performance cost','start','end')
    console.log(performance.getEntriesByName('performance cost')[0].duration)
},2000)

dom 有意思知识点

创建和插入新元素,删除现有元素以及修改其属性。

var newNode=event.target.cloneNode(true);

dom.className='a';

dom.classList.add()/dom.classList.remove()

dom.getAttribute()  dom.setAttribute()

dom.style.borderWidth/['border-width']  包含px  计算后的属性用 getComputedStyle().getPropertyValue()

DOMContentLoaded/onload/

宽高:offsetWidth offsetHeight 必须在dom 有才行,height 、width 不直接设置无法正确获取

dom.outerHTML()

document.createTextNode   document.createComment

console.group('测试1')
cosnole.groupEnd()

dom.children  dom.childNodes 

ajax XMLHttpRequest 和 fetch

    //XMLHttpRequest 原生实现ajax
    function getJSON(url){
        return new Promise((resolve,reject)=>{
            const request=new XMLHttpRequest();
            request.open('GET',url);
            request.onload=function(){
                    if(this.status===200){
                        resolve(JSON.parse(this.response));
                    }
                    else{
                        reject(this.status + '  '+this.statusText);
                    }
            },
            request.onerror=()=>{
                reject(this.status+' '+this.statusText);
            }
            request.send();
        });
    }

    getJSON('./ajaxtest.json').then(res=>{
       alert(JSON.stringify(res));
    }).catch(e=>{
        console.log('异常');
        console.log(e);
    })

    fetch(url,param).then(response=>response.json())

移动端touch事件监听

touchstart,touchmove,touchend ,有个注意事项,从一个box 滑入另一个box 是,target 是不会改变的,始终是touchstart 元素,解决方案是通过elmentFromPoint

如何 访问dom 中的data

TMLElement.dataset["arr"] ) 

new 模拟实现

  Con = [].shift.call(arguments); arguments 删除第一个同时赋给Con

  var args = Array.prototype.slice.apply(arguments); 
    //方案1
    function create(){
        const  obj=new Object();
        const Constructor=[].shift.call(arguments);
        obj.__proto__=Constructor
        const ret=Constructor.apply(obj,arguments);
        return ret instanceof Object?ret:obj;
    }

    //方案2
    function create(fn,...args){
        const obj=Object.create(fn.prototype)
        const ret=fn.call(obj,...args)
        return ret instanceof Object?ret:obj 
    }

前端读取图片(todo)

Object.defineProperty

Object.defineProperty writable 和 set 不能一起用,可以实现只读属性,configurable,value

   Object.defineProperty(obj,'name',{
          // writable:true,
          get:()=>{
            return 'jr'
          }
        })
        console.log(obj.name)
        obj.name=122
        console.log(obj.name)

学习vue 源码, 总结的一些东西 obj 的工具函数

//严格检查
 const _toString=Object.prototype.toString
isPureObject(obj){
    return _toString.call(obj)==='[object Object]'
}

isTrue(obj){
    return obj===true
}

isRegExp(v){
    return _toString.call(v)==='[object RegExp]'
}

isFunction(func){
    return typeof func==='function'
}


!!a   a 为undefined 返回false
isFunction(func){
    return Object.prototype.call(func)==='[object Function]'
}

//对某些数组原型方法做改造,不污染全部数组的原型。
const arrayPro=Array.prototype
var arrMethods=Object.create(arrayPro)

['push'].forEach(method=>{
    arrMethods[method]=function(){
        //避免闭包泄漏
        let i=arguments.length;
        const args=new Array(i)
        while(i--){
            args[i]=arguments[i]
        }
        arrayPro.call(this,args)
        //做些额外的操作
    }
})

// 创建一个{},原型上没东西的

const c=Object.create(null)

构造函数是否使用new 来建立的检验,2种方法

    Vue(){
        
        if(this instanceof Vue){

        }
        else{
            throw new Error('必须使用new 创建')
        }
        
        //方法2:
        if(new.target===Vue){

        }
        else{
            throw new Error('必须使用new 创建')
        }
    }

数组语法 this 的指向

http://es6.ruanyifeng.com/#docs/array#%E6%95%B0%E7%BB%84%E5%AE%9E%E4%BE%8B%E7%9A%84-includes

//容易影响全局,可以拷贝一份出来用
Array.prototype.unique=function(){
    return [...new Set(this)]
}

衍生问题: 将一个嵌套数组扁平化,去重,递增顺序 arr.toString() 也能去扁平化

    [...new Set(arr.flat(Infinity))].sort((a,b)=>return a-b)

判断一个url 是否合法

isUrl(url){
    try{
        const item=new URL(url)
        console.log(item)
        return true
    }catch(e){
        return false
    }
}

基础递归

第 88 题:实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度

    

模块重定向

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/export

import App from App.vue
export default App 


export * from App.vue (导出所有模块)
export {moduleA as default} from '.../' (重命名为默认模块)
export {default} from App.vue (导出默认模块)

substr 官方建议使用substring(1,n) 替代

performance 里的数据

可以获取到DNS 解析时间,TCP 连接时间,首屏渲染时间,dom 完成时间,页面load 完时间

    let timing = performance.timing,
    start = timing.navigationStart,
    dnsTime = 0,
    tcpTime = 0,
    firstPaintTime = 0,
    domRenderTime = 0,
    loadTime = 0;

dnsTime = timing.domainLookupEnd - timing.domainLookupStart;
tcpTime = timing.connectEnd - timing.connectStart;
firstPaintTime = timing.responseStart - start;
domRenderTime = timing.domContentLoadedEventEnd - start;
loadTime = timing.loadEventEnd - start;

console.log('DNS解析时间:', dnsTime, 
            '\nTCP建立时间:', tcpTime, 
            '\n首屏时间:', firstPaintTime,
            '\ndom渲染完成时间:', domRenderTime, 
            '\n页面onload时间:', loadTime);

上次更新: 2019-12-28 08:57:30