Javascript x不';t在运输途中工作。js
我正在使用,我有以下代码行:Javascript x不';t在运输途中工作。js,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我正在使用,我有以下代码行: var axis = Math.floor(Math.random() * 2); axis = genXY(axis); if($(this).hasClass(btn_className)) { $(this).transition({ axis : '100px' } , function(){ $(this).addClass('active'); $(this).transition({ axis :
var axis = Math.floor(Math.random() * 2);
axis = genXY(axis);
if($(this).hasClass(btn_className)) {
$(this).transition({ axis : '100px' } , function(){
$(this).addClass('active');
$(this).transition({ axis : 0 , duration : 2000 });
})
}
genXY函数如下所示:
var xy = ['x' , 'y'];
function genXY(no) {
return xy[no];
}
现在,我在单个元素上运行了以下简单测试(在我的devTools中):
上述代码行工作正常,即它通过100px
,但是现在如果我用axis替换x,它实际上是一个变量,实际上是x,现在代码如下所示:
var axis = x;
$('.gridbox .large').eq(2).transition({ axis : "100px" });
上面这行不行。为什么它现在起作用了?毕竟轴本身就是x,有人能解释吗 实际上,您正在为一个对象放置一个键,而这样做是不可能的:
var axis = x;
$('.gridbox .large').eq(2)
.transition({ axis : "100px" }); // <----see the object { axis : "100px" }
这两行的意思相同(引号是可选的): 因此,在下面的一行中,您并没有真正使用变量,而是定义了一个属性名
x
$('.gridbox .large').eq(2).transition({ x : "100px" });
obj.axis = '100px';
要解决这个问题,可以定义一个空对象并向其添加动态属性名,然后将该对象作为参数传递
var axis = 'x';
var obj = {};
obj[ axis ] = '100px';
$('.gridbox .large').eq(2).transition(obj);
还要注意,必须使用[]
语法来添加变量(动态)属性名,而不是点语法。以下示例将添加名为axis
的属性,而不是x
$('.gridbox .large').eq(2).transition({ x : "100px" });
obj.axis = '100px';
ECMAScript是JavaScript实现的语言的规范 如果查看的“11.1.5对象初始化器”部分,它定义了用于创建对象的对象文字语法 让我们看看如何根据规范评估
{axis:“100px”}
:
ObjectLiteral=>{PropertyName和ValueList}=>{PropertyName:AssignmentExpression}
=>{IdentifierName:AssignmentExpression}
对于IdentifierName,它声明:“返回包含与IdentifierName相同字符序列的字符串值”。换句话说,{axis:“100px”}
与{axis:“100px”}
相同,这与{x:“100px”}
和{x:“100px”}
不同。换句话说,对象文字中未加引号的属性名将成为名称的字符串版本,而不是变量值。这就是为什么不能用{axis:“100px”}
替换{axis:“100px”}
,因为它们不相同
建议您使用以下代码:
var axis = "x";
var obj = {};
obj[ axis ] = "100px";
这是为了使用“axis”的变量值,因为
obj[axis]=“100px”
与obj[“x”]=“100px”
相同,这与{x:“100px”}
和{x:“100px”}非常感谢您的解释,但我还是不明白,你能把它分解一下吗?我的意思是这一部分如果您尝试在对象文本中放置一个var名称来代替key,它并不引用它的值,而是在对象中设置一个新的key:value。在ES5及更早版本中,不能在对象文本中使用变量作为属性名。
@Jaiaxis=x代码中的code>应该是axis='x'
@DaveF您是对的,但这可能是另一个变量,它引用了其他一些值,但肯定必须是“x”
var axis=x代码中的代码>计算结果为var axis=undefined
。我相信您的意思是键入var axis=“x”代码>。这与为什么不能使用{axis:“100px”}
替换{x:“100px”}
无关,但我想提及它以帮助以后进行调试。
var axis = "x";
var obj = {};
obj[ axis ] = "100px";