• 读源码学会一些编程小技巧


    记录一下学习源码中了解到一些开发编程技巧

    判断嵌套对象内部的值是否存在

         var i
        // 业务中出现的多层嵌套的对象
        var a = {
            s: {
                f: {
                    sf: 333,
                },
            },
        }
        // 一般的写法
        if (a && a.s && a.s.f && a.s.f.sf) {
            console.log(222)
        }
        // vue源码里使用的方法,上方的嵌套会随着层级越来越长,而下方的方法用了一个中间变量保证只有一层
        if ((i = a) && (i = i.s) && (i = i.f) && (i = i.sf)) {
            console.log(222)
        }
    

    Object.create(null)创建无原型属性的对象

    使用for in遍历对象会把原型可枚举属性一起遍历出来,一般forin里面会包一层object.hasOwnProperty(key)
    来确定是否是对象本身的方法,而Object.create(null)创建无原型属性的对象就不需要使用forin里面包一层了

    判断构造函数是否使用new来创建

    function ss(num) {
            // 方式1 instanceof 如果函数不是通过new就报错
            // 如果使用new关键字 this的__proto__指向函数的prototype
            if (!(this instanceof ss)) {
                console.error(222)
            }
            // 方式2 new.target 如果函数不是通过new就报错
            // new.target 参考阮一峰 es6
            if (new.target != ss) {
                console.error(222)
            }
            // 方式3 new.target 如果函数不是通过new就手动帮你new
            if (new.target != ss) {
                return new ss(num)
            }
            this.a = num
        }
        var ff = ss(33)
        console.log(ff)
    

    保证对象的属性不可变

       var a = {}
        // // 使用这种方式创建的对象属性,利用默认设置是不可枚举,不可重写,不可配置的
        Object.defineProperty(a, "f", {
            value: 33,
        })
    
        // 跟上一种方式有些相似,利用读取只从get方法读取的原理,在谷歌打印出来是{},要点开才能看的数据
        Object.defineProperty(a, "f", {
            get: () => 55,
            configurable: true,
        })
        // 复习一下相关知识
        // Object.getOwnPropertyDescriptor 读取你的defineProperty设置
        Object.getOwnPropertyDescriptor(a, "f")
    
        // Object.preventExtensions 不允许在使用Object.defineProperty扩展a对象,加其他属性
        Object.preventExtensions(a)
    
        // Object.seal,在Object.preventExtensions功能上,加上之前的属性不可配置
        Object.seal(a)
    
        //  Object.freeze, 在Object.seal功能上,加上不允许值改变
        Object.freeze(a)
    

    简化如果没有创建,有就直接操作的步骤

         var a
        // 之前经常会遇到如果第一次要创建再操作,之后直接操作,
        // 原来是用if else来写,现在可以用下面的方式来写,但是记得要加;号不然代码可能会被浏览器理解成其他意思
        ;(a = a || []).push(3)
        console.log(a)
        // 或者是给对象赋值,这种情况更加常见
        var b = {}
        ;(b.arr = b.arr || []).push(3)
        console.log(b)
    

    bind直接从arguments传参

        // arguments 是从函数直接取得数组参数
        // fun 是你自己得方法需要用bind切换指向, obj 是你bind指向得对象
        Function.prototype.bind.apply(fun, [obj].concat(Array.prototype.slice.call(arguments))) 
    

    复杂数组去重

       function unique (arr) {
        let obj = {}
        return arr.filter((item, index) => {
          // 防止key重复d
          let newItem = item + JSON.stringify(item)
          return obj.hasOwnProperty(newItem) ? false : (obj[newItem] = true)
        })
      }
    

    返回的同时给变量赋值

       var ff = ''
        function aw(params) {
            return ff = 44
        }
        console.log(aw());
        console.log(ff);
    
  • 相关阅读:
    three.js 显示中文字体 和 tween应用
    Caddy v1 版本增加插件
    Git 常用命令大全
    批量部署ssh免密登陆
    Python MySQLdb 模块使用方法
    python XlsxWriter创建Excel 表格
    DB2数据库的日志文件管理
    Linux 文本对比 diff 命令详解(整理)
    ssh 免交互登录 ,远程执行命令脚本。
    linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案(转)
  • 原文地址:https://www.cnblogs.com/wzcsqaws/p/12893585.html
Copyright © 2020-2023  润新知