Javascript 如何将数组用作属性名?

Javascript 如何将数组用作属性名?,javascript,Javascript,这段代码是如何工作的 if (!(args in pad)) { pad[args] = self.apply(obj, arguments); } args是数组,但它不应该是字符串,因为它是JS对象的键吗? 如何检查工作对象中的数组 完整背景: Function.prototype.memoize=Function(){ var pad={}; var self=这个; var obj=arguments.length>0?参数[i]:null; var memoizedFn=函数

这段代码是如何工作的

if (!(args in pad)) {
    pad[args] = self.apply(obj, arguments);
}
args是数组,但它不应该是字符串,因为它是JS对象的键吗? 如何检查工作<代码>对象中的数组

完整背景:

Function.prototype.memoize=Function(){
var pad={};
var self=这个;
var obj=arguments.length>0?参数[i]:null;
var memoizedFn=函数(){
//将arguments对象复制到数组中:允许将其用作
//缓存密钥。
var args=[];
for(var i=0;i
args被转换为字符串,对于数组,该字符串表示:

[1,2,3].toString() == "1,2,3"; //true
在中的
中使用时,它会自动转换为字符串:

( [1,2,3] in ( {"1,2,3":""} ) ) //true
这是因为
中的
运算符只接受左侧的字符串


使用
pad[args]
时,同样的转换再次发生,因为对象键只能是字符串。例如,当您使用
array[1]
时,实际发生的是
array[“1”]
,因为数字被转换为字符串

这应该会把事情弄清楚:

var a = [1,2,3]
var s = "" + a
var x = {}
x[a] = "hello world"
alert(s in x)
也就是说,属性名称始终是字符串,并根据需要转换为字符串。(请注意,“裸”对象通常不会用作属性名称,因为它们缺少适当的字符串,但有关如何使用
toString/valueOf
的信息,请参见下文。)

发现像这样的“简单”东西真的很麻烦——这是我所知道的最复杂的语言规范——但它可以归结为接受属性名(作为表达式)的各种产品

参见第11.2.1节:属性访问器

生产MemberExpression:MemberExpression[Expression]的计算如下:

[…]6。让propertyNameString为ToString(propertyNameValue)。 [...] 8. 返回引用名称为的值[…] propertyNameString[…]

和第11.8.7节:in操作员

ShiftExpression中的production RelationalExpression:RelationalExpression[aka propertyNameValue]的计算如下:

[…]6。返回调用带有参数的rval的[[HasProperty]]内部方法ToString(lval[aka propertyNameValue])的结果

现在,出现以下链来确定
ToString(propertyNameValue)
的结果(请参考规范了解所有小细节):

  • ToString
    ,第9.8节
  • TopPrimitive
    ,第9.1节
  • (对于对象)
    [[DefaultValue]]
    (带有“字符串”提示),第8.12.8节
  • (对于对象)toString()或valueOf()的结果(第一个可调用的)
  • 同样的
    ToString
    过程适用于所有属性访问——无论是
    obj[prop]
    还是
    obj.HasOwnProperty(prop)
    还是
    obj中的prop


    快乐编码。

    但它在哪里铸造?当我使用pad[args]时,JS解释器是否会在默认情况下自动尝试将任何args类型转换为字符串?非常感谢!!请您解释一下这一行:var obj=arguments.length>0?参数[i]:空;我指的是什么?我看不到循环..这意味着当
    arguments.length>0
    时函数将不工作,因为
    I
    不是范围内的已知变量,它将抛出
    ReferenceError
    。但是,如果此函数起作用,情况会更糟;)妮特:没有演员阵容了。表达式被强制(或转换)为字符串。强制转换通常意味着“视图”更改,而“数据”(对象)不更改。
    var a = [1,2,3]
    var s = "" + a
    var x = {}
    x[a] = "hello world"
    alert(s in x)