function 基础运用

sort排序,此处列子为a-b为升序,b-a为降序
let arr = [1,564,46,12,4,-455,];
console.log(arr.sort(function(a,b){
    return b-a;
}))

同上,这是升序,-1和1替换一下则为降序
let arr = [1,654,13,41,3,4,5]
console.log(arr.sort(function(a,b){
    if(a<b){
        return -1;
    }else if (a>b){
        return 1 ;
    }else{
        return 0;
    }
}))

infex 用法
let arr = ["h","e","l","l","o"];
console.log(arr.indexOf("l"))//此处是2;则为正数下标为2的位置;
console.log(arr.lastIndexOf("l"))//此处为3,为倒着找却正着数下标,在小标为3处;
console.log(arr.indexOf("z"))//找不到,则为-1;

let arr = ["1,","2","3"]
console.log(arr.indexOf(1));//此处为-1;是使用全等比较

// includes 用于查看数组是否包含某个元素,包含则返回true,否则返回false
let arr = ["1","2","3"]
console.log(arr.includes(2));//false
console.log(arr.includes("2"));//true
console.log(arr.includes(7));//false

// indexof去重
let str = [];
let arr = [1,2,6,1,2,3,1,5,2,3,1]
for(i=0;i<arr.length;i++){
    if(str.indexOf(arr[i])==-1){
        str.push(arr[i])
    }
}console.log(str)

includes去重
let arr = [1,2,3,4,1,2,3,4,1,2,3]
let str = [];
for(i=0;i<arr.length;i++){
    if(str.includes(arr[i])==false){
        str.push(arr[i])
    }
}
console.log(str);


集合
let s1 = new Set();
let s2 = new Set([1,2,3])
console.log(s1);
console.log(s2)


let s1 = new Set();
s1.add(1);
console.log(s1);
s1.add(2).add(3).add(4);
console.log(s1)

//也可直接传入数组
let s1 = new Set();
s1.add([1,2,3,4]);
console.log(s1)

// delete 删除某个元素,就算数组里面没有这个元素也不会报错
// 不可删除数组
let s1 = new Set([1,2,3]);
s1.delete(2);
console.log(s1);
s1.delete(4);
console.log(s1);

// clear一次性删除所有元素
let s1 = new Set([1,2,3,4])
s1.clear();
console.log(s1);

// for-of可以对集合进行遍历
let s = new Set([1,2,3,4,5,6]);
for(let i of s){
    console.log(i);
}

//...元素,可以将集合转为数组
let s1 = new Set([1,2,3]);
console.log(s1);
let arr = [...s1];
console.log(arr);

//集合转数组去重
let arr = [1,2.,3,1,2,3,1,5,2,3,41,3,1];
let str = new Set(arr);
let s = [...str]
console.log(s)

//映射,先创建一个空的map对象,向里面添加元素用set,要从集合中获取信息用get
let a = new Map();
a.set("name","wangweijian");
a.set("age",21);
console.log(a)//Map { 'name' => 'wangweijian', 'age' => 21 }
console.log (a.get("name"))//wangweijian

// 在对象中,无法用对象作为对象属性的键名,但是在map映射中,却可以这样做,可以这么说
// 在map映射里面可以使用任意数据类型来作为键;
let a = new Map();
a.set({},"wangweijian");
a.set([1,2,3],21);
a.set([3554],21);
console.log(a);//Map { {} => 'wangweijian', [ 1, 2, 3 ] => 21, [ 3554 ] => 21 }

//映射转为数组
//map结构转为数组结构,比较快速的方法还是使用前面介绍过的扩展运算符...。
let arr = [["name","wangweijian"],["age",21]];
let w = new Map(arr);
console.log([...w.keys()]);//[ 'name', 'age' ]只显示键
console.log([...w.values()]);//[ 'wangweijian', 21 ]只显示值
console.log([...w.entries()]);//[ [ 'name', 'wangweijian' ], [ 'age', 21 ] ]显示键和值
console.log([...w])//[ [ 'name', 'wangweijian' ], [ 'age', 21 ] ]显示键和值


函数
function test(name){
    console.log("Hello," + name);
}
test("wangweijian");//Hello,wangweijian

声明函数体
let test = function(name){
    console.log("Hello,"+name);
}
test("wangweijian");//Hello,wangweijian

// arguments主要用途是用于保护传入到函数的实际参数
function text(x){
    for(let i = 0;i<arguments.length;i++){
        console.log(arguments[i])
    }
}
text(1,2,3);
//1
//2
//3

// 伪数组对象,就是长得像数组的对象而已,但是并不是真的数组,我们可以证明这一点
function test (x){
    arguments.push(100);//针对伪数组对象使用数组的方法
}
test(1,2,3)//TypeError: arguments.push is not a function
//它不是数组

//不定参数是在最后一个参数前面添加三个点,如果不是放在最后会直接报错,
// 如:function test(...a,b),会将所有实参放入到一个数组里面,如:
function test(a,...b){
    console.log(a);//1
    console.log(b);//[2,3,4,5,6,7,8]
}
test(1,2,3,4,5,6,7,8)

//这里的不定参数就是一个真正的数组,可以使用数组的相关方法
function text(a,...b){
    console.log(a);//1
    console.log(b)//[ 2, 3, 4, 5, 6 ]
    b.push(122);
    console.log(b);//[ 2, 3, 4, 5, 6, 122 ]此处使用了数组的push加入了元素122
}
text(1,2,3,4,5,6)

// 默认参数ES6新增
function text(name="world"){
    console.log("Hello,"+name);
}
text("wangweijian");//Hello,wangweijian
text()//Hello,world

//如果参数是一个数组,腰围这个数组设置默认值的话,写法稍微有些不同:如:
let fn = function([a=1,b=2]=[]){
    console.log(a,b);
}
fn()//1 2
fn([3,4])//3 4

//包括后面我们要介绍的对象,也是可以设动默认值的,但是写法和上面类似
let fn = function({name="wangweijian",age=18}={}){
    console.log(name,age);
}
fn();//wangweijian 18
fn({name:"song",age:20});//song 20

//length属性
let test = function(a,b,c){
    console.log(arguments.length);//5实际参数的个数
    console.log(arguments.callee.length);//3形式参数的个数
}
test(1,2,3,4,5)

 

Caller属性并不是arguments对象的,而是函数对象本身的属性,它显示了函数的调用者,如果函数是在全局执行环境中(浏览器)被调用,那么它的值为null,如果在另一个函数中被调用,它的值就是那个函数。

全局执行环境中被调用:

浏览器中:

<body>

   <script>        

let test = function(){            

console.log(test.caller);        }        

test();//null   

  </script>

</body>

Node

let test = function(){    

console.log(test.caller);

}

 test();//[Function]

被一个函数所调用:

let test = function(){    

let test2 = function(){       

  console.log(test2.caller);

        //[Function: test]      

  // ฎ因为这个函数的调用者是text函数

}    

test2();

}

test();

 

Calleearguments对象的一个属性,该属性是一个指针,指向拥有这个arguments对象的函数

let test = function(){

let test2 = function(){

let test3 = function(){

console.log(arguments.callee);

//[Function: test3]

}

Test3();

}

Text2();

}

Test();

callee的作用在于能够找到arguments对象所属的函数,不让函数的执行和函数名仅仅的关联在一起,我们来看下面这个例子

//计算阶乘的递归函数

let test = function(i){

if(i == 1){

return 1;

}else{

Return  i * test(i-1);//这里就和函数名紧紧的关联了起来

}

}

console.log(test(3));

如果我们把上面的写法稍作修改,就可以看到上面写法的缺陷

//计算阶乘的递归函数

let test = function(i){

if(i == 1){

return 1;

 }else{

return i * test(i-1);//这里就和函数名紧紧的关联起来

}

}

let test2 = test;//将阶乘函数赋值给text2

//改变test这个阶乘函数的函数体

test = function(){

  console.log(" 我已经改变”};

}

console.log(test2(3));

//我已经改变了

//NaN

 

所以,这个时候就可以使用arguments对象的callee属性来降低这种关联

//计算阶乘的递归函数

let test = function(i){

if(i == 1){

return 1;

}else{

return i * arguments.callee(i-1)//callee指向拥有arguments对象的函数

}

}

let test2 = test//j将阶乘函数赋值给test2

//改变test这个阶乘函数的函数体

test = function(){

 console.log(" 我已经改变了“);

}

console.log(test2(3))//6

原文地址:https://www.cnblogs.com/wwjljwx/p/11119180.html