TECHTOGOU

Javascript 三元运算符左值

coder 2024-05-16 原文

我正在阅读不同语言的三元运算符,并注意到 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/

有关Javascript 三元运算符左值的更多相关文章

  1. javascript - 为什么这个按位运算在 Javascript 中失败 - 2

    有人在我得到的javascript中进行按位运算时请阐明这一点:65527|34359738368=>65527是否可以在javascript中处理这个问题?从mysql命令行:select65527|34359738368;+-------------------+|65527|34359738368|+-------------------+|34359803895|+-------------------+更重要的是它小于2^36select(65527|34359738368)<pow(2,36);+--------------------------------+|(6

  2. javascript - Typescript 使用 Rx.js 过滤器运算符区分联合类型? - 2

    typescript支持discriminatedunions.如何将与Rxjs相同的概念扩展到filter下面例子中的运算符?interfaceSquare{kind:'square';width:number;}interfaceCircle{kind:'circle';radius:number;}interfaceCenter{kind:'center';}typeShape=Square|Circle|Center;constobs$:Observable<Shape>=of<Shape>({kind:&

  3. javascript - 通过转译器在 Javascript 中实现运算符重载 - 2

    对于我们中的一些人来说,使用Javascript的问题之一是缺少运算符重载。这使得编写数字库变得很尴尬。例如,我们可能想写这样的东西:vara=newBigInteger(5);varb=newBigInteger(10);varc=a+b;一个可能的解决方案是将具有运算符重载的语言转换为Javascript。虽然可行——通过函数调用和类型检查替换运算符——但共识似乎是,如果不降低性能,这是不可能的。由于这个原因,CoffeeScript拒绝了这个想法:https://github.com/jashkenas/coffee-script/issues/846但是真的没有聪明的解决办法吗

  4. Javascript 运算符优先级技术细节 - 2

    我很难理解Javascript优先级第14组中求幂和其他所有内容(乘法、除法等)的组合的含义。Source-MDN三个问题:将从右到左和从左到右的结合性组合在一个组中是什么意思?如何根据这些规则改写表达式2**3*4,并仍然得到相同的答案?4*2**3有效...这是什么意思?这何时/如何不等同于给予指数更高优先级的看似简单的权宜之计? 最佳答案 1)2**3**4,从右到左结合,是2**(3**4)。2/3/4,从左到右结合,是(2/3)/4。2/3)我相信2**3*4是(2**3)*4。2*3**4是2*(3**4)(由es6fi

  5. javascript - 如何将带有比较运算符的箭头函数用于 reduce 方法? - 2

    将ESLint与Airbnb规则结合使用,我无法使用带有比较运算符的reduce方法。在下面的代码中,名为data的数组包含对象,每个对象都有一个名为id的属性。ESLint抛出的错误消息是:constmaxId=data.reduce((prev,current)=>{returnprev.id>current.id?prev.id:current.id;});ESLintError:arrow-body-style/Unexpectedblockstatementsurroundingarrowbody.constmaxId=data.reduce((prev,curr

  6. 函数返回数组上的 Javascript `new` 关键字 - 2

    我正在尝试使用new关键字,但找不到对此行为的解释。假设我们有一个返回整数的函数:(在Firebug中)>>>functionx(){return2;}>>>x()2>>>newx()x{}但是如果函数返回一个数组:>>>functiony(){return[2];}>>>y()[2]>>>newy()[2]这是为什么? 最佳答案 new运算符有一个有趣的行为:它返回由运算符创建的对象,除非构造函数返回一个不同的对象。构造函数

  7. javascript - Javascript 中的 >>>= 运算符是什么? - 2

    以下Javascript语句对a做了什么?a>>>=b; 最佳答案 它做同样的事情:a=a>>>b;除了a只被评估一次(如果它的评估涉及任何副作用,它会有明显的差异)。>>>是unsigned(logical)rightshift. 关于javascript-Javascript中的>>>=运算符是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  8. javascript - 三元运算符的单返回 - 2

    我想知道是否可以为单次返回编写三元运算符。我试过谷歌在线,但找不到答案。或者它不叫三元运算符??非常感谢您的建议。如果(A==1)execute_function();进入A==1?execute_function()//???可能吗??? 最佳答案 这是最短的路。A==1&&execute_function(); 关于javascript-三元运算符的单返回,我们在StackOverflow上找到一个类似的问题: https://stacko

  9. javascript - Javascript中是否有&逻辑运算符 - 2

    我想知道Javascript中是否有“&”逻辑运算符。我尝试在Firebug(Firefox)中运行1&0和1&&0,它都返回了0。有人告诉我C#接受&和double&&,double更有效,因为它会在遇到false时立即退出比较循环,但我找不到关于Javascript的任何信息。有什么想法吗? 最佳答案 没有。&是bitwiseAND运算符(operator)。&&是Javascript中唯一的逻辑AND运算符。 关于javascript-Javascript中是否有&逻辑运算

  10. JavaScript 错误,在 之后缺少名称。运算符(operator) - 2

    我正在尝试获取隐藏跨度的innerHTML。JavaScript来自iframeHTML页面,隐藏的跨度位于父页面中。当从父级访问列表的内容时,一个不同的函数起作用,但我似乎无法达到我的跨度......作品document.getElementById(parent.genL[i]);不起作用document.getElementById(parent."span"+i).innerHTML;-SyntaxError:missingnameafter.operator上面的代码行位于一个for循环中,当它遍历i时,它将从每个单独的跨度中获取数据。隐藏跨度从ID“span

随机推荐

  1. javascript - 使用angularjs改变 body 背景颜色 - 2

    我希望能够更改<body>的背景颜色取决于当前路径。我尝试通过在路径更改时检查$location.path()然后使用ng-style来做到这一点更改背景颜色的指令,但这似乎是一个hack(并且没有用)。实现此目标的分离度更高的方法是什么?如果有人想看的话,这是我写的代码。app.controller('backgroundCtrl',['$rootScope','$scope','$route','$location',function($rootScope,$scope,$route,$lo

  2. javascript - Javascript 对象类似于 SQL 'JOIN'? - 2

    对于表示为Javascript对象数组的表,SQL“JOIN”的实用模拟是什么?JavascriptArray.join和D3.js'd3.merge`不是同一个概念。例如SELECT*FROMauthorsLEFTJOINbooksONauthors.id=books.author_id?第一个表:varauthors=[{id:1,name:'adam'},{id:2,name:'bob'},{id:3,name:'charlie'},...]第二张表:varbooks=[{author_id:1,title:'Colorin

  3. javascript - 如何以 angularjs 形式添加数组大小验证规则? - 2

    我有一个表单,其中包含一些文本输入字段和存储在Controller$scope中的动态项目列表,以及一些用于添加/删除列表中项目的函数。我想使表单无效,直到项目列表达到预定义的长度。所以我创建了一个formRepeat指令,它带有一个ngModel属性,然后使用ngModelController使表单无效。http://plnkr.co/edit/jSFvak?p=preview这可行,但我认为这不是更好的方法,因为该指令不是很灵活。最简单的方法是使Controller中的表单无效,例如:$scope.myForm.$valid=false;但这行不通。有没有更好的办法?

  4. javascript - Javascript 中的字符串和字符数组有什么区别? - 2

    当我检查这两个是否相等时,它们显然不相等。谁能解释一下为什么?varstring="Hello";vararray=['H','e','l','l','o'];为什么(string===array)是false?编辑:这个网站很棒。这么快的帮助。谢谢大家。 最佳答案 Whyis(string===array)isfalse?您正在使用strictcomparison(===),它还会检查值的数据类型。显然,原始字符串值与对象的数据类型不同

  5. javascript - 为什么代码在 'return res.send();' 之后继续运行 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。关闭8年前。这个问题是由于打字错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这个问题的解决方式不太可能帮助future的读者。这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或includeaminimalexample在问题本身。Improvethisquestion我不明白为什么即使在return和res.send()被调用后代码仍继续运行。这是GIST帮助理解。更新:好吧,在社区的帮助下现在发现并理解问题是返回res.send();异步发生,

  6. javascript - _.once 在下划线中的作用是什么? - 2

    我只是看看underscore.js中的source的onceAPI,然后徘徊它是做什么用的在该方法中,它似乎什么也没做:func=null来源:_.once=function(func){varran=false,memo;returnfunction(){if(ran)returnmemo;ran=true;memo=func.apply(this,arguments);func=null;returnmemo;};}; 最佳答案 函数的作用可以在documentation中找到。:Createsaversionofthefun

  7. javascript - 在线时未呈现 Google 加号登录按钮 - 2

    我正在为我的新手机游戏开发一个社区网站,我正在尝试向其中添加googleplus登录流程。实现期间采取的步骤:->已关注this谷歌开发者教程HTML按钮代码:<spanid="signinButton"><spanclass="g-signin"data-callback="onSignInCompleted"data-clientid="<myID>.apps.googleusercontent.com"data-cookiepolicy="single_host_origin&#

  8. Javascript:从事件中获取元素 ID - 2

    如何获取作为(e)传递的元素的ID?window.addEventListener('load',function(){vartags=document.getElementsByClassName("tag");for(i=0;i<tags.length;i++){tags[i].addEventListener('mousedown',function(e){tagClick(e)},false);}},false);functiontagClick(e){/*hereI'mgonnaneedtheeventtocanc

  9. javascript - 未捕获的类型错误 : Cannot read property 'document' of undefined - 2

    我有以下功能,在我测试过的几台PC上运行良好。我已经在Chrome、IE和Firefox上测试过,没有任何问题。但是,有一台特定的PC(运行Chrome)在该行抛出此错误“UncaughtTypeError:Cannotreadproperty'document'ofundefined”:win.document.write(data);难道是因为win为null?如果是这样,为什么这台特定PC会出现这种情况?是否有一些Chrome设置需要设置?方法:functionviewReport(){console.info('generatingeventreport');v

  10. javascript - 将对象移向javascript中的一个点 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预期结果。另请参阅:StackOverflowquestionchecklist关闭9年前。Improvethisquestion我为此在数学上苦苦挣扎,我需要将一个物体均匀地移向一个点。我在x:500y:250处有一个点,在0,0处有一个对象。如果移动速度为“1”,我将如何计算出我需要以x:0.666和y:0.333的速率移动的那一点。y速度是x速度的一半。我确定我在这里只是个白痴。