由indexOf引发的一系列探究和思考

前世

先写下我对indexOf这个函数是怎么遭遇的,之前处理要将后台返回带逗号的字符串去掉,例如“a,b,c,d”,想到过这样处理,将字符串装换成数组,再组合成字符串,代码如下:

var str = ",1,2,3,4,4,5,6,6,";

str.split(",").join(" "); 

(若有人还有更好的思路,请留言交流)

也处理过这样的问题,点击会将手机号码中间4为加密,显示为*,思路也是这样,用的数组splice方法。

今生

好的,可以回正题了,看代码时发现数组也可以用indexOf方法,而且跟字符串用的方式一样,于是我在控制台验证了:

var str = "abcdefg";str.indexOf("c");
2
var arr = ["1","a","d","3"];arr.indexOf("a");
1
成功没有报错,我查w3c的indexOf的定义 ,javaScript String对象  indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

这时我产生2个疑问,1,难道数组也有indexOf的方法?2,难道数组执行indexOf 的时候先转成字符串,然后在执行方法的?

我将疑问发到技术群里问了下高手,幻天芒 给的解释,string的indexOf和array的indexOf,只是名字相同的不同方法。[ Dying In The Sun ]  给的解释,es3只有string.prototype.indexOf,es5才扩展出array.prototype.indexOf。es3实现的时候肯定仅在string上实现,es5的实现肯定是在Array上实现扩展到string上啊 。
好的,这下清楚了,String和Array都有这个方法,名字一样而已。于是我百度下Array的indexOf方法(w3c已经不能信了),然后在https://msdn.microsoft.com/zh-cn/library/bb383831.aspx 找到了,这个给出示例,
  var a = ['red', 'blue', 'green', 'blue'];

var myFirstIndex = Array.indexOf(a, "blue");
好的高兴的去控制台执行了,71fccaab-4983-49fe-8f17-bb7358f0a756
WTF?这是怎么回事,然后又请教高手了,clumiere建议  Array.prototype.indexOf.call(a,"blue");拿这个执行就对了,接着就想为什么会这样呢,
开始去找原因,于是打印Array的对象和原型对象的属性名,
Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。
06e936a9-ad67-484f-8b08-8bfefc9699fd
发现Array里面是没有的,prototype里面是有的,之后发现JScript与javascript是不一样的语言,用法也是不一样的。
javascript的API还是要去mdn看的, https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf  这个才是javascript的。
Array.prototype.indexOf.call(a,"blue")与a.indexOf("blue")是一样的效果,那有没有想过Array.prototype.indexOf.call(a,"blue")与a.indexOf("blue")两种写法有设么区别呢。
好问题,那如果a是一个类似数组的,没有indexOf这个方法,但是又想用这个方法的时候,第一种写法就派上用场了。
http://segmentfault.com/q/1010000000125575  这个里面有个类似的slice方法,对此做了解答。
总结,以后这些基础性的内容要去mdn上去看,这个里面的比较新,比较全。
posted @ 2015-04-18 16:16  Jesse-band  阅读(518)  评论(0编辑  收藏  举报