Loading ...
Sorry, an error occurred while loading the content.

Just got confused with the `?` operator

Expand Messages
  • Felix E. Klee
    Well, today I m not in good shape, and I expected the following code to output just one zero. The code passes JSLint. /*jslint devel: true */ (function () {
    Message 1 of 8 , Feb 5 9:14 AM
    • 0 Attachment
      Well, today I'm not in good shape, and I expected the following code to
      output just one zero. The code passes JSLint.

      /*jslint devel: true */

      (function () {
      'use strict';

      var isOneWayFlight = true, i;

      for (i = 0; i < isOneWayFlight ? 1 : 2; i += 1) {
      console.log(i);
      }
      }());

      Instead, the runtime enters an infinite loop. It outputs: 0, 1, 2, ...

      Correct version of the for statement, doing what I want:

      for (i = 0; i < (isOneWayFlight ? 1 : 2); i += 1) {
      console.log(i);
      }

      That's just FYI.
    • Keradus
      It s a matter of priority. First
      Message 2 of 8 , Feb 5 9:30 AM
      • 0 Attachment
        It's a matter of priority.
        First "<" will be executed, then "?".

        So
        i < isOneWayFlight ? 1 : 2
        is the same as
        (i < isOneWayFlight) ? 1 : 2

        regarding to initial values:
        true ? 1 : 2 => 1


        And then your loop looks like this:
        for (i = 0; 1; i += 1) {...}
        That's why it's continues indefinitely




        --
        Keradus
      • Felix E. Klee
        ... I know. Still the error slipped in, out of sloppiness, like many errors that JSLint is designed to capture.
        Message 3 of 8 , Feb 5 9:40 AM
        • 0 Attachment
          On Tue, Feb 5, 2013 at 6:30 PM, Keradus <keradus@...> wrote:
          > It's a matter of priority.

          I know. Still the error slipped in, out of sloppiness, like many errors
          that JSLint is designed to capture.
        • george_weilenmann
          This is more of an error on the part of the knowledge of the developer then on the part of JSLint. The code pattern is perfectly valid and not confusing to
          Message 4 of 8 , Feb 5 2:17 PM
          • 0 Attachment
            This is more of an error on the part of the knowledge of the developer
            then on the part of JSLint. The code pattern is perfectly valid and not
            confusing to someone who has a good grasp on operator precedence.
            even if JSLint was to require () around the ternary operator and
            results.
            Such that your line
            for (i = 0; i < isOneWayFlight ? 1 : 2; i += 1) {
            would have thrown an error for missing () around ternary.You still could
            have done
            for (i = 0; (i < isOneWayFlight ? 1 : 2); i += 1) {
            and the same error would have occurred in your logic.
            See http://www.javascriptkit.com/jsref/precedence_operators.shtml for a
            nice table on precedence of operators.


            --- In jslint_com@yahoogroups.com, "Felix E. Klee" wrote:
            >
            > On Tue, Feb 5, 2013 at 6:30 PM, Keradus wrote:
            > > It's a matter of priority.
            >
            > I know. Still the error slipped in, out of sloppiness, like many
            errors
            > that JSLint is designed to capture.
            >



            [Non-text portions of this message have been removed]
          • Felix E. Klee
            On Tue, Feb 5, 2013 at 11:17 PM, george_weilenmann ... Exactly not. I m a C programmer for more than 20 years, and I m well versed with
            Message 5 of 8 , Feb 5 3:10 PM
            • 0 Attachment
              On Tue, Feb 5, 2013 at 11:17 PM, george_weilenmann <abyssoft@...>
              wrote:
              > This is more of an error on the part of the knowledge of the developer

              Exactly not. I'm a C programmer for more than 20 years, and I'm well
              versed with its operator precedence, which is similar to that of
              JavaScript. I frequently use the `?` operator, and without any issues.

              I just wanted to point out what happened to me today. That's all.
            • douglascrockford
              ... Thanks. Please try it now.
              Message 6 of 8 , Feb 5 7:47 PM
              • 0 Attachment
                --- In jslint_com@yahoogroups.com, "Felix E. Klee" wrote:
                > /*jslint devel: true */
                >
                > (function () {
                > 'use strict';
                >
                > var isOneWayFlight = true, i;
                >
                > for (i = 0; i < isOneWayFlight ? 1 : 2; i += 1) {
                > console.log(i);
                > }
                > }());
                >
                > Instead, the runtime enters an infinite loop. It outputs: 0, 1, 2, ...
                >
                > Correct version of the for statement, doing what I want:
                >
                > for (i = 0; i < (isOneWayFlight ? 1 : 2); i += 1) {
                > console.log(i);
                > }


                Thanks. Please try it now.
              • george_weilenmann
                Nice compromise. Works great and indeed improves readability.
                Message 7 of 8 , Feb 5 8:12 PM
                • 0 Attachment
                  Nice compromise. Works great and indeed improves readability.

                  --- In jslint_com@yahoogroups.com, "Felix E. Klee" wrote:
                  >
                  > Well, today I'm not in good shape, and I expected the following code to
                  > output just one zero. The code passes JSLint.
                  >
                  > /*jslint devel: true */
                  >
                  > (function () {
                  > 'use strict';
                  >
                  > var isOneWayFlight = true, i;
                  >
                  > for (i = 0; i < isOneWayFlight ? 1 : 2; i += 1) {
                  > console.log(i);
                  > }
                  > }());
                  >
                  > Instead, the runtime enters an infinite loop. It outputs: 0, 1, 2, ...
                  >
                  > Correct version of the for statement, doing what I want:
                  >
                  > for (i = 0; i < (isOneWayFlight ? 1 : 2); i += 1) {
                  > console.log(i);
                  > }
                  >
                  > That's just FYI.
                  >
                • Felix E. Klee
                  ... So quick - thanks! :-)
                  Message 8 of 8 , Feb 7 1:49 AM
                  • 0 Attachment
                    On Wed, Feb 6, 2013 at 3:47 AM, douglascrockford <douglas@...> wrote:
                    > Please try it now.

                    So quick - thanks! :-)
                  Your message has been successfully submitted and would be delivered to recipients shortly.