【问题标题】:JavaScript - Is it okay to define a property of a previously declared object during a variable declaration?JavaScript - 可以在变量声明期间定义先前声明的对象的属性吗?
【发布时间】:2019-06-16 00:12:20
【问题描述】:

滥用赋值运算符的 RTL 关联性以便定义两个变量(第一个是对象)以便将第二个分配给(新)该对象的命名属性,它本身被分配给另一个值,因此不会生成 SyntaxError()?

我知道这听起来很复杂,但这里是代码:

var x = {}, y = x.l = 9; // generates no errors
console.log(x.l, y); // 9 9

自:

var t = {}, t.l = 9; // Syntax Error, no doubt because t is already defined

【问题讨论】:

  • 将逗号更改为分号并阅读 comma operator 在 javascript 中的工作原理
  • 这毫无意义。如果您正在创建一个对象字面量并且您知道将存在一个属性,请在原始分配中进行:var t = { l: 9 };
  • 字母数:var x = {}, y = x.l = x.k = x.z = null 而不是var x = {l : null, k: null, z: null}, y = x.l。当然这不是一个巨大的差异,但是在编写复杂的代码时,了解前一种方法是否是有效的 JS 会很有帮助。
  • 注释中的代码没有问题,但也与有语法错误的代码不同。再次阅读逗号运算符的工作原理

标签: javascript object properties variable-declaration


【解决方案1】:

行:

var x = {}, y = x.l = 9;

实际上变成:

var x = {};
var y = x.l = 9;

处理为:

// Parse phase
var x; // assigned the value undefined
var y; // assigned the value undefined

// Execution phase
x = {};
x.l = 9;
y = x.l;

注意在赋值表达式中,右边的值被赋值给左边的表达式。复合赋值是求值从左到右,但赋值是从右到左,因此x.l = 9y = x.l之前赋值,即使它在右边。

现在试试第二个例子:

var t = {}, t.l = 9;

变成:

// Parse phase
var t;   // assigned the value undefined
var t.l; // syntax error, stop

语句开头的 var 关键字意味着接下来的内容必须是有效的标识符。 t.l 不是一个有效的标识符(它只能被解释为一个标识符后跟一个点属性访问器),就是这样。一切都停止了。

【讨论】:

    【解决方案2】:

    您需要使用分号 - 这就是解析器所期望的错误:

    var t = {}; 
    t.l = 9;
    console.log(t);

    【讨论】:

    • 这仍然毫无意义。
    • @RandyCasburn 是什么意思?
    • 如果 OP 知道属性和值,将对象文字作为单个赋值写入是解决此问题的正确方法。
    • @RandyCasburn——这只是一个例子,问题更多的是为什么一种情况会返回语法错误而另一种则不会。
    • 当然@Rob - 我明白了。我想在学术观点的世界里,探索从业者不会做的事情是有意义的。然后解释如何做各地从业者不做的事情——而不是说一开始就这样做没有意义。回想起来,我想我并没有真正明白这只是一个语法错误。在我看来,这是一个思路错误。因此我们的意见分歧。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多