上篇文章我们讲了jsd的原型及原型链的概念,以及他们之间的区别。我们知道了js在内存中有一个全局的对象window对象(注意是全局的对象,而不是全局对象)。其中window对象中包含标准库和非标准库,他们的关系如下图:
这篇文章就来讲讲window对象中的标注库里面的几个对象。
window标准库包括:
Number对象、String对象、Boolean对象、Array对象、Function对象、Object对象、Math对象、Date对象、JSON对象.RegExp对象。这些对象不仅是对象他们还是构造函数,添加new 关键字即可构造出相对应的实例。
!!这里要讲一些他们的区别:
* 基本类型所对应的标准库里对象使用new 和不适用new 构造出的对象是不一样的
(如:number、string、Boolean)。
* 基本数据类型不加new会返回对应类型的常量,加new 会返回对应的包装对象
* 发咋数据类型所对应的对象加不加new构造出对象都是一样的。
注意function是和var一样的用来声明的关键字,而Function则是全局的对象。
1.Array
1.Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。
2.数组和对象都是对象,只不过他们的原型不一样
3.伪数组:是一个类似于数组的对象。但是其proto不指向Array.prototype(也就是说其原型链中没有Array.prototype这一节点)
目前我们能见到的伪数组:函数参数所存的的arguement伪数组。他的proto直接指向Object.prototype;
1.1 数组的一些方法
1.1.2 静态方法
Array.isArray()
返回一个布尔值,表示参数是否为数组。它可以弥补typeof运算符的不足
1.1.2 实例方法
1 .forEach()
array.forEach(callback(currentValue, index, array){
//do something
}, this)
2 sort()
arr.sort(function(a,b){
return a-b //生序排列
})
例子:
var a=["马云","马化腾","李彦宏"];
var hash={
"马云":123,
"马化腾":456,
"李彦宏":525
}
a.sort(function(x,y){
return hash[x]-hash[y];
})
会改变自身
3.arr.join("连接符");
4.arr.concat(arr1);
利用concat复制数组(深复制)
var arr2=arr.concat();
5.map()
var a= arr.map(function(value,index,arr){
return value*2;
})
有返回值,返回值为被操作后的新数组;和froEach类似,但forEach没有返回值
7.filter()
arr.filter(function(value.index,arr){
return value>0;
})
返回一个符合规则的新数组
8.reduce()
arr.reduce(function(pre,cur){
return pre+cur
},0)
初始化pre=0;
返回一个新数组
reduce的map用法
arr.reduce(function(arr2,cur){
arr.push(cur**9);
return arr
},[])
reduce的filter用法
arr.reduce(function(arr1,cur){
if(cur%2===0){arr.push(cur)};return arr
},[])
2..函数
2.1 函数的声明方式
1.function f (){} //具名函数
2.var f=function(){} //匿名函数
3.var a=function f(){} //具名函数赋值
4.var f=new Function("x","y","return x+y") //Window.Function
5.var f =(x,y)=>{return x+y} //箭头函
var a=(x,y)=>{return x+y};
如果只执行一句话
可以简写为:
var a=(x,y)=>x+y;
如果参数只有一个,可以简写为:
var a= x=>x*x;
2.2 五种函数的name属性
2.3 函数的调用
f(x,y);不推荐
f.call(undefined,x,y)推荐
**call的第一个参数可以用this得到(this就是call的第一参数)
**call的后面的参数可以用arguments得到
普通模式下,如果this是undefined,则浏览器会让其指向window。
然而this在这里并没有卵用
2.4 调用堆栈
3.作用域
!!!要特别注意,变量的提升问题,(var声明的变量(var a=0是两步,1.var a;2.a=0;)和function声明的函数)
运行时他们会被优先执行。
闭包:如果一个函数使用了他作用域以外的变量,那么这个函数+这个变量就叫闭包。