數組方法
concat
- 返回值是拼接后的數組
toString
- 將數組轉成字符串,用逗號隔開
slice(a,b) [a,b)
- 不傳值,拷貝了一份
- 不傳b,截取到最后一位
- 傳b,截取到b之前的那位
- a/b是負數(和splice一樣,最后一位是-1)
join
- 不傳參數相當于toString!用逗號連接
- 傳空字符串,去除逗號
split(a,b) - (字符串方法)
- 不傳值,會將整個字符串放進數組
- 第二個參數b,是用a分割后截取b位
類數組
- 函數的實參arguments
- dom數組
- 沒有數組方法,因為沒有繼承Array.prototype,繼承Object.prototype
- 類數組的原型
function test() {console.log(arguments)console.log(arguments.toString())
}
test(1, 2, 3)
- 改變原型
function test() {console.log(arguments)arguments.__proto__ = Array.prototypeconsole.log(arguments.toString())
}
test(1, 2, 3)
- 對象轉類數組:給對象加splice屬性,對象的原型依然是Object.prototype
function test() {console.log(arguments)
}
test(1, 2, 3)
var obj = {'0': 1,'1': 2,'2': 3,'length': 6
}
console.log(obj)
function test() {console.log(arguments)
}
test(1, 2, 3)
var obj = {'0': 1,'1': 2,'2': 3,'length': 3,'splice': Array.prototype.splice
}
console.log(obj)
- 調用對象上添加的方法
var obj = {'0': 1,'1': 2,'2': 3,'length': 3,'splice': Array.prototype.splice
}
console.log(obj.splice(3, 0, 4))
console.log(obj)
console.log(Object.prototype.toString.call(obj))
obj['push'] = Array.prototype.push
console.log(obj.push(5))
console.log(obj)
console.log(Object.prototype.toString.call(obj))
- 只添加push方法也能調用,但不會轉成[]的形式
- 還可以在Object.prototype上添加數組方法(這樣所有對象都會變成類數組)
- 這種形式有什么實際意義:恐怕就是,對于類數組形式的對象,對他們進行push操作后,可以通過length屬性獲取長度。注意,對象依然是沒有部署iterator接口的,不能使用for…of
var obj = {'0': 1,'1': 2,'2': 3,'length': 3,'push': Array.prototype.push
}
console.log(obj.push(5))
console.log(obj)
- push的原理
- length屬性決定了類數組的長度,push開始的位置
將類數組轉換成數組
Array.prototype.slice.call(arguments)
練習
- 手寫數組去重
// 注意 key都是字符串類型!可以用在字符串去重
var arr = [0, 1, 2, 3, 'A', 'B', 'c', 2, 3, 'A', 1, 2, 3]
Array.prototype.unique = function () {var obj = {}var res = []for (var i = 0; i < this.length; i++) {// 沒有判斷是否重復,重復了就去覆蓋var key = this[i]obj[key] = key}for (var k in obj) {res.push(obj[k])}return res
}
console.log(arr.unique()) // [0, 1, 2, 3, "A", "B", "c"]
- 優化、減少循環次數
var arr = [0, 1, 2, 3, 'A', 'B', 'c', 2, 3, 'A', 1, 2, 3]
Array.prototype.unique = function () {var obj = {}var res = []for (var i = 0; i < this.length; i++) {// 沒有判斷是否重復,重復了就去覆蓋var key = this[i]if (!obj.hasOwnProperty(key)) {obj[key] = keyres.push(key)}}return res
}
console.log(arr.unique()) // [0, 1, 2, 3, "A", "B", "c"]
- 封裝typeof 能區分null、基本包裝類
// typeof 本身就能返回function!
function myTypeOf(val) {var temp = ['[object Null]', '[object Function]', '[object Array]', '[object Object]']var baseType = typeof (val)var cmpType = Object.prototype.toString.call(val)if (baseType != 'object') {return baseType} else {return temp.includes(cmpType) ? getName(cmpType) : cmpType}
}
// 可以改成用枚舉去映射
function getName(str) {return str.split(' ').slice(-1)[0].slice(0, -1).toLocaleLowerCase()
}
console.log('null', myTypeOf(null))
console.log('undefined', myTypeOf(undefined))
console.log('number', myTypeOf(1))
console.log('string', myTypeOf('null'))
console.log('boolean', myTypeOf(true))
console.log('fn', myTypeOf(function () { }))
console.log('obj', myTypeOf({ a: 1 }))
console.log('arr', myTypeOf([1]))
console.log('new Boolean', myTypeOf(new Boolean(1)))
console.log('new Number', myTypeOf(new Number('1')))
console.log('new String', myTypeOf(new String(1)))
- 找出字符串中不重復的
var str = 'dsjfhdkjshfkdj0shfc0bkjkja'
function getStr() {let obj = {}let res = ''for (var i = 0; i < str.length; i++) {let val = str[i]if (!obj.hasOwnProperty(val)) {obj[val] = 1} else {obj[val] += 1}}for (var k in obj) {if (obj[k] === 1) {res += k}}return res
}
console.log(getStr(str)) // cba
or
var str = 'dsjfhdkjshfkdj0shfc0bkjkja'
function getStr() {var res = ''for (var i = 0; i < str.length; i++) {var cur = str[i]if (str.indexOf(cur) == str.lastIndexOf(cur)) {res += cur}}return res
}
console.log(getStr(str)) // cba