var string1= 'helloword';
var a=Array.prototype.slice.call(string1);
console.log(a);
上面那个代码不用多说了吧 我一直认为可以通过这种方式用Array的方法直接通过call操作处理其他对象比如string;
今天我写的:
var string1= 'helloword';
var a=Array.prototype.reverse.call(string1);
console.log(a);
报这个错:
有没有人能从原理解释一下这个是什么情况 谢谢了
reverse是一个mutate的操作,也就是说改变传入的参数,比如说一个数组的reverse,在函数过程中会有类似的操作
但是你能对一个字符串进行这样的操作吗?不行,字符串在javascript里是基本类型,是immutable的,是只读的
那么很明显,我们不需要知道reverse的实现细节,我们只需要知道它是一个mutate的方法,就可以确定,它不能实现字符串的反转,如果你想知道为什么么会出现提示的错误,你可以去看看es标准或者v8源码的具体实现。
那么同理,slice是返回一个新的数组而不是在传入的参数上直接操作,那么在不知道slice的源码的情况下我们也可以大概率的知道
再同理,mutate的操作sort同样也不行
同理,pop, push, shift, unshift, splice都不行
同理, map, find, forEach 等都可以
不是简单的说“数组的方法当然不能用在字符串上”,数组的方法不过就是一个函数,能不能用要看这个函数内部的实现,如果它的实现和传入的参数是一个字符串不冲突,那么就可以用,反之就不能用,具体问题具体分析