问题描述
在prompt
中,用户的响应是一个字符串。即使响应是数字,它也会以字符串形式返回。所以我在控制台中做了一些补充:
var numberOfCats = prompt("How many cats?");
var tooManyCats = numberOfCats + 1;
如果我在3
框中键入数字prompt
,然后选中tooManyCats
,则结果为:31
。因为Javascript无法使用字符串和数字进行数学运算。因此,它会在其旁边添加数字1
。
但是对于这个例子,由于某种原因,它不会弄乱代码。在这里,我在控制台中制作了一个年龄计算器。
var age = prompt("What is your age?")
var days = age * 365.25; //.25 is for the leap years
alert(age + " years is roughly " + days + " days");
如果我在20
框中键入prompt
,它会提醒我:20 years is roughly 7305 days
我不明白为什么第二个没有任何问题。是因为Javascript以自己独特的方式看到字符串和数字,还是背后有某些原因?
解决方法
之所以起作用,是因为与+
不同,*
会在进行乘法运算之前将其操作数转换为数字,因此*
表达式始终会得出数字值(即使该值为NaN
)(如果两个操作数均为BigInts,则为BigInt),而+
可能根据其操作数而产生数字(或BigInt)或字符串。 (实际上,+
是 only 的经典数学运算符之一,它并不总是产生数字或BigInt; -
,/
, %
和*
总是这样做)。因此days
是一个数字,因为它是*
的结果(不是BigInts)。
关于BigInts:唯一的+
,-
,/
,*
和%
运算符表达式产生BigInts的原因是 操作数是BigInts,没有隐式转换。如果只有一个操作数是BigInt,则该操作将引发TypeError。
Javascript自动确定您输入的输入是字符串还是数字。有时,它是不正确的,取决于您是否要更改它。您可以使用Number()方法将字符串转换为数字。或如T.J.拥挤者可以将字符串乘以1,然后得到一个数字(numberOfCats * 1)。
,您的第二个输入项是一个乘法(*)。不能简单地将其添加为字符串,因此JS会以您输入的乘法的答案作为响应。第一个条目是加号(+),它将字符串视为串联而不是等式。
,如果输入为数字,则Javascript始终与'+'运算符连接。但是使用*,/,%之类的运算符总是将以数字格式输入的字符串转换为数字。
5+'5'=55
如果Javascript将其教为字符串,则 5*'5'
没有任何意义。
对于*,/,%同样。
在用于加法的javascript中,“ +”运算符也重载为“ +”作为并置运算符,它是根据操作数自动确定的。如果任何操作数是字符串,它将被串联。