关于萌新的我参加若川的【源码共读】系列 一:36期

250 阅读3分钟

笔记文章开头加两句话:((●ˇ∀ˇ●)没想到把,我也把这句话复制过来了,哈哈哈)

新东西

  • Father
  • @umijs/fabric
  • np

Father

基于 rollup、docz、storybook、jest、prettier 和 eslint 的库工具包

@umijs/fabric

eslint、prettier 、studylint 的配置库

np

一个 管理 npm 发布流程的 package

需要学的东西很多,这里只作记录暂不作深究

重点

Object 类型 的 遍历访问示例

作者 最近 在阅读 红宝书,感觉 收获甚多 所以 对 若川的 36期 源码 的遍历 合成 一个 新对象 函数 的 代码 有 新的 体会。特此,记录,以便 梳理知识。

作者 学历水平 不高 。部分表达 存在 语病 请多指教。

对象在js中属于基础里的基础,了解对象的特性,才能更好写出没有bug的代码。

for...in 遍历 对象 属性

for in 遍历 对象的 实例和原型链上所有原型中可枚举、非Symbol的属性

// class 有两种方式创建 关键字创建 还有 表达式创建
const ForInClass=new Class{
    constrouctor(name,age){
        this.name=name
        this['age']=age;
    }
    sayName(){
        console.log(this.name);
    }
}
//字面量访问
ForInClass.protoType['protoTypeAttr']="protoType"
const myClassInstance=new ForInClass('我',22);

for(const key in myClassInstance){
    console.log("for in 举例 的 可 枚举 对象",key);
}

Object.keys、Object.values、Object.entries 返回自身所有的可枚举的属性的数组,数组本身也是作为一个可迭代对象。

可迭代对象的访问方式

const oEntries=Object.keys({nane:"我",age:22});
//for of 访问
for(const key of oEntries){
    
}
//伪数组转数组
Array.from(oEntries);

//迭代器 API
function * gen{
    yield * oEntries;
}
// 扩展
[...oEntries];
...

//发现还有其它可接受可迭代对象
// Map Set

//Promise.all Promise.race

getOwnPropertyNames、getOwnPropertySymbols 返回实例自身的属性

萌新搞错了这一块。getOwnProperyNames 返回对象自身所有非Symbol的键值,包括不可枚举。

getOwnPropertySymbols 返回自身所有的 Symbol键。

另外开发者默认设置的属性是 可枚举的 (enumable) ,我们可以通过Object.defineProperite(s)定制属性的操作特性。

const obj={
    name:'name',
    [Symbol('name')]:'name',
};
//['name']
Object.getOwnPropertyName(obj);
//[Symbol('name')];
Object.getOwnPropertySymbols(obj);

get \ set

属性的访问、获取的相关的设置

  • 只读设置,但不太优雅
  • 基于属性的get or set 的观察者
  • 计算属性
  • ...

Object.getPrototypeOf\instanceof\Object.isPrototypeOf

  • getPrototypeOf 主要是用来获取某个变量的原型,类式于[[Prototype]]属性。
  • instanceof 和 Object.isPrototypeOf 都是来判断是否在于原型上。 但区别主要在于 instanceof 是用 构造函数判定,Object.isPrototypeOf主要是用来构造原型上的判断。

ts

泛型

//<T,...泛型>,由
function fn<T>(arg:T):T{
//对应逻辑,采用类型守卫和类型收窄处理
    return arg;
}
type forEachType<>=T.number

exteneds

// 继承
enum size{
    big,
}
interface bag{
    color:string
}
interface bigBag extends bag{
    size:size.big
}
// 泛型约束
type book=<T extends {{page:number}}>

// 类型分配
interface book={
    name:string,
    page:number
};
interface ProgramBook{
    name:string,
    page:number,
    type:string,
}
type bool=book extends ProgramBook ? true:false

keyof

keyof T 返回类型的所有键的枚举类型

is

返回一个确定类型,在条件执行语句中可以明确该类型,选择对应类型推导。

  • 类型守卫
    function isString<T>(arg:T):arg is string(){return type arg};

in

  • 类型收窄
type man={
    name:string,
    sex:'man',
    playTel(){}
    
};
type fireman={
    name:string,
    sex:'man',
    major:"fireman"
    work(){}
}
function(arg:man|fireman){
    //fire 
    'major' in fireman?fireman.work():man.playTel(119);
}
  • 映射类型
type obj{
    readonly name:string;
    age:number
}
type objreadonly<T>={
    readonly[K in keyof T]:T[K]
}

前言

  • 有什么错误/不足,就在评论说一下,我整改一下。

感言

  • 红宝书 从 我 难以理解的晦涩 ,到现在 收获颇多 。这个过程,如果 没有 一定的 积累,恐怕 也无法 读出感觉,读出收获。
  • 这也是 我第一次 参与 在掘金平台的 文章。
  • 这是我对部分js知识边缘的整理和总结。
  • 时间挺赶的,暂时改动这些地方。

资料来源

我的笔记(很乱(/ω\))