Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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 安全地使用eval将变量用作对象名_Javascript_Arrays_Object_Eval - Fatal编程技术网

Javascript 安全地使用eval将变量用作对象名

Javascript 安全地使用eval将变量用作对象名,javascript,arrays,object,eval,Javascript,Arrays,Object,Eval,如本例所示 我使用eval来使用DOM属性从数组中选择元素。虽然用户无法直接更改输入,但我希望尽可能安全,并确保在计算变量之前,该变量确实是一个整数 以下哪一项是最好、最安全的方法 $(".listitem").click(function(){ var id = $(this).attr("record-id"); if(!isNaN(new Number(id))){ Storage.search.nearby.currec = rowsHolder[eva

如本例所示

我使用eval来使用DOM属性从数组中选择元素。虽然用户无法直接更改输入,但我希望尽可能安全,并确保在计算变量之前,该变量确实是一个整数

以下哪一项是最好、最安全的方法

$(".listitem").click(function(){
    var id = $(this).attr("record-id");
    if(!isNaN(new Number(id))){
        Storage.search.nearby.currec = rowsHolder[eval(id)];
    }else{
        // send email to admin, shut down
    }
});

更多信息,但非必需信息:

基本上,我是从网上下载一个大的JSON字符串,其中包含一个记录数组。在使用for语句(for(i in array))从info构建表时,我将每一行推入一个名为rowsHolder的数组,并给tr一个记录id=“i”的属性。然后,当用户单击该行时,我调用上面看到的方法。我正在JQuery Mobile上使用PhoneGap

一如既往,感谢您的投入


-D

这里绝对没有理由使用
eval

  • 如果您的
    id
    是一种数字,请使用
    parseFloat(id)
    获取它。不必要,因为当用作属性名时,它会转换回字符串
  • 如果您的
    id
    是一个整数,请使用
    parseInt(id,10)
    获取它。不必要,因为当用作属性名时,它会转换回字符串
  • 如果您的
    id
    是一个字符串,就让它成为一个字符串吧。您使用它的属性名无论如何都是一个

您为什么需要评估这些?如果出于某种奇怪的原因,您需要一个字符串作为对象键,请使用toString()。我不清楚
id
中会包含哪些类型的值。只是数字吗?还是变量名?或者长成员链,比如
obj.foo.bar.baz
?仅仅
rowsHolder[id]
有什么问题?@deceze-rowsHolder[id]给了我未定义的-我假设id不是变量,而是字面上的“id”,但是eval(id)给了我对象ineed@apsillers-id将包含数组键0、1、2。。。n尽管我无法调试以查看错误,但行Storage.search.currec.record=rowsHolder[parseInt(id)];中断脚本,使单击事件不会发生任何事情。Storage.search.currec.record=rowsHolder[eval(id)];很好,但我不得不使用eval的原因,在我看来,是因为——就像Bergi在上面说的那样——脚本认为我在尝试查找名为“id”的对象属性,而实际上我在尝试查找名为“0”或“3”的数组键(或对象属性)或变量中名为“id”的任何内容。如果变量
id
包含数字
0
或字符串
“0”
,它将工作并返回对象
{“id”:“00088”}
哦,你是Bergi-对不起,我没有看。你是对的,你的建议根本不需要使用eval。谢谢。是的,:-)那么给我们看更多的代码,也许是那些
.listitem
s的标记
$(".listitem").click(function(){
    var id = $(this).attr("record-id");
    if(parseInt(id)){
        Storage.search.nearby.currec = rowsHolder[eval(id)];
    }else{
        // send email to admin, shut down
    }
});