一、感叹号
1. 一个感叹号
一个感叹号(!)最好理解,也是我们经常使用的。!可以将变量转为boolean值,所有的truthy和falsy都可以被转化,比如null、undefined、数字0和空字符串取反都为true,其余都为false。
!null = true
!undefined = true
!"" = true
!0 = true
!100 = false
!"asdss" = false
注意:truthy和falsy不是true和false
2. 两个感叹号
两个感叹号(!!),学习时比较少见到,通常用来判断变量是不是truthy或者falsy,这么说好像和前面一样?不,一个感叹号只是单个判断比如只对null或者只对undefined,使用两个!!可以对所有truthy和falsy判断,比如:
let a; // null、undefined、‘‘、0
if (a !== null && typeof(a) !== "undefined" &&
a !== undefined && a !== ‘‘ && a !== 0){
//a为truthy时才执行,或者说a为真值时才执行
}
let a;
if(!!a){
//a为truthy时才执行,或者说a为真值时才执行
}
这两种方法的功能一样,但是明显下面一种更加简洁。
备注:好像还有三个!!!的,但是并没有什么用处。似乎是将1和2都做了一遍,然后回到原点。
以上参考原文链接:https://blog.csdn.net/weixin_40877427/article/details/85627780
二、3个点(…)
1、说明
3个点(…)是js扩展运算符(spread),用于传参时可以看作是Rest参数的逆运算,将一个数组转为用逗号分隔的参数数组,就是说将参数数组展开了传入函数中。
let a = [1,2,3]
function f(x1,x2,x3){
...
}
f(...a) // 等价于 f(1,2,3)
(备注:)Rest参数和arguments对象的区别:
rest参数只包括那些没有给出名称的参数,arguments包含所有参数
arguments 对象不是真正的数组,而rest 参数是数组实例,可以直接应用sort, map, forEach, pop等方法
arguments 对象拥有一些自己额外的功能
当用于函数形参时,后面就不能有其他参数,如下将会报错
function func(a, ...b, c) {
// ...
}
// Rest parameter must be last formal parameter
2、作用
将一个数组转为用逗号分隔的参数序列。
例子1:该运算符主要用于函数调用。
function
add(x, y) {
return
x + y;
}
var
numbers = [4, 38];
add(...numbers)
// 42
例子2:扩展运算符取代apply方法的一个实际的例子,应用Math.max方法,简化求出一个数组最大元素的写法。
// ES5 的写法
Math.max.apply(
null
, [14, 3, 77])
// ES6 的写法
Math.max(...[14, 3, 77])
// 等同于
Math.max(14, 3, 77);
例子3:通过push函数,将一个数组添加到另一个数组的尾部
// ES5的 写法
var
arr1 = [0, 1, 2];
var
arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);
// ES6 的写法
var
arr1 = [0, 1, 2];
var
arr2 = [3, 4, 5];
arr1.push(...arr2);
例子4:合并数组
// ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]
var
arr1 = [
‘a‘
,
‘b‘
];
var
arr2 = [
‘c‘
];
var
arr3 = [
‘d‘
,
‘e‘
];
// ES5的合并数组
arr1.concat(arr2, arr3);
// [ ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘ ]
// ES6的合并数组
[...arr1, ...arr2, ...arr3]
// [ ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘ ]
例子5:扩展运算符将字符串转为真正的数组
[...
‘hello‘
]
// [ "h", "e", "l", "l", "o" ]
以上参考原文链接:https://www.cnblogs.com/wangyunhui/p/7511615.html