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
两个不同之处在于:防止赋值方的为拓展运算符,被赋值方的为剩余运算符。
拓展运算符把数组或类数组对象展开用逗号隔开,而剩余运算符则相反。