JavaScript的函数,其他知识点(函数式编程思想,JavaScript的数据类型,拓展运算符)


JavaScript arguments:

arguments可以在函数不指定参数的情况下返回用户所传递的参数

demo:

function sayHi() {
  if (arguments[0] == "bye") {
    return;
  }

  alert(arguments[0]);
}

也可以使用arguments.length来返回用户传递的参数个数

利用该一特性可以实现对函数的重载。

demo:

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}

doAdd(10);	//输出 "15"
doAdd(40, 20);	//输出 "60"

JavaScript函数对象:

 JavaScript中的function实际是一个功能完整的函数,

我们在平时正常定义函数demo:

function fun(x1,x2){
    return x1+x2;

}

由于函数的对象性质,可以对函数这个类进行创建函数demo:

var fun = new Function(x1,x2){
    return x1+x2;
}

亦或者:

var fun = new Function('x1','x2','return x1+x2');

在此处fun只是对函数对象的一个引用名,因此函数也可以作为变量参数传递给一个函数。

function callAnotherFunc(fnFunction, vArgument) {
  fnFunction(vArgument);
}

var doAdd = new Function("iNum", "alert(iNum + 10)");

callAnotherFunc(doAdd, 10);	//输出 "20"

虽然可以使用function类来进行创建函数,但是它的速度很慢。不过,所有函数都应看作 Function 类的实例。

函数也有length属性,它的含义是函数所期待的参数的多少demo:

function doAdd(iNum) {
  alert(iNum + 10);
}

function sayHi() {
  alert("Hi");
}

alert(doAdd.length);	//输出 "1"
alert(sayHi.length);	//输出 "0"

函数式编程:

函数式编程的意思是我们可以在一行内通过函数对数据来进行转换,也可以串联多个函数来进行操作。

 demo:

var string = 'functional programming is great';
var result = string
  .split(' ')
  .map(v => v.slice(0, 1).toUpperCase() + v.slice(1))
  .join(' ');

该实例实现了对字符串的首字母转换,串联多个函数式进行操作。

函数式编程的三个特点:无副作用(调用的时候不会对外部状态进行影响),透明引用(不会使用其他变量只会使用自身的变量),不可变变量(其修改后会生成一个新的变量)。

函数在JavaScript是一等公民,他具有数据类型,与其他数据类型处于平等的地位。


闭包(closure):

一个简单示例:

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2));  // 7
console.log(add10(2)); // 12

这个示例是经典的函数函数柯里化

柯里化又称部分求值,柯里化函数会接收一些参数,然后不会立即求值,而是继续返回一个新函数,将传入的参数通过闭包的形式保存,等到被真正求值的时候,再一次性把所有传入的参数进行求值。


JavaScript的数据类型:

JavaScript的基本数据类型被存储在栈内:例如undefined、Boolean、String、Number、null(特殊的是null使用typeof返回的是object类型)

栈内存储的是变量的值和变量的标识符

引用数据类型被存储在堆内:统称为object,又可以划分为object,array,date,function(特殊的是array使用typeof返回的是object,javascript中数组即对象,function返回的是function)

堆内存储的引用类型的值,访问引用类型的时候会先从栈中找到堆中存储引用类型的指针,之后再去堆中寻找该值。

demo:

typeof {name:'Bill', age:62} // 返回 "object"
typeof [1,2,3,4]             // 返回 "object" (并非 "array",参见下面的注释)
typeof null                  // 返回 "object"
typeof function myFunc(){}   // 返回 "function"

由该特性可以引出每个编程语言的深浅拷贝问题

直接=为浅拷贝,其单纯传递了引用类型的指针,值为一个值(数组直接等号赋值两个数组本质上相等)。

 JavaScript中的深拷贝方法:1,使用json对象实现对象深拷贝2,使用拓展运算符实现数组深拷贝3,使用递归(最不常用)

undefined与null的区别:

三等号返回false证明类型不等,双等号返回true证明值相等 

typeof undefined              // undefined
typeof null                   // object
null === undefined            // false
null == undefined             // true

JavaScript的拓展运算符与剩余运算符:

在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)

拓展运算符: 

//传递数据代替多个字符串的形式
function  test(a,b,c){
  console.log(a); // 1
  console.log(b); // 2
  console.log(c); // 3
}

var arr = [1, 2, 3];
test(...arr);

//将一个数组插入到另一个数组中
var arr1 = [1,2,3];
var arr2 = [...arr1, 4, 5, 6];
console.log(arr2); // [1, 2, 3, 4, 5, 6]

//字符串转数组
var str = 'hello';
var arr3 = [...str];
console.log(arr3); // ["h", "e", "l", "l", "o"]
————————————————
版权声明:本文为CSDN博主「webchang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43974265/article/details/113030814

其可以实现两个数组的拼接,demo:[1,2,3] = [1,...[2,3]]

剩余运算符:

//当函数参数个数不确定时,用 rest运算符
function f1(...args) {
  console.log(args); // [1,2,3]
}

f1(1,2,3);

//当函数参数个数不确定时的第二种情况
function f2(item, ...arr) {
  console.log(item); // 1
  console.log(arr);  // [2,3]
}
f2(1, 2, 3);

//rest运算符配合 解构使用
let [a,...temp]=[1, 2, 4];
console.log(a);    // 1
console.log(temp); // [2,4]
————————————————
版权声明:本文为CSDN博主「webchang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43974265/article/details/113030814

两个不同之处在于:防止赋值方的为拓展运算符,被赋值方的为剩余运算符。

拓展运算符把数组或类数组对象展开用逗号隔开,而剩余运算符则相反。


你可能感兴趣的:(前端,javascript,前端,函数式编程)