Javascript

深拷贝

  • 还可以通过JSON.stringfy() JSON.parse()互相转化,实现深拷贝
  • 但json数据中,不带任何方法,拷贝方法时无法实现

数组

1
2
3
4
5
6
7
8
9
var arr1 = []    //数组字面量
var arr2 = new Array() //不推荐
//通过系统内置的Array构造函数声明数组

var arr3 = Array()
var arr3 = Array(5) //数组长度为5

//所有数组都及继承于Array.prototype
var arr = [,,,,,1,1] //稀松数组
  • push 、unshift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//  返回值,执行了方法以后的数组长度
// 重写push
Array.prototype.myPush = function(){
for(var i = 0;i < arguments.length;i++){
this[this.length] = arguments[i]
}
return this.length
}
//重写unshift
Array.prototype.myUnshift = function(){
var index = 0
for(var i = 0;i< arguments.length;i++){
this.splice(index,0,arguments[i]);
index++
}
return this.length
}

Array.prototype.myUnshift2 = function(){
var argArr = Array.prototype.slice.call(arguments);
var newArr = argArr.concat(this)
return new Arr
}
  • pop、shift
1
2
3
4
5
6
//  剪切,返回剪切的值
// 没有参数
arr.pop()
arr.shift()

arr.reverse() //反转
  • splice
1
arr.splice(开始项下标,剪切长度,剪切以后最后一位开始添加数据)
  • sort
    • 按照ascii码来排列的
    • 返回值
      • 负值:a就排到前面
      • 正值:b就排到前面
      • 0:保持不动
1
2
3
4
5
6
7
8
9
sort(function(a,b){
if(a > b){
return 1
}else{
return -1
}

//等价于 return a-b
})
  • 随机排序
1
2
3
4
5
6
7
8
9
10
11
12
var arr = [1,2,3,4,5,6,7,8]

//Math.random() -> 0-1 开区间

arr.sort(function(a,b){
var rand = Math.random()
if(rand - 0.5 > 0){
return 1;
}else{
return -1;
}
})
  • 在原数组上修改
    • push、unshift、pop、shift、reverse、splice、sort
  • 不改变原数组
    • concat、toString()、slice、join、split
  • 类数组
  • 类似于数组的对象
  • 类数组的原型继承于Object、没有数组上的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var obj = {
'0':1,
'1':2,
'2':3,
'3':4,
'4':5,
'5':6,
'length':6,
'push':Array.prototype.push,
'splice':Array.prototype.splice
}
//等价于
Object.prototype.push = Array.prototype.push
Object.prototype.splice = Array.prototype.splice

Array.prototype.push = function(e){
this[this.length] = e;
this.length ++;
}
  • 重写typeof
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function myTypeof(val){
var type = typeof(val)
var toStr = Object.prototype.toString;
var res = {
'[object Array]': 'array',
'[object Object]': 'object',
'[object Number]': 'object number',
'[object String]': 'object string',
'[object Boolean]': 'object boolean',
}
if(val === null){
return 'null'
}else if(type === 'object'){
var ret = toStr.call(val)
return res[ret]
}else{
return type;
}
}