window.prompt()方法数据类型问题

昨天在测试callee方法时,使用window.prompt()方法获取用户输入的数据,由于使用此方法并不多,忽略了该方法获取的数据类型是string的这一事实。废话不多说,下面举例说明。

为了测试callee方法,使用了以下简单的递归函数:

1.下面的这段代码实际是错误的范例

 1         let o = window.prompt('请输入一个非负整数:');
 2         function sum(o) {
 3             if (o == 0) {
 4                 return 0;
 5             } else {
 6                 return o + sum(o - 1);
 7             }
 8         }
 9         let res = sum(o);
10         console.log(res);
11         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.正确的示例:

 1         let o = window.prompt('请输入一个非负整数:');
 2         let p = Number(o);
 3         let res = (function (p) {
 4             if (p == 0) {
 5                 return 0;
 6             } else {
 7                 return p + arguments.callee(p - 1);//因为是匿名函数,所以需要使用arguments.callee获取函数本身的引用。
 8             }
 9         })(p);
10         console.log(res);

使用Number()方法,将字符串类型的数字转换成数字类型。如果没有这一步,将会计算混乱。因为window.prompt获取的是字符串类型。 话说回来,刚开始发现结果与预期不符的时候并没有直接找出原因。在尝试输入几个不同数字之后发现,结果是n+sum(n)的形式,n为输入的数字,此处的+表示连接符,不表示加法。例如,输入2,返回的结果是21;输入3,返回的结果是33。由此才察觉到是window.prompt获取的数据类型的问题。最后进行数据类型转换,问题才得以解决。



posted @ 2022-04-24 17:37  Yamz  阅读(245)  评论(0编辑  收藏  举报