function iner() {
let a = Array.call(this, arguments);
console.log(a);
}
iner(3);
let b = Array.call(this, 3);
像代码中这样,打印的结果如下
这是为什么呢,this不都是window吗?
function iner() {
let a = Array.call(this, arguments);
console.log(a);
}
iner(3);
let b = Array.call(this, 3);
像代码中这样,打印的结果如下
这是为什么呢,this不都是window吗?
var arr = [3]; //字面量的方式
var arr = new Array(3);//new 构造函数的方式
var arr = Array(3); //这个方式可以理解为new Array(3)的简写
然而var arr = [3]和var arr = Array(3)最大区别点在于:当传入一个数字的时候
console.log(new Array(3)) //[empty × 3] 长度为3且每个值为空的数组
console.log([3]); //[3] 长度为1,值是3的数组
当传入多个数字的时候,结果是一样的
console.log(new Array(1,2,3)) //[1, 2, 3]
console.log([1,2,3]) //[1, 2, 3]
2、this指向问题,本身Array方法就是window的属性。内置构造函数肯定挂载在window全局对象上啊。Number,String,Boolean等
所以你上面的两个方式执行函数改变this指向是无效的。
iner(3); //window.iner(3)
let b = Array.call(this, 3); //window.Array.call(this, 3);
想通过call改变this指向又有什么意义呢,本身Array的执行就是window.Array执行。
3、 问题中函数内的打印值
把一个函数的arguments传入的数组中,arguments是一个类数组
Arguments: [3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
不管你是把一个类数组,数组,对象,还是一个字符串,布尔值(如果传一个数字,上面分析)传入到Array方法中,去构造一个数组
都是把这个值作为数组第一项的值
结果:
Array(传入的值) //[传入的值]
func.call([thisArg[, arg1, arg2, ...argN]])
apply方法
是不同的。Array.call(this, arguments);
=>Array(arguments)
=>Array([3])
Array.call(this, 3);
=>Array(3)
第一个输出对应 Array([3])
第2个输出对应 Array(3)
13 回答13k 阅读
8 回答2.8k 阅读
2 回答5.2k 阅读✓ 已解决
5 回答1.4k 阅读
7 回答2.2k 阅读
3 回答1.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
没区别,之所以代码示例中
a
和b
值不一样,使用因为Array
构造函数对实参处理比较坑:所以问题中代码示例可以视为: