关于javascript:以题带点四道题回顾js基础

38次阅读

共计 2526 个字符,预计需要花费 7 分钟才能阅读完成。

以题带点,四道题回顾 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 是什么?

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

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

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

这题考查函数对象的 length 属性。javascript 规范内置对象明确阐明函数对象 length 属性指明函数的形参个数。然而留神辨别有默认参数的状况下。了解如下几种状况

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传进去执行了: 计算过程为:

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

后果不言而喻:[1,NaN, NaN]

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

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

后面三个咱们答案曾经晓得了,间接略过,看上面计算过程:

...
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]

正文完
 0