关于join和call方法

为什么这带代码能运行Array.prototype.join.call("asdf", ",") // a,s,d,f,
join方法不是数组的吗?为什么字符串能调用啊!

阅读 3.8k
3 个回答

解决这种问题最好的办法是直接参考ES6官方文档es6 Array.prototype.join

clipboard.png

上图是ES6规范中定义的join函数的执行步骤,下面讲解几个关键步骤:

  1. 首先通过步骤3获取this对象的length属性;
  2. 然后通过步骤9获取this对象的"0"属性;
  3. 然后通过步骤12和步骤13,把k从1递增到步骤3获取的length;
  4. 通过步骤13.b可以知道每次获取的都是this对象的把k转化为字符串对应的属性。

所以对于Array.prototype.join.call("asdf", ",")
上面步骤里面的this对象指的类似于var a = new String("asdf"),然后输出a[0] + ',' + a[1] + ',' + a[2] + ',' + a[3],也就是"a,s,d,f"

比如下面这个例子:

var a = {
    length: 4,
    0: 'a',
    1: 'b',
    2: 'c',
    3: 'd'
}
Array.prototype.join.call(a, ',') // "a,b,c,d"

再比如下面的例子:

var a = {
    length: 4,
    1: 'b',
    3: 'd'
}
Array.prototype.join.call(a, ',') // ",b,,d",参考步骤10和步骤13.c

这个是call的基本用法;

//定义一个add 方法
function add(x, y) {
    return x + y;
}

//用call 来调用 add 方法
function myAddCall(x, y) {
    //调用 add 方法 的 call 方法
    return add.call(this, x, y);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题