gpt4 book ai didi

Javascript 三元运算符左值

转载 作者:可可西里 更新时间:2023-11-01 02:37:10 25 4
gpt4 key购买 nike

我正在阅读不同语言的三元运算符,并注意到 Javascript 部分中的一些有趣内容。 http://en.wikipedia.org/wiki/%3F:#JavaScript

The conditional operator in JavaScript has the same syntax and precedence structure as in the other BCPL-derived variants, but a significant difference exists in the semantics: it returns an l-value.

第一句话指出 javascript 中三元组的返回是一个左值,所以我尝试了一些示例,结果很奇怪(在 chrome 控制台中)。

给定:

var a = { 'yo' : 'momma' }
var b = { 'yo' : 'cool' }
var bool = true


(bool? a : b).yo = 'LLJ'
//a is now { 'yo' : 'LLJ' }

(bool? a.yo : b.yo) = 'LLJ' //throws a reference error

为什么第一个工作,第二个失败? (逻辑上它们是相同的语句,不是吗?)

最佳答案

不(似乎维基百科对“左值”的引用具有误导性)- 它返回参数的,而不是对它的引用; JavaScript 中的值不能直接分配给1

如果您刚刚执行了以下操作:

console.log(bool ? a.yo : b.yo);
// like doing the following:
'string' = 'eee';

...你会得到一个字符串 - 你不能分配给一个字符串值/文字。当传递到条件运算符时,所有属性引用都将转换为它们的值。

但是,对于一个对象,引用值是一个对象,并且由于对象的属性是一个引用,所以它工作正常。

console.log(bool ? a : b); // you get an object, it's fine

ECMAScript 规范(即 JavaScript 的标准版本)指出您无法从条件运算符获取引用(即左值):

11.12 Conditional Operator ( ? : )

  1. Let lref be the result of evaluating LogicalORExpression.
  2. If ToBoolean(GetValue(lref)) is true, then:
    • Let trueRef be the result of evaluating the first AssignmentExpression.
    • Return GetValue(trueRef).
  3. Else
    • Let falseRef be the result of evaluating the second AssignmentExpression.
    • Return GetValue(falseRef).

GetValue 是一个将引用转换为值的内部函数,因此这就是您获取值而不是预期的引用的原因。

1: ECMAScript 中的内部赋值方法不允许将非引用赋值给:

8.7.2 PutValue (V, W)

  1. If Type(V) is not Reference, throw a ReferenceError exception.
  2. ... (the rest is unimportant, my emphasis)

关于Javascript 三元运算符左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com