面试题答案
一键面试兼容性问题
- IE8及以下:虽然这些方法在IE8及以下也存在,但对于
push
、pop
、shift
、unshift
方法,如果数组对象是宿主对象(由浏览器提供的非原生JavaScript对象),可能会出现一些意外行为。例如,当操作某些特殊的类数组对象(如arguments
对象,在IE8及以下,arguments
对象不是一个真正的数组,只是类似数组)时,使用这些方法可能会报错或达不到预期效果。
兼容性优化
- 针对类数组对象转数组:
- 可以使用
Array.prototype.slice.call
方法将类数组对象转换为真正的数组,然后再使用push
、pop
、shift
、unshift
方法。例如:
function test() { var arrLike = arguments; var realArr = Array.prototype.slice.call(arrLike); realArr.push('new element'); return realArr; }
- 可以使用
- 检测环境:
- 在使用这些方法之前,可以先检测当前环境是否支持这些方法。虽然现代浏览器基本都支持,但对于老旧环境(如IE8及以下),可以通过以下方式检测:
if (!Array.prototype.push) { Array.prototype.push = function() { for (var i = 0; i < arguments.length; i++) { this[this.length] = arguments[i]; } return this.length; }; } if (!Array.prototype.pop) { Array.prototype.pop = function() { if (this.length === 0) { return undefined; } var last = this[this.length - 1]; this.length = this.length - 1; return last; }; } if (!Array.prototype.shift) { Array.prototype.shift = function() { if (this.length === 0) { return undefined; } var first = this[0]; for (var i = 1; i < this.length; i++) { this[i - 1] = this[i]; } this.length = this.length - 1; return first; }; } if (!Array.prototype.unshift) { Array.prototype.unshift = function() { for (var i = this.length - 1; i >= 0; i--) { this[i + arguments.length] = this[i]; } for (var j = 0; j < arguments.length; j++) { this[j] = arguments[j]; } this.length = this.length + arguments.length; return this.length; }; }
- 这样即使在不支持这些方法的环境中,也能通过自定义的方法实现相应功能。