1.整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值.
Number.isInteger(25) // true
Number.isInteger(25.0) // true
为什么同样储存方式,就会被视为同一个值?
2.函数的默认值.
//其次,有利于将来的代码优化,即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。
为什么。
3.函数的length属性
//length属性返回的是“预期输入参数的个数”。但如果有默认参数了,这个参数便不再是预期输入,所以不算。
//如果默认参数不是尾参数,那该参数后面的参数也不再是预期输入参数。
为什么?
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
//length属性忽略rest参数
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
//由于rest参数是多个参数的数组,所以很明显它只能是最后一个参数。
4.尾调用以及优化。
调用帧:函数A里调用了函数B,函数A和函数B都是一个调用帧,函数A是外层函数,函数A是内层函数。两者组合在一起为一个调用栈。正常情况下,函数A执行完后,函数A的调用帧才会消失。如果函数A有调用函数C,那就以此类推了。
尾调用:尾调用是指函数的最后一步是调用另一个函数,并返回。如果没有返回,他不是尾调用,因为会在这个调用后默认给一个return undefined
。
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用帧,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用帧,取代外层函数的调用帧就可以了。
//尾调用。
function f(x) {
if (x > 0) {
return m(x)
}
return n(x);
}
为什么有尾调用的情况下,外层函数调用位置、内部变量等信息不会再用到?
答:如果是尾调用中内层函数没有用到改外层函数的情况下,意味着内层函数调用完后,外层函数也会结束。所以位置,变量都不需要得到保存,因为这些位置和变量都不会再用到了。如果不是尾函数,则需要保存,因为运行完这个内层函数后,还要回到外层函数的调用内层函数的位置,继续执行下一部分代码。
编译器会识别这种尾调用情况,进行“尾调用优化”,使得调用帧永远只有一个(也就是当前内层函数的调用帧),释放了内存。