序列成员的字符串化

时间:2016-07-02 21:47:47

标签: indexeddb

根据IndexedDB spec

  

键路径是定义方法的DOMString或序列   从值中提取键。有效的密钥路径是以下之一:

     
      
  • 空DOMString。
  •   
  • 一个标识符,它是与之匹配的DOMString   ECMAScript语言规范中的IdentifierName生成   [ECMA-262]。
  •   
  • 由两个或多个标识符组成的DOMString   以句点分隔(ASCII字符代码46,U + 002E FULL STOP)。
  •   
  • 甲   非空序列,只包含符合的字符串   以上要求。
  •   

"evaluate a key path on a value"的步骤

  
      
  1. 如果keyPath是序列,请运行以下子步骤:      
        
    1. 让result成为一个新的Array ECMAScript对象。
    2.   
    3. 对于keyPath序列中的每个项目,运行以下子步骤:      
          
      1. 让key为递归运行步骤的结果,使用item作为keyPath,使用键路径从值中提取键   价值作为价值。
      2.   
      3. ReturnIfAbrupt(键)
      4.   
      5. 如果密钥失败,则中止整个算法并返回失败。
      6.   
      7. 将第一个子步骤的结果附加到结果的末尾。
      8.   
    4.   
    5. 返回结果。
    6.   
  2.         

    这只会'#34; recurse"一个级别,因为密钥路径序列不能嵌套。

根据以上内容(和递归extract a key from a value using a key path),在我看来,不允许包含非字符串(甚至使用toString()方法)的非空序列。然而W3C tests表示至少可以转换可串行的对象(不确定布尔值或数字基元),并且它们indeed pass

我是否遗漏了规范中的某些内容,表明在验证/输入/使用之前应首先对这些内容进行字符串化,如果是,在什么条件下?

1 个答案:

答案 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逻辑之前抛出。