Javascript 什么';s";“字符串数学”;为什么不好?

Javascript 什么';s";“字符串数学”;为什么不好?,javascript,Javascript,我最近因为在我编写的一个应用程序中使用“字符串数学”而受到一位开发人员的斥责。我对整个开发工作还很陌生,没有接受过正式培训,也没有听说过这个问题。这是什么 有关守则: $('.submit-input').click( function() { var valid = true; $('input, select, radio').removeClass('error'); $('.error-message').hide(); $('.validate').e

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

有关守则:

$('.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>');
                });
            }
        });
    }

});
$('.submit input')。单击(函数(){
var valid=true;
$('input,select,radio')。removeClass('error');
$('.error message').hide();
$('.validate')。每个(函数(){
if($(this.val()==$(this.attr('default')){
有效=错误;
$(this.addClass('error');
}
});
如果(!$('select[name=“contact”]选项:selected')。val(){
$('select[name=“contact”]”)。addClass('error');
有效=错误;
}
if(!$('input[name=“ampm”]:checked')。长度){
$('input[name=“ampm”]”)。addClass('error');
有效=错误;
}
如果(!有效){
$('.error message').css('display','block');
返回false;
}否则{
var services_selected='services selected:';
所选服务+=$('.l3').text()+,'+$('.l4').text()+,'+$('.l5').text()+';'+$('.l6').text();
var价格='价格:';
价格+=$('.l7').text()+'、'+$('.l8').text()+'、'+$('.l9').text()+'、'+$('.l10').text();
变量名称='名称:';
name+=$('input[name=“name”]”)。val();
var phone='电话:'
phone+=$('input[name=“phone”]”)。val();
变量时间='首选联系时间:';
时间+=$('select[name=“contact”]选项:selected').val()++$('input[name=“ampm”]:checked').val();
$.ajax({
url:'php/mailer.php',
数据:'services_selected='+services_selected+'&prices='+prices+'&name='+name+'&phone='+phone+'&time='+time,
类型:“POST”,
成功:函数(){
$('#email_form_box.container').children().fadeOut(500,function()){
$('#email_form_box.container').html('yada yada yada
Close'); }); } }); } });

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

编辑:好的,我的错,你不使用
+
进行连接。编辑如下:

Edit2:好的,是JavaScript,返回到
+
:p


我想他可能指的是:

$my_html = "<p>" + someVar + "<em>" + somethingImportant + "</em></p>";
services_selected = '{0} , {1}, {2}, {3}; {4}'.format($('.l3').text(), $('.l4').text(), $('.l5').text(), $('.l6').text());
$my_html=“”+someVar+“”+somethingImportant+”

”;

i、 e.使用
进行连接。

您是否可能使用字符串存储/处理数字数据?这很少是个好主意。

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

在其中一个变量不是字符串之前,使用“+”表示字符串(取决于您的语言)没有任何错误:

echo 0 + ": hi!<br />";
echo 0 .. ": hi!<br />";
echo 0+”:嗨!
; 回声0。。“:嗨!
”;
第一行可能输出“0”(当它尝试将字符串转换为数字时)。
第二行写的是“0:hi!
”。

因为您是开发新手,最好的做法是与这位开发人员讨论什么是“字符串数学”,如何识别何时再次执行,以及如何避免。
然后,回到这里,回答您自己的问题,这样我们就可以从您的开发伙伴的角度来了解“字符串数学”到底是什么了。

既然您用javascript重新标记了您的问题,那么您的同事可能会指出您的代码中的错误,从而导致类似这样的问题


基本上,
“1”+1
在javascript中计算为
11
,而
1+1
计算为
2
。现在,将
+
的第一个参数替换为一个变量,您会得到一些意外的行为。

在大多数Javascript浏览器实现中,由于过度复制,连接字符串的速度很慢。看

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

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

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

另外,这是一个其他开发人员遗漏的真正的bug。字符串数学问题是一个性能/可维护性问题

增加:

我(很快)重写了你的电子邮件作文部分。我认为使用碎片阵列时会更干净(并且会稍微快一点)

....
} 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>');
            });
        }
    });
}
。。。。
}否则{
var d=[];//post_数据块表
d、 push('services_selected=');//启动services_selected值
d、 推送('所选服务:');
d、 推送($('.l3').text(),,,,,$('.l4').text(),,,,,$('.l5').text(),
“;”,$(“.l6”).text();
d、 推送(“&prices=”);//启动prices值
d、 推动(价格:);
d、 推送($('.l7').text(),,,,,$('.l8').text(),,,,,,$('.l9').text(),
“,”,$(“.l10”).text());
d、 push(“&name=”);//启动名称值
d、 push('Name:',$('input[Name=“Name”]”)val();
d、 推送(“&phone=”);//启动电话值
d、 push('Phone:',$('input[name=“Phone”]”)val();
d、 push(“&time=”);//启动时间值
d、 推送('首选接触时间:',
$('select[name=“contact”]选项:selected').val(),
$('input[name=“ampm”]:checked').val();
$.ajax({
url:'php/mailer.php',
数据:d.连接(“”),
类型:“POST”,
成功:函数(){
$('#email_form_box.container').children().fadeOut(500,function()){
$('#email_form_box.container').html('yada yada yada
Close'); }); } }); }
您的同事可能对这样的行有意见。理论上,这是完全正确的代码,但它几乎不可能被读取

services_selected += $('.l3').text() + ', ' + $('.l4').text() + ', ' + $('.l5').text() + '; ' + $('.l6').text();
在此处查看功能和讨论:

您可以轻松添加
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....
   }
}