90%都会跪的JavaScript面试题!🙆🏼‍♂️

103 阅读2分钟

今天聊一个有趣的JavaScript问题:

123['toString'].length 加上 '123' 等于多少?

这个问题可能看起来简单,但是在回答这个问题之前,让我们先探讨一下:我们如何得知toString方法的长度?通常我们如何确定一个函数期望的参数个数?

在JavaScript里,函数的length属性是在函数声明时预先设定的参数个数。这个属性仅统计预期的参数数量,不考虑带有...的剩余参数(rest parameters),也不把默认参数计算在内。这个属性在反射(reflection)和函数式编程中非常有用,它帮助我们了解函数预期会接收多少个参数。

几个例子来说明

  1. 零参数的函数
function noParams(){}
console.log(noParams.length);

这个函数没有参数,因此length属性为0。

2.带一个参数的函数

function noParam(a){}
console.log(noParam.length);

这里定义了一个参数,所以length属性为1。

  1. 带多个参数的函数
function multipleParams(a, b, c) {}  
console.log(multipleParams.length);

定义了三个参数,length属性自然就是3。

  1. 含有默认参数的函数
function defaultParams(a, b = 2, c) {}  
console.log(defaultParams.length);

如果有默认参数,length属性只会计算到第一个有默认值之前的参数。这个例子中虽然有三个参数,但因为第二个参数有默认值,所以length属性为1。

  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'。