为什么我在javascript中添加2 + 4时会得到24

Til*_*dor 10 javascript

我在尝试这个:

function add_things() {
  var first = '2';
  var second = '4';
  alert(first + second);
}
Run Code Online (Sandbox Code Playgroud)

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

cle*_*tus 30

你用+运算符连接两个字符串.尝试:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}
Run Code Online (Sandbox Code Playgroud)

要么

function add_things() {
  var first = '2';
  var second = '4';
  alert(parseInt(first, 10) + parseInt(second, 10));
}
Run Code Online (Sandbox Code Playgroud)

要么

function add_things() {
  var first = '2';
  var second = '4';
  alert(Number(first) + Number(second));
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 因为八进制是邪恶的,所以指定10的基数是常见的.否则,带有前导零的字符串会让你大吃一惊. (9认同)

Ben*_*n M 16

试试这个:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了单引号; firstsecond现在的整数.在你的原文中,它们是字符串(文本).

  • 我认为这是一个很好的答案,因为很明显,提问者认为第一和第二是数字.这不是编码器被绊倒的情况之一,因为他们期待一个数字并获得一个字符串--Tilendor努力引用这些数字! (5认同)
  • 不确定为什么人们这么多投票?!有可能变量来自其他来源,并且不能简单地删除引号,因此需要在其他答案中进行转换. (4认同)

CMS*_*CMS 9

这是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.
Run Code Online (Sandbox Code Playgroud)

这是我认为一个非常常见的错误,例如,当从表单元素读取用户输入时,表单控件的value属性是字符串,即使它包含的字符序列表示一个数字(如您的示例中所示).

我所说的"坏部分"是关于+运算符的双重功能,重载用于数字加法和字符串连接.

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

  • 我认为不好的部分是重复使用"+",句号.宽松的打字不是一个坏的部分. (4认同)

sna*_*arf 7

单引号会将值视为字符而不是数字.'2'+'4'='24'与'snarf'+'blam'='snarfblam'的方式相同.