JavaScript是否有l值和r值的概念?

JavaScript是否有l值和r值的概念?,javascript,expression,ecmascript-5,referenceerror,Javascript,Expression,Ecmascript 5,Referenceerror,在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError。比如说, // 'this' on the left side this = window; // ReferenceError: Invalid left-hand side in assignment 或 或 我的问题是: JavaScript是否也有l值和r值作为C的概念 为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的例子中,既然a===fn(),那么a=5和fn()=5之间

在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError。比如说,

// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment

我的问题是:

  • JavaScript是否也有l值和r值作为C的概念

  • 为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的例子中,既然
    a===fn()
    ,那么
    a=5
    fn()=5
    之间有什么区别呢。我知道ES5规范规定了这一点,但为什么它设计成这样呢


  • 如果在调用函数之前将对象分配给
    a
    ,则
    f()
    可以计算为引用的事实不会改变
    f()
    是表达式的事实(例如,与
    1+a
    相同)。和赋值只能应用于变量

    同样,在JavaScript语言的世界观中,“
    这是(必然的…)神圣不可侵犯的。”

    变量的用途以及当前值必须受到保护,以防程序任意修改

    同样,“你不能简单地说‘一个函数’,不管它是什么,’等于‘5’。”(很明显,其中一个是‘函数’,另一个是‘整型常数’,因此,“两者永远不会相遇。”)

    JavaScript解释器与地球上所有其他语言解释器一样,是使用所有其他发明的语言所采用的相同语言实现策略(和工具…)设计和构建的。

    根据,以下表达式不能作为任务的目标:

    这个
    字面意义的
    阵列侧
    ObjectLiteral
    函数表达式
    类表达式
    生成表达式
    正则表达式文字
    模板实验室
    
    例如,以下分配也无效:

    this=“bar”//这
    “foo”=“bar”;//字面意义的
    /foo/=“bar”;//正则表达式文字
    [“foo”]=“bar”//阵列侧
    
    fn()
    是一个表达式而不是变量引用,您不能为它赋值。但是求值顺序是从左到右,如果先求值
    fn()
    ,它将返回
    a
    ,因为
    fn()==a
    。而
    a
    是一个变量,可以存储值。它返回a的值,而不是对变量a的引用
    a===fn()
    并不意味着它们是同一个内存位置,如果是的话,它将具有相同的语义。。。所以,表达式的赋值是没有意义的。嗨,帕特里克·埃文斯,你能详细解释一下答案吗?嗨,基里尔,谢谢你的回答<代码>和赋值只能应用于变量。
    我认为这不准确。您完全可以将赋值应用于对象属性和数组元素,除了变量。.@leslie.zhang实际上,对象属性和数组元素可以被视为变量引用,因此可以用于赋值。
    // function call expression on the left side
    var a;
    var fn = function() {return a};
    a === fn(); // true
    a = 1; // 1
    fn() = 5; // ReferenceError: Invalid left-hand side in assignment
    
    var a;
    a = 1; // 1
    (a) = 2; // 2
    (1, a) = 3; // ReferenceError: Invalid left-hand side in assignment