【问题标题】:Javascript a=b=c statementsJavascript a=b=c 语句
【发布时间】:2022-01-04 01:21:17
【问题描述】:

我在互联网上进行了搜索,但找不到相关的搜索条件,所以我认为这是最好的提问地点。

我有一个 JS 声明说

document.location.hash = this.slug = this.sliceHashFromHref(href)

这是如何工作的?

【问题讨论】:

标签: javascript


【解决方案1】:

这是如何工作的?

a = b 可以被视为语句表达式

表达式的结果是b

换句话说,

a = b = c;

可以写成

a = (b = c);

等价于

b = c;
a = b;

因此您的代码相当于:

this.slug = this.sliceHashFromHref(href);
document.location.hash = this.slug;

【讨论】:

  • 如果表达式a = b的结果是b,那么表达式a = (b = c)应该等价于b = c; a = c;(但这并不意味着a = b = foo()会调用foo两次!)。我想知道a = b = c 将如何运作以防abc 有getter 和setter。 c 的 getter 将被调用一次,然后 b 的 setter 将被调用 - 是否会调用 b 的 getter 来获取 a 的 setter 的值?
【解决方案2】:

注意变量范围!!

var A = B = C = 3; //A is local variable while B & C are global variables;
var A = 3 , B = 3, C = 3;// A B C are local variables;

【讨论】:

  • 这可能应该得到更多的支持,或者被纳入接受的答案,因为这并不完全清楚你可能对你的全球范围所做的事情
  • 正要写出准确的答案,小心这个陷阱! typeof A !== 'undefined'typeof B !== 'undefined'typeof C !== 'undefined' 将产生 A 未定义B 未定义C 已定义。使用“使用严格”来获取错误,这样您就不会出现意外行为。
【解决方案3】:

它从右到左进行评估。即

document.location.hash = this.slug = this.sliceHashFromHref(href)

表示this.sliceHashFromHref(href) 的输出/值分配给this.slug,然后分配给document.location.hash

【讨论】:

  • 我的意思是没有冒犯,但我觉得@aioobe 的回答应该被接受,因为它已经被社区投票得更好,更透彻并且(在我看来)解释得更好。如果走错了路,我很抱歉。
  • 这个答案是错误的......如何将值分配给表达式(a = b)?
【解决方案4】:

很简单...它将调用this.sliceHashFromHref(href) 的结果分配给document.location.hashthis.slug,因此这两个属性(变量)在行执行后包含相同的值。

【讨论】:

    【解决方案5】:

    在 Javascript(以及从 C 派生其语法的其他几种语言)中,赋值计算 = 符号右侧的项目并将其分配给左侧的变量。右边的项目本身可以是带有 = 运算符的赋值。发生的情况是计算最右边的表达式,将值分配给中间变量,然后将该值分配给左侧的变量。

    简而言之,它只是一种同时为多个变量赋值的方法。

    【讨论】:

      【解决方案6】:

      实际上,Ma Jerez 的回答在这里提出了一个非常重要的观点。这个答案也指的是这个类似的question: 这个问题涉及到几件事:

      1. hoist:变量在块代码执行之前被提升;
      2. =赋值顺序:从右到左;
      3. 全局上下文:在非严格模式下,当一个变量没有被定义时,它会进入全局上下文;但会进入“使用严格”模式;

      例子1:

      ;(function Anonymous(){
        var a = b = {};
        console.log(a==b); //true
      })();
      
      1. aAnonymous 执行范围内被提升。

      2. b 将被分配为{},但由于未定义b,因此将b 分配给全局上下文window,然后将window.b 分配给{} ;然后window.b = {}returns{}

      3. 局部变量a被赋值为{}。

      因此,这里发生了一些有趣的事情:local variable aglobal variable b 都指向同一个对象{},所以它们是=====;请记住,{}=={} 否则会给出false

      注意:如果在严格模式下:

      ;(function Anonymous(){
        'use strict'
        var a = b = {}; //Uncaught ReferenceError: b is not defined
      })();
      

      这个连续的任务不会以同样的方式工作......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        相关资源
        最近更新 更多