键路径是定义方法的DOMString或序列 从值中提取键。有效的密钥路径是以下之一:
- 空DOMString。
- 一个标识符,它是与之匹配的DOMString ECMAScript语言规范中的IdentifierName生成 [ECMA-262]。
- 由两个或多个标识符组成的DOMString 以句点分隔(ASCII字符代码46,U + 002E FULL STOP)。
- 甲 非空序列,只包含符合的字符串 以上要求。
在"evaluate a key path on a value"的步骤
下
- 如果keyPath是序列,请运行以下子步骤:
醇>
- 让result成为一个新的Array ECMAScript对象。
- 对于keyPath序列中的每个项目,运行以下子步骤:
- 让key为递归运行步骤的结果,使用item作为keyPath,使用键路径从值中提取键 价值作为价值。
- ReturnIfAbrupt(键)
- 如果密钥失败,则中止整个算法并返回失败。
- 将第一个子步骤的结果附加到结果的末尾。
- 返回结果。
这只会'#34; recurse"一个级别,因为密钥路径序列不能嵌套。
根据以上内容(和递归extract a key from a value using a key path),在我看来,不允许包含非字符串(甚至使用toString()
方法)的非空序列。然而W3C tests表示至少可以转换可串行的对象(不确定布尔值或数字基元),并且它们indeed pass。
我是否遗漏了规范中的某些内容,表明在验证/输入/使用之前应首先对这些内容进行字符串化,如果是,在什么条件下?
答案 0 :(得分:2)
这发生在绑定ECMAScript和API的Web IDL层。例如,使用createObjectStore()
API,输入字典定义为:
dictionary IDBObjectStoreParameters {
(DOMString or sequence<DOMString>)? keyPath = null;
boolean autoIncrement = false;
};
到执行createObjectStore()的逻辑时,IDL层通过{{3}中定义的转换保证keyPath
的值是DOMString,序列或null。 }。如果传递了无法转换的内容,WebIDL会定义该方法将在到达API逻辑之前抛出。