我有一个很愚蠢但令人困惑的问题。 我们如何获得一个存在的数组或对象的名称?
例如:
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"
答案 0 :(得分:3)
您不能实际上完成您在Javascript中尝试执行的操作,但是有一个小技巧,您可以使用它来直接记录对象的名称而无需 输入。它不是特别有用,并且如果您试图获取函数参数的原始名称,则不会真正起作用,但是您可以这样做:
console.log(Object.keys({thisObject})[0]);
// "thisObject"
正如我所说,它不是特别有用,但是如果您能做得更好,我会感到震惊。
答案 1 :(得分:1)
您可以使用window
对象访问thisObject
和thisArray
像这样-
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
如果我询问该对象的名称,它应该返回a
,b
还是两者都返回?现在呢:
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属性,并改用它。