Array 是一个全局对象
let a = ['a','b'] 等价于 let b = new Array('a','b')
var a =Array(3) 和 var a = Array(3,3) 两者的区别
一个是创建一个长度为3的数组
一个是创建一个数组,包含两个元素3,3 长度为2
var a = new Array(3) 也能创建一个长度为3大的数组
js几种数据类型的函数加不加new的区别
普通类型,不加new就是加数据转换成相应的数据类型,加new就是生成一个对象
复杂类型,加不加new都一样,都是生成一个对象
function
var f1 = function(a,b){return a+b)
var f2 = new Function('a','b','return a+b') 等价
function 和 Function 的区别(不好意思,看到之前我也很迷糊)
function 是一个关键字 if else var fucntion
Function 是一个全局对象
var 声明一个变量 var a = 1
function 声明一个函数 function f(){}
window.Object
window.Function 对象
两种声明函数的方式
1.function f(){}
2.var f = new Function('x','y','return x+y')
//变种 var f = function(x){} => var f ; f=function(x){}
字符串 String
没有string的关键字
var s = new String()
Array
什么是数组:
“抽象” 按次序排列的一组值
“js” 用Array构造出来的对象
很经典
console.dir(Array) 可以显示Array的层级结构
数组和对象的本质区别
他两最大的不同就是 _ _ proto_ _ 的指向不一样,数组指向的是Array.prototype 而对象的 - - proto - - 指向的是Object.prototype
伪数组:原型链中没有Array.prototye
arguments 就是一个伪数组
数组API
-
forEach 无返回值
a = ['a','b','c','d']
a.forEach(function(x,y,z){
console.log('value',x)
console.log('key',y)
console.log('Array',z)
})
模拟Array.forEach
function forEach(array,x){
for(let i=0;i<array.length;i++){
x(array[i],i);
}
}
forEach(['a','b','c'],function(value,key){
console.log(value,key)
})
/////////数组的forEach不同之处就在于,把array放到前面调用方法了
var arr = ['e','f','g']
arr.forEach(function(value,key){
console.log(value, key)
})
为什么自定义的forEach传入了两个参数,而Array的forEach函数只传入一个值??
‘一般情况下都把call()和this省略了,其实是存在的,所以,Array的forEach函数本质上也是传入了两个参数’
上面的回答牵强了一些,下面这个比较好理解,this 调用了本身,不需要传入参数
2.Array.sort() 快排 改变数组
排序,默认从小到大
要添加一个参数来控制排序方向,是从大到小还是从小到大
//Array.sort(function(x,y){return x-y})
var a = [1,3,2,5,4]
a.sort(function(x,y){return x-y})
//[1,2,3,4,5]
比较对象
var chengji = {小明:88,小红:75,小王:99}
undefined
a=['小明','小红','小王']
(3) ["小明", "小红", "小王"]
a.sort(function(x,y){return chengji[x]-chengji[y]})
(3) ["小红", "小明", "小王"]
3.Array.join() 数组元素拼成字符串
[1,2,3].join()
"1,2,3"
[4,5,6]+''
"4,5,6"
4.Array.concat() 数组拼接
[1,2,3]+[4,5,6]
"1,2,34,5,6"
[1,2,3].concat([4,5,6])
(6) [1, 2, 3, 4, 5, 6]
利用concat 复制一个出一个新的数组,concat会返回一个新的数组
var a =[1,2,3]
undefined
var b = a.concat()
undefined
a
(3) [1, 2, 3]
b
(3) [1, 2, 3]
a===b
false
var c = a
undefined
c
(3) [1, 2, 3]
c === a
true
4.Array.map() 遍历的效果和forEach一样,但是forEach没有返回值,而map会把每一个值经历过函数后收集起来组成一个新的数组并返回
a
(3) [1, 2, 3]
a.forEach(function(x,y,z){return x*2})
undefined
a.map(function(x,y,z){return x*2})
(3) [2, 4, 6]
a.map(value => value*2)
(3) [2, 4, 6]
5.Array.filter) 过滤 不改变原数组
var a = [1,2,3,4,5,6,7,8,9,10]
undefined
a.filter(function(value){return value>5})
(5) [6, 7, 8, 9, 10]
a
(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
6.Array.reduce()
a
(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.reduce((prev,curr) => prev+curr,0)
55
reduce(function(prev,curr){ return prev},initial)
reduce 两个参数,第一个是函数,第二个是初始的值,所以第一个prev是initial
函数接受两个参数,第一个是前一次运算的结果,第二个是当前遍历的元素
用reduce 实现map
//map 用 reduce实现
undefined
a
(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.map(function(x,y){return x*2})
(10) [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
a.reduce(function(arr,n){ arr.push(n*2);return arr},[])
(10) [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
//filter 用 reduce 实现
undefined
a
(10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.reduce(function(arr,n){ if(n>=5){arr.push(n)} return arr},[])
(6) [5, 6, 7, 8, 9, 10]
a.filter(function(x,y){ return x>=5 })
(6) [5, 6, 7, 8, 9, 10]