以题带点,四道题回顾js基础

1.题一:({} + {}).length

首先看下面这题:

({}).length返回什么结果?

懂javascript原型链的应该知道,对象上没有length属性,那么你调用它肯定是返回undefined

那么({} + {})呢?

javascript是弱类型语言,加法运算间接调用了对象的toString()方法,那么上题其实就是:

({}.toString + {}.toString).length的结果是?

这样你肯定就明白了,结果一定是有值的,而且是个整数。

因为({}).toString的值是"[object Object]",字符串相加会拼接字符串,最终({}.toString + {}.toString)结果为"[object Object][object Object]",而String的原型上是有length方法的,会返回字符串的长度。

最终答案为30。

思考:TypeScript环境下,上题答案会是什么?

2.题二:([] + []).length

这题考察点是类似第一题的,但是很少有人会去留意([]).toString是什么?

image-20210228180928304

难以猜测的是空数toString后 并不是返回字符串的[],而是单单的空字符串"",那么你知道[1,2,3].toString()返回的是什么吗?是字符串的"1,2,3"

所以这题答案很明显是0。

3.题三:(function (){}).length

这题考察函数对象的length属性。javascript标准内置对象明确说明函数对象length 属性指明函数的形参个数。但是注意区分有默认参数的情况下。理解如下几种情况

1
2
3
4
5
6
7
8
9
10
11
12
Function 构造器本身也是个Function。他的 length 属性值为 1 。该属性 Writable: false, Enumerable: false, Configurable: true.
console.log(Function.length); /* 1 */

console.log((function() {}).length); /* 0 */
console.log((function(a) {}).length); /* 1 */
console.log((function(a, b) {}).length); /* 2 etc. */

console.log((function(...args) {}).length);
// 0, 剩余参数不计数

console.log((function(a, b = 1, c) {}).length);
// 1, 只有在第一个默认参数前的所有形参才会计数

思考: Function.prototype 对象的 length 属性值为多少。答案点开链接查看

4.题五:[1,2,3].map(parseInt)

这题考察是否深入理解两个函数的格式与参数含义。

大部分前端人现在map函数用的可能比较熟悉了(思考:mapforEach的区别以及以及什么场景下使用?)

Map函数:

map对数组的每个元素调用定义的回调函数并返回包含结果的数组。

参数

  • callback

    生成新数组元素的函数,使用三个参数:currentValue``callback 数组中正在处理的当前元素。index可选callback 数组中正在处理的当前元素的索引。array可选map 方法调用的数组。

  • thisArg可选

    执行 callback 函数时值被用作this

parseInt函数:

以下计算过程需要有一定的计算机基础,非计算机科班人员需要查找资料,进制转换计算相对比较基础和重要,务必掌握。

parseInt() 函数可解析一个字符串,并返回一个整数。

语法:parseInt(string, radix), 接收两个参数,第一个必选,即需要被解析的字符串,第二个参数可选,基数,可以理解为进制,该值介于 2 ~ 36 之间,如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

介绍完两个函数的用法,特别是parseInt函数后应该大部分人能做出上面那道题了。

["1", "2", "3"].map(parseInt)迭代器中每次执行由于parseInt可以接受两个参数,每次都把itemindex传进去执行了: 计算过程为:

1
2
3
parseInt('1', 0)  // 如果省略该参数或其值(radix)为 0,则数字将以 10 为基础来解析, 1的十进制就是1
parseInt('2', 1) //当第一个数就比参数大时,返回NAN
parseInt('3', 2) //当第一个数就比参数大时,返回NAN

结果显而易见:[1,NaN, NaN]

再来看看下面这道题返回什么?

1
2
var a=["1", "2", "3", "4","5",6,7,8,9,10,11,12,13,14,15];
a.map(parseInt);

前面三个我们答案已经知道了,直接略过,看下面计算过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
...
parseInt('4', 3) //当第一个数就比参数大时,返回NAN
parseInt('5', 4) //当第一个数就比参数大时,返回NAN
parseInt('6', 5) //当第一个数就比参数大时,返回NAN
parseInt('7', 6) //当第一个数就比参数大时,返回NAN
parseInt('8', 7) //当第一个数就比参数大时,返回NAN
parseInt('9', 8) //当第一个数就比参数大时,返回NAN
parseInt('10', 9) //10以9为基数计算,0*9^0+1*9^1=9
parseInt('11', 10) //11的十进制就是11
parseInt('12', 11) //12的11进制,2*11^0+1*11^1=2+11=13
parseInt('13', 12) //13的12进制,3*12^0+1*12^1=15
parseInt('14', 13) //14的13进制, 4*13^0+1*13^1=17
parseInt('15', 14) //15的14进制, 5*14^0+1*14^1=19

最终结果为[1,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,9,11,13,15,17,19]