内置对象
概述
js中的对象分为3种:自定义对象,内置对象,浏览器对象
前面两种对象是js基础的内容,属于ECMAScript;第三个浏览器对象属于我们js独有的(到JS API会讲解)
内置对象就是值JS语言自带的一些对象,这些对象共开发者使用,并提高了一些常用的或最基本而必要的功能(属性和方法)
内置对象最大的优点就是帮助我们快速开发
js提供了多个内置对象:Math,Date,Array,String等
要弄懂:
该方法具体是实现什么功能的
参数是什么,有几个
有没有返回值,返回值是什么
会不会改变原来的值
内置对象的方法有点多,不过本章节后续会有一些比较常用的内置对象的方法的介绍和自己封装一个跟其一样的方法
Array
isArray
var arr = [2, 31, 123, 1]
console.log(Array.isArray(arr))
Array.isArray_h = function(obj) {
return obj instanceof Array
}
console.log(Array.isArray_h(arr))
indexOf/lastIndexOf
- 以 indexOf为例,lastIndexOf的查找顺序相反,参数用法一样
var arr = [2, 313, 112, 31, 231, 1, 3, 33, 3, 3, 0]
console.log(arr.indexOf(3))
console.log(arr.indexOf(3, 10))
console.log(arr.indexOf(3, 11))
console.log(arr.indexOf(3, 8))
console.log(arr.indexOf(3, -1))
console.log(arr.indexOf(3, -3))
console.log(arr.indexOf(3, -100))
Array.prototype.indexOf_h = function(searchElement, fromIndex = 0) {
fromIndex = (fromIndex < 0 ? this.length + fromIndex : fromIndex) < 0 ? 0 : (fromIndex < 0 ? this.length + fromIndex : fromIndex)
for (var i = fromIndex; i < this.length; i++) {
if (this[i] === searchElement) {
return i
}
}
return -1
}
console.log('------------------------------------')
console.log(arr.indexOf_h(3))
console.log(arr.indexOf_h(3, 10))
console.log(arr.indexOf_h(3, 11))
console.log(arr.indexOf_h(3, 8))
console.log(arr.indexOf_h(3, -1))
console.log(arr.indexOf_h(3, -3))
console.log(arr.indexOf_h(3, -100))
pop/shift
var arr = [2, 31, 11, 23, 1]
var arr2 = [2, 31, 11, 23, 1]
var arr1 = []
console.log(arr.pop(arr))
console.log(arr)
console.log(arr1.pop())
console.log(arr1)
Array.prototype.pop_h = function() {
if (this.length) {
var el = this[this.length - 1]
this.length = this.length - 1
return el
} else {
return undefined
}
}
console.log('-----------------------------')
console.log(arr2.pop_h())
console.log(arr2)
console.log(arr1.pop_h())
console.log(arr1)
var arr = [1, 231, 1231, 1111]
var arr1 = [1, 231, 1231, 1111]
console.log(arr.shift())
console.log(arr)
Array.prototype.shift_h = function() {
if (this.length) {
var el = this[0]
for (var i = 1; i < this.length; i++) {
this[i - 1] = this[i]
}
this.length = this.length - 1
return el
} else {
return undefined
}
}
console.log('------------------------')
console.log(arr1.shift_h())
console.log(arr1)
push/unshift
var arr = [1, 231, 1231, 1111]
var arr1 = [1, 231, 1231, 1111]
console.log(arr.unshift('a', 'b'))
console.log(arr)
Array.prototype.unshift_h = function() {
var arr = [...arguments, ...this]
for (var i = 0; i < arr.length; i++) {
this[i] = arr[i]
}
return this.length
}
console.log('-----------------------')
console.log(arr1.unshift_h('a', 'b'))
console.log(arr1)
concat
let arr = [1, 2, 3]
let arr1 = arr.concat()
let arr2 = arr.concat(1)
let arr3 = arr.concat(1, [1, 2, 3])
let arr4 = arr.concat(1, [1, 2, 3, [5, 2]])
console.log(arr1)
console.log(arr2)
console.log(arr3)
console.log(arr4);
console.log(arr)
console.log('----------------------------------------------')
Array.prototype.concat_h = function() {
let newArr = [...this]
let qur = [...arguments]
qur.forEach(v => {
if (Array.isArray(v)) {
for (let i = 0; i < v.length; i++) {
newArr.push(v[i])
}
} else {
newArr.push(v)
}
})
return newArr
}
let arr5 = arr.concat()
let arr6 = arr.concat(1)
let arr7 = arr.concat(1, [1, 2, 3])
let arr8 = arr.concat(1, [1, 2, 3, [5, 2]])
console.log(arr5)
console.log(arr6)
console.log(arr7)
console.log(arr8);
console.log(arr)
every/some
- 以every为例子,some相反,some只有有一个元素满足条件则可,空数组返回false
let arr = [10, 20, 10]
let arr1 = []
console.log(arr.every(v => v > 1))
console.log(arr.every(v => v > 10))
console.log(arr1.every(v => v > 10))
console.log(arr)
console.log('-------------------------');
Array.prototype.every_h = function(fn, thisArg) {
thisArg = thisArg ? thisArg : this
let r = true
for (var i = 0; i < this.length; i++) {
r = fn.call(thisArg, this[i], i, this)
if (!r) return r
}
return r
}
console.log(arr.every_h(v => v > 1))
console.log(arr.every_h(v => v > 10))
console.log(arr1.every_h(v => v > 10))
console.log(arr)
filter
let arr = [{
name: '李华',
sex: 1
}, {
name: '李华1',
sex: 1
}, {
name: '李华2',
sex: 2
}, {
name: '李华3',
sex: 1
}, ]
let arr1 = []
let newArr = arr.filter(v => v.sex == 1)
let newArr1 = arr1.filter(v => v.sex == 1)
let newArr2 = arr.filter(v => v.sex == 3)
console.log(newArr)
console.log(newArr1)
console.log(newArr2)
console.log(arr)
console.log(arr1)
console.log('---------------------------------');
Array.prototype.filter_h = function(fn, thisArg) {
thisArg = thisArg ? thisArg : this
let r = true
const newArr = []
for (var i = 0; i < this.length; i++) {
r = fn.call(thisArg, this[i], i, this)
if (r) {
newArr.push(this[i])
}
}
return newArr
}
let newArr3 = arr.filter_h(v => v.sex == 1)
let newArr4 = arr1.filter_h(v => v.sex == 1)
let newArr5 = arr.filter_h(v => v.sex == 3)
console.log(newArr3)
console.log(newArr4)
console.log(newArr5)
console.log(arr)
console.log(arr1)
find/findIndex
let arr = [2, 1313, 11, 3, 2]
let arr1 = [{
name: '李华',
id: 2
}, {
name: '李华',
id: 3
}, {
name: '李华1',
id: 4
}, ]
let arr2 = []
console.log(arr.find(v => v == 3))
console.log(arr1.find(v => v.name == '李华'))
console.log(arr2.find(v => v.name == '李华'))
console.log('-----------------------------------------')
Array.prototype.find_h = function(fn, thisArg) {
thisArg = thisArg ? thisArg : this
for (let i = 0; i < this.length; i++) {
if (fn.call(thisArg, this[i], i, this)) {
return this[i]
}
}
}
console.log(arr.find_h(v => v == 3))
console.log(arr1.find_h(v => v.name == '李华'))
console.log(arr2.find_h(v => v.name == '李华'))
forEach
let arr = [1, 2, 3, 4]
let arr1 = [{
id: 1
}, {
id: 2
}, {
id: 3
}, ]
let sun = 0
arr.forEach(v => {
sun += v
})
arr1.forEach(v => {
v.key = v.id
})
console.log(sun)
console.log(arr1)
Array.prototype.forEach_h = function(fn, thisArg) {
thisArg = thisArg ? thisArg : this
for (var i = 0; i < this.length; i++) {
fn.call(thisArg, this[i], i, this)
}
}
let sun1 = 0
arr.forEach_h(v => {
sun1 += v
})
arr1.forEach_h(function(v, i, arr) {
console.log(v)
console.log(i)
console.log(arr)
console.log(this)
})
console.log(sun)
includes
join
let arr = [1, 2, 3]
let arr1 = []
console.log(arr.join())
console.log(arr.join(''))
console.log(arr.join('-'))
console.log(arr1.join('-'))
console.log('-------------------------');
Array.prototype.forEach_h = function(fn, thisArg) {
thisArg = thisArg ? thisArg : this
for (var i = 0; i < this.length; i++) {
fn.call(thisArg, this[i], i, this)
}
};
Array.prototype.join_h = function(separator) {
let str = ''
separator = separator != undefined ? separator : ','
this.forEach_h(v => {
str = str + v + separator
})
str = separator ? str.substring(0, str.length - 1) : str
return str
}
console.log(arr.join_h())
console.log(arr.join_h(''))
console.log(arr.join_h('-'))
console.log(arr1.join_h('-'))
slice
let arr = [1, 2, 3, 4, 5, 6, 7, 8]
console.log(arr.slice())
console.log(arr.slice(1))
console.log(arr.slice(-1))
console.log(arr.slice(-10));
console.log(arr.slice(4, 2));
console.log(arr.slice(4, -2));
console.log(arr.slice(4, -5));
console.log('----------------------------------------')
Array.prototype.slice_h = function(begin, end) {
begin = begin ? begin : 0
begin = begin < 0 ? this.length + begin : begin
begin = begin < 0 ? 0 : begin
end = end ? end : this.length
end = end < 0 ? this.length + end : end
let newArr = []
for (var i = begin; i < end; i++) {
newArr.push(this[i])
}
return newArr
}
console.log(arr.slice_h())
console.log(arr.slice_h(1))
console.log(arr.slice_h(-1))
console.log(arr.slice_h(-10));
console.log(arr.slice_h(4, 2));
console.log(arr.slice_h(4, -2));
console.log(arr.slice_h(4, -5));
splice
let arr = [23, 123, 1, 31, 21, 23, 0]
console.log(arr.splice(1, -2, 'a'), '被删除的')
console.log(arr, '改变后的')
console.log('------------------------------')
let arr1 = [23, 123, 1, 31, 21, 23, 0]
Array.prototype.splice_h = function() {
let pr = [...arguments]
let start = pr[0]
start = start < 0 ? this.length + start : start
start = start > 0 ? start : 0
if (start == undefined) return []
let deleteCount = pr[1]
deleteCount = deleteCount != undefined ? deleteCount : this.length
deleteCount = deleteCount > 0 ? deleteCount : 0
let itemArr = pr.slice(2)
let deleteCountArr = []
let newArr = []
newArr = [...this.slice(0, start)]
if (deleteCount >= 0) {
deleteCountArr = this.slice(start, start + deleteCount)
}
newArr = [...newArr, ...itemArr, ...this.slice(start + deleteCount)]
deleteCountArr.forEach((v, i) => {
this[i] = v
})
this.length = 0
newArr.forEach((v, i) => {
this[i] = v
})
return deleteCountArr
}
console.log(arr1.splice_h(1, 2, 'a'), '被删除的')
console.log(arr1, '改变后的')
reverse
let arr = [1, 2, 3, 4]
console.log(arr.reverse())
console.log(arr)
console.log('--------------------------------------')
Array.prototype.reverse_h = function() {
for (var i = 0; i < this.length / 2; i++) {
var tp = this[i]
this[i] = this[this.length - 1 - i]
this[this.length - 1 - i] = tp
}
return this
}
console.log(arr.reverse())
console.log(arr)
sort
let arr = [23, 123, 1, 31, 21, 23, 0]
let arr1 = [{
age: 10
}, {
age: 2
}, {
age: 1
}, {
age: 30
}];
Array.prototype.sort_h = function(fn) {
for (var i = 0; i < this.length - 1; i++) {
for (var k = 0; k < this.length - 1 - i; k++) {
var f = fn(this[k], this[k + 1])
if (f > 0) {
var tp = this[k]
this[k] = this[k + 1]
this[k + 1] = tp
}
}
}
return this
}
console.log(arr.sort_h((a, b) => a - b))
console.log(arr1.sort_h((a, b) => b.age - a.age))
flat
let arr = [1, 2, 3, [4, 5, [6, 7, [8, 9]]]]
console.log(arr.flat(1))
console.log(arr.flat(2))
console.log(arr.flat(Infinity))
console.log('-----------------------------------------')
Array.prototype.flat_h = function(num = 1) {
const res = [];
let _this = this;
(function fn(_this, num) {
_this.forEach((item) => {
if (Array.isArray(item) && num > 0) {
res.concat(fn(item, num - 1))
} else {
res.concat(item)
}
})
})(_this, num)
return res;
}
console.log(arr.flat_h(1))
console.log(arr.flat_h(2))
console.log(arr.flat_h(Infinity))