通过Javascript获取数组或对象的名称

时间:2018-06-23 21:27:16

标签: javascript arrays object

我有一个很愚蠢但令人困惑的问题。 我们如何获得一个存在的数组或对象的名称?

例如:

thisObject={ first:1, second:2};
thisArray=[1,2,3,4]

我想获取字符串“ thisObject”,“ thisArray”。

我们如何得到它?

非常感谢。


编辑:

更具体。我想做这样的事情:console.log(someFunction(thisObject))

然后返回

"thisObject"


Edited-2:

const firstArray=[1,2,3] 
const secondArray=["a","b"] 
const render=(arr)=>arr.map(arrr=>console.log(Object.keys({arr})[0]))
render(firstArray)
render(secondArray)

它将返回

"arr" "arr" 

代替

"firstArray" "secondArray"

3 个答案:

答案 0 :(得分:3)

您不能实际上完成您在Javascript中尝试执行的操作,但是有一个小技巧,您可以使用它来直接记录对象的名称而无需 输入。它不是特别有用,并且如果您试图获取函数参数的原始名称,则不会真正起作用,但是您可以这样做:

console.log(Object.keys({thisObject})[0]);
// "thisObject"

正如我所说,它不是特别有用,但是如果您能做得更好,我会感到震惊。

答案 1 :(得分:1)

您可以使用window对象访问thisObjectthisArray

像这样-

var thisObject={ first:1, second:2};
var thisArray=[1,2,3,4]

console.log(window.hasOwnProperty("thisObject"));
console.log(window.hasOwnProperty("thisArray"));

console.log(window.thisObject);
console.log(window["thisArray"]);

答案 2 :(得分:0)

在javascript中,变量引用对象,但是对象本身未命名。因此,给定一个对象,就不能真正要求它的名称。这没有意义。当您考虑如何在javascript中传递引用时,您会意识到一般情况下尝试执行的问题有多大。例如,考虑一下:

var a = {first_name: "Mark"};
var b = a;
// a and b both point to the same object

如果我询问该对象的名称,它应该返回ab还是两者都返回?现在呢:

var a = {first_name: "Mark"};
var b = a;
a = undefined;

当您考虑到同一对象可以由不同作用域和模块中的名称引用时,这甚至更加复杂。例如:

var a = {first_name: "Mark"};
function test(obj) {
   var t = obj;
   getNames(obj) // <-- what should that return? a? obj? t? all of them?
}

给定一个特定的作用域,您可以遍历名称并找到与您的对象相同的名称,但这将是脆弱的并且可能效率低下。 >

var a = {first_name: "Mark"}
var b = a
var c = {foo: "bar"}

function getNames(obj, scope) {
  for (name in scope){
    try {
      if (scope[name] === obj) console.log(name)
    } catch(e){continue} // avoid localStorage security error
  }
 }
 
 getNames(b, this) // should log 'a' and 'b' because both are in global scope

但是上述代码并没有真正为您提供对象的名称,它只是查看特定对象(在本例中为全局对象)中的每个名称,并查看哪个对象的属性指向有问题的对象。

当然,并不是所有作用域中的对象都具有名称。例如:

let arr = [{foo: "bar"}, {foo: "baz"}]
getNames(arr[0]) // <-- what should that return?

如果对象的名称很重要并且要显示它,则应向该对象添加一个name属性,并改用它。