今天聊一个有趣的JavaScript问题:
123['toString'].length 加上 '123' 等于多少?
这个问题可能看起来简单,但是在回答这个问题之前,让我们先探讨一下:我们如何得知toString方法的长度?通常我们如何确定一个函数期望的参数个数?
在JavaScript里,函数的length属性是在函数声明时预先设定的参数个数。这个属性仅统计预期的参数数量,不考虑带有...的剩余参数(rest parameters),也不把默认参数计算在内。这个属性在反射(reflection)和函数式编程中非常有用,它帮助我们了解函数预期会接收多少个参数。
几个例子来说明
- 零参数的函数
function noParams(){}
console.log(noParams.length);
这个函数没有参数,因此length属性为0。
2.带一个参数的函数
function noParam(a){}
console.log(noParam.length);
这里定义了一个参数,所以length属性为1。
- 带多个参数的函数
function multipleParams(a, b, c) {}
console.log(multipleParams.length);
定义了三个参数,length属性自然就是3。
- 含有默认参数的函数
function defaultParams(a, b = 2, c) {}
console.log(defaultParams.length);
如果有默认参数,length属性只会计算到第一个有默认值之前的参数。这个例子中虽然有三个参数,但因为第二个参数有默认值,所以length属性为1。
- 带有剩余参数的函数
function restParams(a, b, ...rest) {}
console.log(restParams.length);
对于带有...剩余参数的函数,length属性仅统计...rest之前的参数个数。在这个例子中,尽管函数可以接受无限多个参数,length属性只为2,因为它只计算...rest之前的参数。
通过这些例子,我们可以看到length属性是了解函数预期参数数量的一个快速途径,这在编程中是个有用的技巧。
答案解读
回到我们的问题,JavaScript中的每个数字对象都继承了Number原型上的方法,包括toString。当你执行123['toString']时,实际上是在调用数字123的toString方法。在JavaScript中,函数的length属性告诉我们函数预期的参数个数。Number.prototype.toString方法可以接受一个参数(基数),所以它的length属性是1。
综上所述:
- 123['toString'].length 等于 1。
- 将这个数字与字符串 '123' 相加,得到 '1123'。
所以,表达式 123['toString'].length + '123' 的结果是字符串 '1123'。