Javascript 为什么FormData如此秘密/私密?

Javascript 为什么FormData如此秘密/私密?,javascript,Javascript,一旦我创建FormData var form = new FormData(); form.append("hash", this.S.Storage.get('h_token')); 我不能把它严格化: JSON.stringify(form) // returns "{}" 我无法循环通过它: _.each(form, function(val){ // nope }) 我无法将其记录到控制台(有任何有用的结果) 我还没有在JavaScript中遇到过这样一种神秘的类型 我不能

一旦我创建FormData

var form = new FormData();
form.append("hash", this.S.Storage.get('h_token'));
我不能把它严格化:

JSON.stringify(form) // returns "{}"
我无法循环通过它:

_.each(form, function(val){
    // nope
})
我无法将其记录到控制台(有任何有用的结果)

我还没有在JavaScript中遇到过这样一种神秘的类型

我不能把它严格化

因为它是一个“主机对象”(由主机环境、浏览器提供),并且主机对象无法字符串化

我无法循环通过它

这可能意味着它没有可枚举属性

我无法将其记录到控制台(有任何有用的结果)

实际上,console.log显示了,
.append
中定义的唯一方法


为什么没有可枚举属性?我不知道,但考虑到你负责填充FormData,你应该事先知道它的内容,不是吗?

它非常保密,因为它只用于将数据传递给AJAX请求,并使你不必自己在“多部分/表单数据”中编码数据,就像你定期提交表格一样。因此,您应该只在发送AJAX请求的最后一刻使用它,而不是将其传递给其他函数

如果您需要访问相同的数据,您可以传递一个简单的JS对象并编写一个简单的帮助程序,如:

function createFormData(myData) {
   // It could also take an existing form for some values from the user
   var formData = new FormData(/** FormElement form */);
   for  (var key in myData) {
      formData.append(key, myData[key]);
   }
   return formData;
}

sendMyInfo: function(params)
  // Add some data to the default params
  params.hash = this.S.Storage.get('h_token'));
  params.cacheBuster = (new Date()).valueOf();

  // Inspect it
  console.log(myData);

  // Wherever you actually need FormData, create it for that purpose only....
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "stash.php", true);
  oReq.send(createFormData(myData));
};

它只用于使用XHRs发送数据,似乎它应该有一种方法来检查它,但没有。。。所以解决办法是。。。除了发送XHR之外,不要使用
FormData
进行任何操作,在创建
FormData
实例之前,请检查任何值。是的,它是基于键的,所以为什么我不能使用
对其进行循环,因为在
中有没有快速检查可枚举属性的方法?因为它是私有实现的,他们不想让你进入内部,你试图用它做一些不想做的事情…我想检查它,而不是修改它,这没什么错,只是我做不到。你在抱怨一些你做不到的事情。愿你学会接受你不能改变的东西:)我建议了一种解决方法,不要到处传递
FormData
见我的答案属性应该是可枚举和可读的。确切地说,如果我填充它,我应该可以随时读取它。您必须对myData的内容进行表单编码,API并没有说您可以将普通对象传递给
FormData
。我认为关键是您应该只使用FormData将数据传递给
XHR.send()
function createFormData(myData) {
   // It could also take an existing form for some values from the user
   var formData = new FormData(/** FormElement form */);
   for  (var key in myData) {
      formData.append(key, myData[key]);
   }
   return formData;
}

sendMyInfo: function(params)
  // Add some data to the default params
  params.hash = this.S.Storage.get('h_token'));
  params.cacheBuster = (new Date()).valueOf();

  // Inspect it
  console.log(myData);

  // Wherever you actually need FormData, create it for that purpose only....
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "stash.php", true);
  oReq.send(createFormData(myData));
};