window.prompt()获取数据类型问题
昨天在测试callee方法时,使用window.prompt()方法获取用户输入的数据,由于使用此方法并不多,忽略了该方法获取的数据类型是string的这一事实。废话不多说,下面举例说明。为了测试callee方法,使用了以下简单的递归函数:
1.下面的这段代码实际是错误的范例
程序代码:
let o = window.prompt('请输入一个非负整数:'); function sum(o) { if (o == 0) { return 0; } else { return o + sum(o - 1); } } let res = sum(o); console.log(res);//'21' console.log(typeof (res));//string
错误原因:window.prompt获取的是字符串类型,假设输入的数字为2,即字符串类型的'2'。
因此, return o + sum(o - 1); o为字符串'2',后面加上sum(o - 1),众所周知,字符串的数字与数字进行运算,将会被类型转换再运算,因此这里的sum(o - 1)将会执行sum(1),结果是1,最后函数返回o + 1,此时的o还是字符串类型的'2',字符串与数字相加,加号相当于连接符,所以返回的结果是字符串类型的'21'。
2.正确的示例:
程序代码:
let o = window.prompt('请输入一个非负整数:'); let p = Number(o); let res = (function (p) { if (p == 0) { return 0; } else { return p + arguments.callee(p - 1);//因为是匿名函数,所以需要使用arguments.callee获取函数本身的引用。 } })(p); console.log(res);
使用Number()方法,将字符串类型的数字转换成数字类型。如果没有这一步,将会计算混乱。因为window.prompt获取的是字符串类型。
话说回来,刚开始发现结果与预期不符的时候并没有直接找出原因。在尝试输入几个不同数字之后发现,结果是n+sum(n)的形式,n为输入的数字,此处的+表示连接符,不表示加法。例如,输入2,返回的结果是21;输入3,返回的结果是33。由此才察觉到是window.prompt获取的数据类型的问题。最后进行数据类型转换,问题才得以解决。
[此贴子已经被作者于2022-4-24 17:18编辑过]