从null返回覆盖indexOf()

时间:2017-07-13 10:11:58

标签: javascript null override indexof

我知道可以像这样覆盖JS中的函数:

var indexOf = String.prototype.indexOf;
String.prototype.indexOf = function(){
    //MY CODE HERE
    return indexOf.call(this, arguments);
};

这是覆盖从String调用的indexOf()。 是否可以覆盖将从null调用的indexOf()var a = null; a.indexOf("foo")应该返回-1。邪恶吧?

2 个答案:

答案 0 :(得分:2)



var a = null,
b = 'foobar';
console.log( (a+'').indexOf('foo') );
console.log( (b+'').indexOf('foo') );




将null连接到字符串然后检查,如果你真的想要indexOf

答案 1 :(得分:1)

null(和undefined)不支持属性访问(点运算符),换句话说,null.whatever永远不会有效。所以你要找的东西是不可能的。 Reference

此外,一些(大多数?)内置方法(包括indexOf)也不支持null绑定,因此''.indexOf.call(null,...)也无法工作。< / p>

我理解你的问题背后的基本原理,在nulls上使用方法可以在&#34; map-invoke&#34;上下文,比如

 source.map(x => x.someMethod())

您要为源中可能出现的nulls / undefined返回一些默认值。不幸的是,似乎没有办法简洁地做到这一点,你必须为可能的空值提供安全包装:

 source.map(x => invoke(x, func))

其中invoke类似于return x === null ? null : func.apply(x)

完整示例:

&#13;
&#13;
let isNull = x => x === null || typeof x === 'undefined';

let invoke = (func, ...args) => x => isNull(x)  ? null : func.apply(x, args);

a = ['foo', 'bar', null, 'bbaazz'];

// z = a.map(x => x.indexOf('a')) // this will fail

z = a.map(invoke(''.indexOf, 'a')); // this works

console.log(z);
&#13;
&#13;
&#13;