js基础--运算符

116 阅读3分钟

js的运算符分为:

  1. 算术运算符
  2. 赋值运算符
  3. 字符串运算符
  4. 比较运算符
  5. 条件运算符
  6. 逻辑运算符
  7. 位运算符

算术运算符就是: +(加) -(减) *(乘) /(除) %(取余) ++(自增) --(自减)

简单的就不提了,但是我印象中,我刚接触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,则返回第二个运算子的值。

位运算符

Y0jP5TWble.png

你可能会觉得位运算符?什么鬼?有什么用? 但是 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循环,就可以用到按位异或和按位与------后边我把这个算法答案补一下吧,但是我今天真的写不下去了。。。。。。。。。。啊啊啊啊啊啊啊