Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象(字符串或数组)名称。如何得到它?_Javascript_Arrays_Prototype_Object - Fatal编程技术网

Javascript 对象(字符串或数组)名称。如何得到它?

Javascript 对象(字符串或数组)名称。如何得到它?,javascript,arrays,prototype,object,Javascript,Arrays,Prototype,Object,我需要一个这样做的原型: Array.prototype.getname=function(){ [...]return arrayname; } 因此,我可以: z=new Array; alert(z.name); 我应该在警报中有“z” 我正在使用Chrome,呼叫者/被呼叫者似乎返回为空。无法完成。无法访问存储对象引用的变量的名称。也许您应该解释为什么需要这样的行为,以便有人可以建议您解决问题的另一种方法。最好的方法是在创建阵列时始终显式设置其名称: var z = []; z.na

我需要一个这样做的原型:

Array.prototype.getname=function(){ [...]return arrayname; }
因此,我可以:

z=new Array;
alert(z.name);
我应该在警报中有“z”


我正在使用Chrome,呼叫者/被呼叫者似乎返回为空。

无法完成。无法访问存储对象引用的变量的名称。也许您应该解释为什么需要这样的行为,以便有人可以建议您解决问题的另一种方法。

最好的方法是在创建阵列时始终显式设置其名称:

var z = [];
z.name = 'z';
您可以使用函数makeArray来设置作为参数传递的名称:

function makeArray(name) {
    var arr = [];
    arr.name = name;
    return arr;
}
基本问题是,几个变量可以指向同一个数组:

var z = [],
    x = z;

那么名称应该是什么:z还是x?

问题是一个变量(如数组)可以有多个名称。例如:

var a = new Array();
var b = a;
a[0] = "hello";
alert(b[0]);//"hello"

数组的名称是什么,a还是b?

唯一的方法是强制检查全局对象的所有属性(假设变量是全局的),直到找到===数组的属性为止。当然,它可以被多个变量引用,因此您必须选择一个您得到的名称。此实现获取引用数组的第一个变量,并将在浏览器和web工作线程中工作:

Array.prototype.getName = function () {
  var prop;
  for (prop in self) {
    if (Object.prototype.hasOwnProperty.call(self, prop) && self[prop] === this) {
      return prop;
    }
  }
  return ""; // no name found
};

当然,我一点也不推荐这个。不要这样做。

所以现在最好的答案是以利亚的

更一般地说:

Object.prototype.getName = function () { 
  var prop; 
  for (prop in self) {
     if (Object.prototype.hasOwnProperty.call(self, prop) && self[prop] === this && self[prop].constructor == this.constructor) { 
       return prop; 
     } 
  } 
  return ""; // no name found 
};

我想知道是否有更好的解决方案。

进一步测试object.getName()。。我发现了这个“问题”:

test1='test'
test
test2='test'
test
test1.getName()
test1
test2.getName()
test1
发生这种情况是因为它们具有相同的内容,并且getName检查内容。 在这种情况下,一个解决方案可能是返回一个数组


但我仍在寻找解决这个脑筋急转弯问题的最终方法。

你为什么需要这些信息?你做错了。将数组分配给的变量的名称应该完全无关。如果不是,你应该重新考虑你的代码。多么没用的评论啊。就说你没有阅读所有的讨论,你不理解这个问题。我想添加一个原型,将字符串或数组(字符串化)保存到loalStorage。显然,我可以创建一个愚蠢的函数,例如:
function save(s,name){localStorage[name]=s;}(对于字符串),但最好这样做:var mystring=“这是一个蹩脚的字符串”;mystring.save();还有localStorage.mystring==“这是一个蹩脚的字符串”
谢谢,但这改变了问题。我的问题需要一个答案。仅仅因为你可以问,并不意味着这是一个明智的问题。