js手写实现indexOf
时间: 2023-12-26 07:28:09 浏览: 29
以下是手写实现indexOf的JavaScript代码:
```javascript
Array.prototype.myIndexOf = function(element) {
for (let i = 0; i < this.length; i++) {
if (this[i] === element) {
return i;
}
}
return -1;
};
// 示例用法
const arr = [1, 2, 3, 4, 5];
console.log(arr.myIndexOf(3)); // 输出:2
console.log(arr.myIndexOf(6)); // 输出:-1
```
相关问题
js手写indexOf
JavaScript的indexOf方法是用于查找字符串中指定子串第一次出现的位置的方法。在JavaScript中,为了实现字符串的indexOf方法,可以使用Polyfill来手动实现。
下面是一个手写的indexOf方法的示例代码:
```javascript
if (!String.prototype.indexOf) {
String.prototype.indexOf = function(searchString, fromIndex) {
let i;
if (typeof searchString == 'undefined') {
searchString = 'undefined';
}
searchString = String(searchString);
let flen = this.length;
let zlen = searchString.length;
fromIndex = Number(fromIndex) || 0;
if (isNaN(fromIndex) || fromIndex < 0) {
i = 0;
} else if (fromIndex >= flen) {
return -1;
} else {
i = fromIndex;
}
if (zlen > flen) {
return -1;
} else if (zlen == flen) {
if (this == searchString) {
return 0;
} else {
return -1;
}
} else {
let str = '';
while (i < flen) {
str = this.substr(i, zlen);
if (str == searchString) {
return i;
}
i++;
}
if (i == flen) {
return -1;
}
}
};
}
```
这个手写的indexOf方法首先判断是否已经存在indexOf方法,如果不存在则将其定义为String.prototype的一个新的方法。然后在方法体内部,根据传入的参数进行相应的处理。
首先,将searchString转换为字符串类型,并获取原始字符串和子串的长度。接着,判断fromIndex是否为有效的数字,如果不是,则设置其默认值为0。然后根据fromIndex的值确定搜索的起始位置。
在循环中,使用substr方法逐个截取原始字符串中与子串长度相等的子串,然后与子串进行比较。如果相等,则返回当前索引位置;如果不相等,则继续循环直到搜索完整个字符串。如果循环结束后仍未找到匹配的子串,则返回-1表示未找到。
这样,通过手写的方式实现了JavaScript的indexOf方法。
手写JavaScript发布订阅模式
发布订阅模式又称观察者模式,是一种常见的设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。下面是手写JavaScript发布订阅模式的一种实现方式:
```javascript
function PubSub() {
this.subscribers = {};
}
PubSub.prototype.subscribe = function(event, callback) {
if (!this.subscribers[event]) {
this.subscribers[event] = [];
}
this.subscribers[event].push(callback);
};
PubSub.prototype.unsubscribe = function(event, callback) {
if (!this.subscribers[event]) {
return;
}
var index = this.subscribers[event].indexOf(callback);
if (index > -1) {
this.subscribers[event].splice(index, 1);
}
};
PubSub.prototype.publish = function(event, data) {
if (!this.subscribers[event]) {
return;
}
this.subscribers[event].forEach(function(callback) {
callback(data);
});
};
```
使用方式如下:
```javascript
var pubsub = new PubSub();
function callback1(data) {
console.log('callback1:', data);
}
pubsub.subscribe('event1', callback1);
function callback2(data) {
console.log('callback2:', data);
}
pubsub.subscribe('event2', callback2);
pubsub.publish('event1', { message: 'hello' });
pubsub.publish('event2', { message: 'world' });
pubsub.unsubscribe('event1', callback1);
pubsub.publish('event1', { message: 'hello again' });
```
输出结果为:
```
callback1: {message: "hello"}
callback2: {message: "world"}
```
当调用 `publish` 方法时,订阅了该事件的所有回调函数都将被执行,并且可以传递一个数据对象作为参数。调用 `subscribe` 方法注册一个回调函数,当该事件被发布时,该回调函数将被执行。调用 `unsubscribe` 方法取消订阅。