整理下之前做的有点疑惑的js基础题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦
length
function fn(){
console.log(this.length)
}
var obj = {
length:5,
methods:function(fn){
fn()
arguments[0]()
}
}
obj.methods(fn,123) // 0 2
这题的主要问题是
为什么第一个 fn() 打印的是0?
这里扩展下
window.length
function.length
arguments.length
- window.length
指的是html文档中 iframe 内敛框架 的个数
<body>
<iframe src="" frameborder="0">1</iframe>
<iframe src="" frameborder="0">2</iframe>
<iframe src="" frameborder="0">3</iframe>
<script>
console.log(window.length)//3
</script>
</body>
- function.length
该函数预期传入的参数个数,我的理解是就是形参个数,但需要满足下面3个条件:
第一:从第一个开始计算,到已设置默认值的参数截止
第二:扩展运算符的剩余参数不算
第三:已设置默认值的参数不算
// 形参个数
console.log(function fn(a) {
}.length);//1
// 已经设了默认值的不算
console.log(function (a = 5) {
}.length);//0
console.log(function (a, b, c = 5) {
}.length);//2
// 属于参数不算
console.log(function (a, b, ...c) {
}.length);//2
// 从第一个计算,到已经设置默认值的参数截止
// 设置默认值的参数是首参数,则不会计算后面参数
console.log(((a = 1, b) => {
}).length); //0
- arguments.length
指的是函数的实参列表,这里没有像形参列表一样多的规则,因为这里没有解构赋值,传的值而不是变量,就是实实在在的实参个数。
let arr = [1,2,3]
function fn(){
console.log(arguments.length)
}
fn(a=2,2,...arr)//5