代码之家  ›  专栏  ›  技术社区  ›  dclowd9901

什么是“弦数学”,为什么不好?

  •  5
  • dclowd9901  · 技术社区  · 14 年前

    我最近因为在我写的一个应用程序中使用了“字符串数学”而被一位开发人员斥责。我对整个开发工作还很陌生,没有接受过正式培训,也没有听说过这个问题。这是怎么一回事?

    $('.submit-input').click( function() {
        var valid = true;
        $('input, select, radio').removeClass('error');
        $('.error-message').hide();
    
        $('.validate').each( function() {
            if($(this).val() == $(this).attr('default')){
                valid = false;
                $(this).addClass('error');
            }
        });
    
        if(!$('select[name="contact"] option:selected').val() != ''){
            $('select[name="contact"]').addClass('error');
            valid = false;
        }
    
        if(!$('input[name="ampm"]:checked').length){
            $('input[name="ampm"]').addClass('error');          
            valid = false;
        }
    
        if(!valid){
            $('.error-message').css('display','block');
            return false;
        } else {
    
            var services_selected = 'Services Selected: ';
            services_selected += $('.l3').text() + ', ' + $('.l4').text() + ', ' + $('.l5').text() + '; ' + $('.l6').text();
            var prices = 'Prices: ';
            prices += $('.l7').text() + ', ' + $('.l8').text() + ', ' + $('.l9').text() + ', ' + $('.l10').text();
            var name = 'Name: ';
            name += $('input[name="name"]').val();  
            var phone = 'Phone: ' 
            phone += $('input[name="phone"]').val();
            var time = 'Preferred contact time: ';
            time += $('select[name="contact"] option:selected').val() + $('input[name="ampm"]:checked').val();
    
            $.ajax({
                url: 'php/mailer.php',
                data: 'services_selected=' + services_selected +'&prices=' + prices + '&name=' + name + '&phone=' + phone + '&time=' + time,
                type: "POST",
                success: function() {
                    $('#email_form_box .container').children().fadeOut(500, function() {
                        $('#email_form_box .container').html('<div style="margin:20px auto;text-align:center;width:200px;">yada yada yada<br /><span class="close">Close</span></div>');
                    });
                }
            });
        }
    
    });
    

    编辑:我在这里得到的要点是,这不是一个标准的开发口语,我可能应该和一开始就给我废话的人谈谈。所以我会这么做。谢谢你们。我会带着答案回来的,或者去查一下已经知道的人。

    9 回复  |  直到 14 年前
        1
  •  6
  •   Community gkalpak    7 年前

    在大多数Javascript浏览器实现中,由于过度复制,连接字符串的速度很慢。看到了吗 JavaScript: String Concatenation slow performance? Array.join('')?

    首选方法是使用数组和联接:

    var pieces = ["You purchased "];
    pieces.push(num, " widgets.");
    el.innerHTML = pieces.join('');
    

    添加更多:

    我认为您的代码中可能有一个潜在的bug:您似乎没有逃逸数据值。如果其中任何一个包含一个符号,你就有麻烦了。对所有数据值使用escape()。

    这是一个真正的错误,其他开发人员错过了。字符串数学问题是一个性能/可维护性问题。

    我重写了你的电子邮件组成部分(快)。我认为它更干净(并将略快)时,使用一块数组。

    ....
    } else {
    
    var d = []; // the post_data pieces table
    
    d.push ('services_selected='); // Start the services_selected value
    d.push ('Services Selected: ');
    d.push ($('.l3').text(), ', ', $('.l4').text(), ', ', $('.l5').text(),
            '; ', $('.l6').text());
    
    d.push ('&prices='); // Start the prices value
    d.push ('Prices: ');
    d.push ($('.l7').text(), ', ', $('.l8').text(), ', ', $('.l9').text(),
            ', ', $('.l10').text());
    
    d.push ('&name='); // Start the name value
    d.push ('Name: ', $('input[name="name"]').val());
    
    d.push ('&phone='); // Start the phone value
    d.push ('Phone: ', $('input[name="phone"]').val());
    
    d.push ('&time='); // Start the timevalue
    d.push ('Preferred contact time: ',
            $('select[name="contact"] option:selected').val(),
            $('input[name="ampm"]:checked').val());
    
        $.ajax({
            url: 'php/mailer.php',
            data: d.join(''),
            type: "POST",
            success: function() {
                $('#email_form_box .container').children().fadeOut(500, function() {
                    $('#email_form_box .container').html('<div style="margin:20px auto;text-align:center;width:200px;">yada yada yada<br /><span class="close">Close</span></div>');
                });
            }
        });
    }
    
        2
  •  2
  •   dclowd9901    14 年前

    好吧,他告诉我的答案是:

    I should have said inline string concatenation/parsing, which is a potential injection vulnerability and a sign of sloppy code or bypassing the framework.

        3
  •  1
  •   COME FROM    14 年前

    您是否正在使用字符串存储/操作数字数据?那可不是个好主意。

        4
  •  1
  •   Irwin    14 年前

        5
  •  1
  •   Skilldrick    14 年前

    编辑: 好吧,我的错,你不用 + 用于连接。编辑如下:

    编辑2: + :页


    我想他可能指的是:

    $my_html = "<p>" + someVar + "<em>" + somethingImportant + "</em></p>";
    

    i、 e.使用 . 用于连接。

        6
  •  1
  •   Community gkalpak    7 年前

    既然你用javascript重新标记了你的问题,那么你的同事可能意味着你代码中的bug会导致类似这样的问题 Strange javascript addition problem

    基本上 "1" + 1 11 在javascript中 1 + 1 计算结果为 2 . 现在替换 + 使用一个变量,你可以得到一些意想不到的行为。

        7
  •  1
  •   Patricia    14 年前

    你的同事可能对这样的台词有异议。理论上,这是完全正确的代码,但它几乎不可能读取。

    services_selected += $('.l3').text() + ', ' + $('.l4').text() + ', ' + $('.l5').text() + '; ' + $('.l6').text();
    

    http://frogsbrain.wordpress.com/2007/04/28/javascript-stringformat-method/

    您可以轻松地将此函数添加到JS中,然后可以将这行可怕的代码更改为:

    services_selected = '{0} , {1}, {2}, {3}; {4}'.format($('.l3').text(), $('.l4').text(), $('.l5').text(), $('.l6').text());
    
        8
  •  0
  •   Mario    14 年前

    扩展斯基尔德里克的回答:

    echo 0 + ": hi!<br />";
    echo 0 .. ": hi!<br />";
    

    第一行可能输出“0”(当它试图将字符串转换为数字时)。 第二行写着“0:hi!

        9
  •  0
  •   iandisme    14 年前

    public String StringAdd (String str1, String str2){
       int int1, int2;
       switch (str1){
          case "Zero":
          int1 = 0;
          break;
          case "One":
          int1 = 1;
          break;
          //...etc...
          default:
          throw new BadNumberSpellingException("You spelled a number wrong.");
       }
       switch (str2){
          case "Zero":
          int2 = 0;
          break;
          //...etc...
       }
    
       int result = int1 + int2;
       switch (result){
          case 0:
             return "Zero";
          case 1:
             return "One";
          case 2:
             return "Two";
          //etc....
       }
    }