WAHTWG Infra标准简记
WHATWG标准中的Infra主要是为了提供一种通用的描述以描述标准,要看懂WHATWG标准至少应当先了解Infra标准
备注:本文唯一参考资料WHATWG Infra Standard版本为2023年7月18日,可能并不是最新版本的
描述规范
1.分成规范性(normative)和非规范性(non-normative)的部分,非规范性的内容会提醒这是非规范性的
2.使用RFC2119推荐的【MUST】【MUST NOT】【REQUIRED】【SHALL】【SHALL NOT】【SHOULD】【SHOULD NOT】【RECOMMENDED】【NOT RECOMMENDED】【MAY】【OPTIONAL】来更好地描述。其中尽可能地只使用【must】【must not】【should】【may】,对于非规范性内容可以用【can】【cannot】【could】【couldnot】【might】【might not】进行描述
3.【2】为了易读性违反了RFC8174,对于故意违反其他标准的情况会明确说明以及原因
4.【or】这一词即表示两者都包含的情况,也可能表示排除了都不包含的情况,根据具体语境确定
5.【user agent】(用户代理),在此标准中用户代理指的是执行此规范的客户端软件的实例,客户端软件本身也可以看作是一种【工具】(implementation),每个人都会用到这些工具进而这些工具充当了用户。如果说一些东西是【工具被定义的】(implementation-defined)取决于是否达成了工具原本要达成的目的,而达成与否取决于一些规范标准
6.WHATWG一系列规范存在隐私问题的可能
算法描述规范
1.算法上的描述需要使用【must】或至少暗含了【must】,且满足一致性
2.算法不优化性能
3.不限制算法输入,以避免潜在需求。但同时用户需要主动去限制
4.算法的名字通常是动词短语,但一些特殊独立存在的或许会用名词
5.通用的声明算法格式
[algorithm name] //算法名
[type1] , [type2] , …//输入的类型
steps//算法步骤
[return type].[parameter1][parameter2]//返回类型、返回参数
但如果算法较为简单也可以不说明算法步骤
[algorithm name] //算法名
[type1] , [type2] , …//输入的类型
[return type].[parameter1][parameter2]//返回类型、返回参数
如果语义上参数非常清晰,算法也可以不说明类型
[algorithm name] //算法名
[data1] , [data2] , …//输入
[return data].[parameter1][parameter2]//返回
6.算法有时输入会出现一种可选参数的情况或是默认值的情况,必须用【optional】【default】来表述
optional [type] … [parameter]//optional表示该参数是可选的
optional [type] (default [default value]) … [parameter]//default value表示默认值
7.布尔类型的参数必须存在默认值,而且必须是false
8.可选参数可以省略,但最后一个可选参数必须标明
9.【8】导致了一些问题,如果有个函数F具有String(默认值为空字符串)、Boolean两类参数就会存在问题
函数F
optional String p1
optional Boolean p2
1.F p2//不省略
2.F "" p2//省略p1
//问题,如何表述都省略或只省略p2
//因为根据【8】p2必须描述
3.F false/*表明p2省略*/ and p1 p2//标明不省略p1
但这种表述是有问题的,因此引入另一种方式进行描述
10.锚定可选参数,以提高清晰性、灵活性
函数F
optional String p1
optional Boolean p2
1.F p2//不省略
2.F p1 set to "" p2//省略p1
3.F p2 set to false p2//省略p2
4.F p1 set to "" p2 set to false//都省略
11.布尔陷阱的问题:布尔陷阱是指语义不明朗的true、false,如函数reload,不管使用true还是false你都不知道该函数原本要表达的含义是什么,因此不应当使用布尔以避免这种窘境而是改为语义化的常量或是一种通用规范
12.变量用let声明;赋值变量值用set;声明变量前无法使用变量;变量作用域是块级的;不允许对同一名字多次声明变量
13.对于元组(tuple)下某个值变量的赋值用根据结构确定且数量正确,如
set (200, "") to OK//二元组赋值
let ( , ) to status//定义status为二元组
14.【return】表示终止
【throw】表示抛出异常
【catch】尝试捕获异
【if】【then】【else】用于条件分支
【while】【for each】用于循环
【continue】【break】用于控制循环
【assert】类似于if,但结果必须为真,否则意味着该标准的这段代码存在问题
数据类型描述规范
1.【null】表示空值,运算法则同JS的null
2.【boolean】表示布尔值,只能为true、false
3.【byte】表示一字节(八位二进制序列),用十六进制数字表示即范围在0x00~0xFF之间
4.【ASCII byte】表示ASCII码(ASCII标准参考RFC20),同【3】的表示方法,但有些值不在ASCII定义内
5.【byte sequence】表示字节序列,同【3】表示为一组序列如(0x48 0x49 0x50)
字节序列长度(length)是指它的字节数
字节小写化(byte-lowercase)是指将一个字节序列的每个字节增加0x20直到在0x41~0x5A范围(包含边界)内
字节大写化(byte-uppercase)是指将一个字节序列的每个字节减少0x20直到在0x61~0x7A范围(包含边界)内
字节大小写不敏感匹配(byte-case-insensitive match)的字节序列是指先将其字节小写化而后进行一些动作
有判断前缀(prefix)的方法(具体原理参考文档)
有比较字符串的方法
其余算法参考文档
6.【code point】是指一个Unicode码点,用"U+"和四位十六进制表述,如U+0039就是数字9,但有时也会是五位的如U+1F914 (🤔),对此提供了额外的解析方法
高代理项(leading surrogate)是指U+D800~U+DBFF范围(包含边界)的码点
低代理项(trailing surrogate)是指U+DC00~U+DFFF范围(包含边界)的码点
代理项(trailing surrogate)是指U+D800~U+DFFF范围(包含边界)的码点
标量值(scalar value)是指不是代理项的码点
ASCII码点(ASCII code point)就是从ASCII码转成Unicode的码点,范围(包含边界)在U+0000~U+007F
ASCII空白符(ASCII whitespace)是指U+0009(tab)、U+000A(换行)、U+000C(换页)、U+000D(回车)、U+0020(空格)
7.【string】是指字符串,由十六位整数(即【5】的码点)序列组成,但对码点进行了约束为码点单元(code unit),对于长度多于4位的码点字符串会解析为两个4位码点,如U+1F600会解析为0xD83D、0XDE00
字符串的长度(length)是指码点单元的长度
字符串码点单元的长度(code point length)是所包含码点的数量
标量字符串(scalar value string)是将所有码点转为标量值的字符串
有判断(代码单元)前缀(prefix)的方法
有判断(代码单元)后缀(suffix)的方法
有比较字符串的方法
有获取子串的方法
有拆分字符串为列表的方法
有列表组合为字符串的方法
其余算法参考文档
8.时间(time)采用高分辨率时间的规范
数据结构描述规范
1.列表(list)是一组数据的有序组;用0表示第一项数据;用【<<】【>>】确定数组如<<0,1,true,"hello">>
有头添加(prepend)元素的方法
有尾添加(append)元素的方法
有插入(insert)元素的方法
有删除(remove)元素的方法
有替换(replace)元素的方法
有合并(extend)列表的方法
有排序(sort)方法,但规范还要求(也包括其他结构)必须是稳定性排序
有复制(copy)列表的方法,但注意(也包括其他结构)只有浅复制
...其余方法可以参考JS Array对象都有实现
2.栈(stack)、队列(queue)的结构都被整合到列表中了,因此JS初学者估计最奇怪的就是没有专门的栈、队列的结构,但实际上都已经融合进Array内了
3.集合(set)虽然是无序的但也被整合到列表中了,因为网络的特殊性,几乎所有情况都是要求数据序列化,因此哪怕是集合也是一种可序列化的,但还是满足了集合的互异性。理论上来说这只是满足元素互异性的列表
4.映射(map)同集合一样是有序性的,由二元组组成的列表;其中二元组第一个元素称为键(key)第二个元素称为值(value),一整个二元组就称为条目(entry),用[key , value]
表示;键是互异性的。理论上来说这是不满足一对多的映射
映射的大小取决于key的大小
5.结构体(struct)是一组数据所组成的,但其中每一个数据都有唯一不可变的名称(name),即构成了name: data
的形式和上面map的key: value
类似
6.元组(tuple)是有顺序的结构体,即赋予了结构体可迭代的方法但并不一定所有结构体都是可迭代的
7.JSON,特别常用的轻量级的数据格式,详细见https://www.json.org/json-zh.html(有中文翻译)
8.Forgiving-base64,base64一方面是为了将字符范围缩小到64个字符(数字大小写字母和一些可用于正则的特殊字符)防止一些字符的问题,另外则是以8字节进行编码方便网络传输。Forgiving-base64是WHATWG定义的一种base64,原理上略作改动
命名空间(namespace)描述规范
1.HTML的命名空间为http://www.w3.org/1999/xhtml
2.XML的命名空间为http://www.w3.org/XML/1998/namespace
3.XMLNS的命名空间为http://www.w3.org/2000/xmlns/
4.XLink的命名空间为http://www.w3.org/1999/xlink
5.MathML的命名空间为http://www.w3.org/1998/Math/MathML
6.SVG的命名空间为http://www.w3.org/2000/svg
支持作者
【Buymeacoffee】https://www.buymeacoffee.com/WindWitch/e/156025
【冲呀】https://www.chongya.com/update/a226192d55c141e2b8b90d44e4a8b6ec