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)