Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在添加2+;4在javascript中_Javascript - Fatal编程技术网

为什么在添加2+;4在javascript中

为什么在添加2+;4在javascript中,javascript,Javascript,我正在尝试: function add_things() { var first = '2'; var second = '4'; alert(first + second); } 但是它给我的是24而不是6,我做错了什么?你用+运算符连接了两个字符串。尝试以下任一方法: function add_things() { var first = 2; var second = 4; alert(first + second); } 或 或 注意:只有当您从属性或用户输入

我正在尝试:

function add_things() {
  var first = '2';
  var second = '4';
  alert(first + second);
}

但是它给我的是24而不是6,我做错了什么?

你用+运算符连接了两个字符串。尝试以下任一方法:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}

注意:只有当您从属性或用户输入中获取字符串时,第二个才是真正合适的。如果它们是您要定义的常量,并且您想要添加它们,那么将它们定义为整数(如第一个示例中所示)

此外,正如所指出的,八进制是邪恶的
parseInt('010')
实际上是数字8(八进制中的10是8),因此指定10的基数是一个好主意。

尝试以下方法:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}
注意,我已经删除了单引号
first
second
现在是整数。在您的原始版本中,它们是字符串(文本)。

这是JavaScript的“”之一,作为一种松散类型的语言,加法和串联运算符重载

JavaScript是松散类型的,但这并不意味着它没有数据类型,仅仅因为变量、对象属性、函数或参数的值不需要指定特定类型的值

基本上有三种基本数据类型:

  • 布尔值
null和undefined是两种特殊情况,其他一切都只是对象类型的变体

JavaScript类型将类型的值转换为适合其使用上下文的类型(类型强制)

在您的示例中,我们试图添加两个string类型的对象,因此发生了连接

您可以通过多种方式将变量“强制转换”或类型转换为数字,以避免此问题:

var a = "2";
var b = "4";
// a and b are strings!
var sum =  Number(a) + Number(b);          // Number constructor.
sum =  +a + +b;                            // Unary plus.
sum =  parseInt(a, 10) + parseInt(b, 10);  // parseInt.
sum =  parseFloat(a) + parseFloat(b);      // parseFloat.
我认为这是一个非常常见的错误,例如,当从表单元素读取用户输入时,表单控件的value属性是string,即使它包含的字符序列表示一个数字(如您的示例所示)

我所说的“不好的部分”是关于+运算符的双重功能,重载用于数字加法和字符串串联


+运算符将执行的操作完全由上下文决定。只有当两个操作数都是数字时,+运算符才会执行加法,否则它会将其所有操作数转换为字符串并进行串联。

单引号导致值被视为字符而不是数字。”2'+'4'='24'与'snarf'+'blam'='snarfblam'的方式相同。

在处理字符串形式的数字时,您还可以通过将字符串乘以1来强制解释器执行算术(因为不能对字符串进行乘法,如果可以,它将转换为数字):


但最好是使用强制转换,因为稍后可能会有人出现,并通过删除“显然不必要的”乘一运算来优化表达式。

在字符串中添加数字的方法有很多,包括alert(+first++second);看看为什么。。。另一个更有效的方法是警惕(第一-第二)。如果有的话,“坏”部分是在JavaScript中键入的松散性<代码>“2”+4将为您提供6以及
2+“4”
。但是添加两个字符串会导致连接,我认为不好的部分是重复使用“+”句点。松散的键入不是一个坏的部分。@lc,你的两个例子都是“24”,我想你可能是在胡说八道。crockford不喜欢Number()构造函数是有原因的,但我一辈子都不记得为什么了。我想他不喜欢那些与“new”一起使用的构造函数。但我不记得他抱怨过他们被用来当演员。因为八进制是邪恶的,所以指定基数为10是常见的。否则,带前导零的字符串可能会扰乱你的思维;你也可以用这样的数字来投票:
number('2')+number('4')==6
。不知道为什么人们会投这么多票?!很可能变量来自其他来源,不能简单地删除引号,因此需要在其他答案中进行转换。我认为这是一个很好的答案,因为提问者显然认为第一个和第二个是数字。这并不是编码员因为期望一个数字而得到一个字符串而被绊倒的情况——Tilendo努力引用这些数字!它回答了人们提出的问题。
function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}
var a = "2";
var b = "4";
// a and b are strings!
var sum =  Number(a) + Number(b);          // Number constructor.
sum =  +a + +b;                            // Unary plus.
sum =  parseInt(a, 10) + parseInt(b, 10);  // parseInt.
sum =  parseFloat(a) + parseFloat(b);      // parseFloat.
// fun with Javascript...

alert(first * 1 + second * 1);