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获取的数据类型的问题。最后进行数据类型转换,问题才得以解决。