【问题标题】:What is the intention/idea behind having the assignment operation in JavaScript return the value assigned? [closed]让 JavaScript 中的赋值操作返回所分配的值的意图/想法是什么? [关闭]
【发布时间】:2013-05-24 17:24:22
【问题描述】:
var foo, bar;
if (foo = true) {
    console.log('I am so true!');
}

if (bar = false) {
    console.log('Why am I not being logged?');
}

当我这样做时,也在 JavaScript 控制台上

var test;
test = 'I will be printed'

字符串将被打印/返回。

在 JavaScript 中,赋值操作返回分配的值。这种行为是根据 ECMAScript 标准还是只是实现?这种行为与c 等其他语言不同,这背后有什么意图吗?如果是,是什么?

【问题讨论】:

  • @harsha 问题是“赋值运算符返回什么”。不是“比较运算符返回什么。”
  • @0xc0de 您是否真的尝试过自己进行控制台记录以查看返回的内容?
  • @Zenith:是的,也许我应该编辑问题以删除“什么”并只保留“为什么”部分,这正是我想问的。
  • “为什么”问题的问题在于,只有设计 JS 的人才能够真正回答这个问题:Brendan Eich。

标签: javascript return-value assignment-operator


【解决方案1】:

在 JavaScript 中,赋值操作返回什么?

分配的值,即表达式的右侧。

上述行为是符合 ECMAScript 标准还是只是实现?

定义在§11.13.1 in the specification:

产生式 AssignmentExpression : LeftHandSideExpression = AssignmentExpression 评估如下:

    1. 让 lref 为评估 LeftHandSideExpression 的结果。

    2. 让 rref 为评估 AssignmentExpression 的结果。

    3. 让 rvalGetValue(rref)

    [...]

    6. 返回 rval


为什么这种行为与 c 等其他语言不同,这背后有什么意图吗?

我不知道它在 C 中是怎样的,但如果您询问有关某些设计决策的原因,您应该联系 JavaScript 的创建者 Brendan Eich。

FWIW,您可以在其他语言中找到相同的行为,例如 PHP 和 Python(这些是我确定的,我认为Java 也以相同的方式工作)。

【讨论】:

  • 不知道为什么这种语言是这样的,但是这个特殊的特性经常被利用,例如while (x = a[i++]) { /* do stuff with x */}.
  • 可靠的答案,引用规范总是很好 :) @0xc0de 对于它的价值,C 规范声明“赋值表达式在赋值后具有左操作数的值”在“§6.5 .16 赋值运算符”。所以这种行为在 C 以及 Java、Python 和 PHP 中都是一致的。 C-Spec
【解决方案2】:

支持 Felix 答案的代码:

if (foo = false) {
    console.log('I am so true!');//won't print
}
if (foo = 0) {
    console.log('I am so true!');//won't print
}
if (foo = undefined) {
    console.log('I am so true!');//won't print
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 2023-03-04
    • 1970-01-01
    • 2023-04-03
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多