js的运算符分为:
- 算术运算符
- 赋值运算符
- 字符串运算符
- 比较运算符
- 条件运算符
- 逻辑运算符
- 位运算符
算术运算符就是: +(加) -(减) *(乘) /(除) %(取余) ++(自增) --(自减)
简单的就不提了,但是我印象中,我刚接触js的时候,关于自增,自减的位置不同,结果的不同总是弄不清楚。
var x, y = 5;
x = y++;
console.log(x);
console.log(y);
// x 5 ; y 6
var x, y = 5;
x = ++y;
console.log(x);
console.log(y);
// x 6 ; y 6
我记得年幼的自己看完一些文章的分析更晕了,👇后来我找了个窍门:就记凡事(++、--)符号放在后面的,那么对x的赋值就是滞后的。不管++ -- 是在什么位置,都是会改变y的。 后面嘛,那赋值就滞后呗。 其余的算术运算符,常跟算法结合在一起,整一些算法题,后边打算积累一波。
赋值运算符、字符串运算符、比较运算符、条件运算符 略
逻辑运算符
- ! 非 常用于if条件判断中,但是有的时候我们会看见这样一种写法if(!! x) ,对一个值连续做两次取反运算,等于将其转为对应的布尔值,与Boolean函数的作用相同。
!!x
// 等同于Boolean(x)
- && 与 如果用在if条件判断里面,子运算式都是true,结果才为true。
但如果用在赋值当中,比如:
var x=1,y=1,z;
z= x && (y-1);
// z 0
var x=1,y=1,z;
z= (x-1) && y;
// z 0
原则为:如果第一个子运算式的布尔值为true,就返回第二个子运算的值。如果第一个子运算式布尔值为false,那么就直接返回第一个子运算式的值
另外,在业务书写中,比如if要得到的是boolean结果,符合条件执行操作。经常看到这样的句子:
if(expression1 && expression2 && !expression3){
// dosomtihing
}
其实可以直接写成
if(!(expression1 && expression2 && expression3)){
// dosomtihing
}
- || 逻辑或
如果用在if条件判断里面,子运算式有一个是true,结果为true。都为false,结果才为false
但如果用在赋值当中,比如:
var x=1,y=1,z;
z= x || (y-1);
// z 0
var x=1,y=1,z;
z= (x-1) && y;
// z 0
原则为:如果第一个子运算式的布尔值为true,则返回第一个子运算式的值,且不再对第二个子运算式求值;如果第一个子运算式的布尔值为false,则返回第二个运算子的值。
位运算符
你可能会觉得位运算符?什么鬼?有什么用? 但是 vue3的源码中,有这样一段代码
export const enum ShapeFlags {
ELEMENT = 1,
FUNCTIONAL_COMPONENT = 1 << 1,
STATEFUL_COMPONENT = 1 << 2,
TEXT_CHILDREN = 1 << 3,
ARRAY_CHILDREN = 1 << 4,
SLOTS_CHILDREN = 1 << 5,
TELEPORT = 1 << 6,
SUSPENSE = 1 << 7,
COMPONENT_SHOULD_KEEP_ALIVE = 1 << 8,
COMPONENT_KEPT_ALIVE = 1 << 9,
COMPONENT = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT
}
对元素进行标记,看是文本节点TEXT_CHILDREN还是COMPONENT组件节点等,后边的patch,diff中都能看到ShapeFlags。 至于为什么?你来想想 位运算还有一些用处, 比如要判断一个整数是奇数还是偶数,一般都是用这个数除以2看余数,如果余数等于0,是偶数、如果等于1则是奇数:
var a=123;if(a%2===0){// 偶数} else {// 奇数}
而用位运算则可以这样来判断:
var a=123;if(a & 1 === 0){// 偶数} else {// 奇数}
再比如: 如果现在需要把一个10进制的数转成2进制,求里面的0的个数,不用for循环,就可以用到按位异或和按位与------后边我把这个算法答案补一下吧,但是我今天真的写不下去了。。。。。。。。。。啊啊啊啊啊啊啊