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. c# - 数据类型 text 和 varchar 在 C# 中的等于运算符中不兼容 - 2

    我正在尝试从employeeTable访问数据empname,但我编写的代码出现以下错误:Thedatatypestextandvarcharareincompatibleintheequaltooperator.请提出解决方案privatevoidcomboBox1_SelectedIndexChanged(objectsender,EventArgse){stringConnection="DataSource=(local);Initialcatalog=Test;IntegratedSecurity=true";stringQuery="SELECT*F

  2. c# - 使用三元运算符进行多项操作 - 2

    如何使用三元?:执行多个操作的条件,如果表达式为真/假?wbsource=(exp)?(做一件事):(做第二件事)wbsource=(exp)?(做一件事)(做第二件事):(做第二件事)例如:为什么我不能在之间执行三个操作?和:filename=(fp!=null)?fp;Properties.Settings.Default.filename=fp;Properties.Settings.Default.Save;:Properties.Settings.Default.file;对于简单的if条件,我会以如下简单的方式编写:if(fp!null){filename=fp;Prope

  3. c# - 枚举和减法运算符 - 2

    有谁知道(也许:从什么时候开始)-=运算符在enum值上受支持?今天我正在愉快地编码,因为某种原因,我写了这个来从标志enum中排除一个值:flags-=FlagsEnum.Value1;在重新阅读和评估我的代码后,我很惊讶它编译后确实有效。将语句写成flags=flags-FlagsEnum.Value1但是不编译。到目前为止,我在文档和互联网上找不到任何内容。此外,不支持其他运算符(当然除了位运算符):+=(包括标志)、*=(Pascal中的交集)工作。这是C#编译器内置的语法糖吗?如果是这样,他们选择不包括其他运营商的原因是什么?一个简单的代码示例:usingSystem;usi

  4. c# - 如何在 XAML 中使用数学运算 - 2

    我想在XAML代码中使用数学运算,但不知道如何操作? 最佳答案 你的意思是你想在xaml中进行算术运算?查看thispost(它带有一个示例项目)它允许您指定这样的代码:<TextBlockHeight="{BindingElementName=tb1,Path=ActualHeight,Converter={StaticResourceJScript},ConverterParameter=Int32.Parse(values[0])/10*100-110}"Background="Red"/

  5. c# - 如何让 Null Coalesce 运算符在 ASP.NET MVC Razor 中工作? - 2

    我有以下内容,但它因NullReferenceException而失败:<td>@item.FundPerformance.Where(xx=>fund.Id==xx.Id).FirstOrDefault().OneMonth??-</td>OneMonth定义为publicvirtualdecimal?OneMonth{get;set;}失败时它的值为空。我认为NullCoalesce运算符会测试它是否为null,如果是,则返回运算符右侧的值?我需要更改什么才能使其正常工作? 最佳答案 如您所写,ra

  6. c# - 如果参数值为 null,则传递字符串 - 2

    我需要在一个函数中传递多个参数。我的要求是参数值不能为NULL。如果参数为NULL,改为传递“TBD”。例如getBookInfo(stringbookId,stringbookName,stringbookAuthor)//ifanyoftheparametersisNULL,pass"TBD"stringinparameter我该怎么做?我可以使用三元运算符来做到这一点吗?如果可以,怎么做? 最佳答案 在调用您的方法时尝试这样做:getBookInfo(bookId??"TBD",bookName

  7. c# - 使用条件运算符时没有隐式转换 - 2

    这个问题在这里已经有了答案:Nullabletypesandtheternaryoperator:whyis`?10:null`forbidden?[duplicate](9个回答)关闭9年前。我有以下类(class):abstractclassAClass{}classFoo:AClass{}classBar:AClass{}当我尝试使用它们时:AClassmyInstance;myInstance=true?newFoo():newBar();这段代码不会编译,因为“无法确定条件表达式的类型,因为‘CSharpTest.Class1.Foo’和‘CSharpTest.Class1.

  8. C# 静态类和 is 运算符 - 2

    最近重构了一些代码,其中涉及一些类重命名,我的一些代码以令人惊讶的方式崩溃了。原因是“is”运算符测试失败,我很惊讶这不是编译器错误或警告。这个完整的程序展示了这种情况:staticclassExtensionMethods{}classProgram{staticvoidMain(){Test("Test");}publicstaticboolTest(objectobj){returnobjisExtensionMethods;}}鉴于ExtensionMethods是一个静态类,我原以为“objisExtensionMethods”会引发某种警告。当被测对象永远不

  9. c# - 为什么空合并运算符 (??) 在这种情况下不起作用? - 2

    当我运行此代码时,我遇到了意外的NullReferenceException,省略了fileSystemHelper参数(因此将其默认为null):publicclassGitLog{FileSystemHelperfileSystem;///<summary>///Initializesanewinstanceofthe<seecref="GitLog"/>class.///</summary>///<paramname="pathToWorkingCopy">ThepathtoaGitworkingco

  10. c# - is-operator 的最佳用法是什么 - 2

    is运算符的好的用法是什么?下面的转换构造不是推荐的方法,几乎​​所有文档都更喜欢带有null检查的as-operator。if(objisSomeClass){SomeClasssome=(SomeClass)obj;....}当然这是一个(非常小的)性能提升,有些甚至提到了胎面安全性。是的,这是真的......那么,为什么我们要有is运算符?“带有空检查的运算符(operator)”在哪里不起作用或不是可行的方法?使用is运算符限制声明的范围是否有优势? 最佳答案 as不适用于不可为null的struct:objecto=123

随机推荐

  1. c# - checked 和 unchecked 有什么区别? - 2

    有什么区别checked(a+b)和unchecked(a+b)? 最佳答案 这些运算符会检查(或不检查)结果数值运算中的溢出。在checked情况下,如果操作结果超过数据类型允许的最小值或最大值,则会引发OverflowException异常。更多信息可从MSDN获得. 关于c#-checked和unchecked有什么区别?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/37

  2. c# - 为什么 BinaryWriter 会在流的开头添加乱码?你如何避免它? - 2

    我正在调试将对象的片段写入文件的一些问题,我已经开始处理打开文件并在其中写入“TEST”的基本情况。我正在通过类似的方式做到这一点:staticFileStreamfs;staticBinaryWriterw;fs=newFileStream(filename,FileMode.Create);w=newBinaryWriter(fs);w.Write("test");w.Close();fs.Close();不幸的是,这最终会在文件前面添加一个框,它看起来像这样:测试,前面有一个有趣的盒子。为什么会这样,我该如何避免?编辑:它似乎没有在这里显示框,但它是看起来像乱码的

  3. c# - 将 linq 查询转换为字符串数组 - C# - 2

    将单列linq查询转换为字符串数组的最有效方法是什么?privatestring[]WordList(){DataContextdb=newDataContext();varlist=fromxindb.Wordsorderbyx.Wordascendingselectnew{x.Word};//returnstringarrayhere}注意-x.Word是一个字符串 最佳答案 我更喜欢lambda风格,你真的应该处理你的数据上下文。privatestring[]WordList(){using(DataContextdb=new

  4. c# - 什么构成了应用程序控制台或 Windows 窗体应用程序? - 2

    [VisualStudio2008]我为控制台应用程序创建了一个新项目并将其修改为如下所示:classProgram{staticvoidMain(string[]args){Thread.Sleep(2000);}}然后我为Windows窗体应用程序创建了另一个项目并修改了它:staticclassProgram{//[STAThread]commentedthislinestaticvoidMain(string[]args){//Addedargs//Commentedfollowinglines//Application.EnableVisualStyles();//Appli

  5. c# - 如何保护dll? - 2

    如何保护我的项目的dll,使其不能被其他人引用和使用?谢谢 最佳答案 简短的回答是,除了显而易见的事情之外,您无能为力。您可能想要考虑的显而易见的事情(大致按照难度递增和合理性递减的顺序)包括:静态链接,因此没有可攻击的DLL。去除所有符号。使用.DEF文件和导入库只进行匿名导出,仅通过其导出ID知道。将DLL保存在资源中并仅在运行时将其公开在文件系统中(以适当的模糊名称,甚至可能在运行时生成)。将所有真实函数隐藏在一个工厂方法后面,该方法将secret(更好的是secret知识证明)交换为指向真实方法的函数指针表。使用从恶意软件领

  6. C# 为什么定时器频率非常低? - 2

    System.Timers.Timer和System.Threading.Timer的触发时间间隔与请求的时间间隔有很大不同。例如:newSystem.Timers.Timer(1000d/20);生成每秒触发16次而不是20次的计时器。为了确保太长的事件处理程序不会产生副作用,我编写了这个小测试程序:int[]frequencies={5,10,15,20,30,50,75,100,200,500};//TestSystem.Timers.Timerforeach(intfrequencyinfrequencies){intcount=0;//InitializetimerSyste

  7. c# - 从 UWP XAML 中的 HyperlinkBut​​ton 中删除下划线 - 2

    我需要删除HyperLinkBut​​ton内容中的下划线。TextDecorations在此XAML元素中不存在。<HyperlinkButtonx:Name="BtnTeste"Width="100"Height="50"BorderThickness="1"HorizontalAlignment="Center"Foreground="Black"Background="#ffffff"NavigateUri="www.google.com"Con

  8. c# - 无法加载文件或程序集 'Xceed.Wpf.Toolkit - 2

    我正在为另一个应用程序AutodeskRevit开发一个插件,它是作为一个单独的DLL类库构建的。我正在尝试使用WpfToolKitPropertygrid在我的一个WPF窗口中。属性网格在VisualStudio中显示良好,智能感知也能正常工作。但是,当我尝试在加载加载项的情况下启动Revit时,出现以下异常。System.Windows.Markup.XamlParseExceptionoccurredHResult=-2146233087Message=Couldnotloadfileorassembly'Xceed.Wpf.Toolkit,PublicKeyToken=

  9. c# - 如何创建元组数组? - 2

    我知道要在C#中创建元组,我们使用以下格式:Tuple<int,int>from=newTuple<int,int>(50,350);Tuple<int,int>to=newTuple<int,int>(50,650);其中每个元组是一个坐标对。我正在尝试使用元组创建多个坐标对的数组。有人可以帮我解决这个问题吗?编辑:这是我到目前为止所尝试过的。我希望它只采用这种数组格式。Tuple<int,int>[]coords=newTuple<int,int>({50,350},{50,650},{450,650});编译

  10. c# - 将分部 View 转换为 HTML - 2

    这个问题在这里已经有了答案:MVCReturnPartialViewasJSON(3个答案)关闭9年前。我只是想知道是否可以转换PartialView("_Product",model)到html以便我们可以用JSON将其发回?returnJson(result,JsonRequestBehavior.AllowGet);