公司动态
JavaScript:运算符
第三阶段运算符赋值运算符基本赋值let a 5;相加后赋值let b 3; b 2; // b 变为 5-相减后赋值let c 5; c- 2; // c 变为 3*相乘后赋值let d 2; d * 3; // d 变为 6/相除后赋值let e 6; e / 2; // e 变为 3%取模后赋值let f 5; f % 2; // f 变为 1**「ES6」幂运算后赋值let g 2; g ** 3; // g 变为 8「ES6」逻辑与后赋值如果左边为真才赋值右边的值。let h true; let i 5; h i; // h 变为 5||「ES6」逻辑或后赋值如果左边为假才赋值右边的值。let j false; let k 10; j || k; // j 变为 10??「ES6」空值合并后赋值如果左边为null或undefined才赋值右边的值。let l; l?? 20; // l 变为 20算术运算符± * / %加、减、乘、除、取模。let result1 5 3; // 8let result2 5- 3; // 2let result3 5 * 3; // 15let result4 5 / 3; // 1.666...let result5 5 % 3; // 2 自增、-- 自减/-- 在后先使用再 /-- let m 3; let n m; // n 为 3m 变为 4/-- 在前先 /-- 再使用let o 3; let p --o; // p 为 2o 变为 2*幂运算「ES6」*let q 2 ** 3; // 8比较运算符 大于、小于、大于等于、小于等于。let r 5 3; // truelet s 5 3; // false 宽松相等、 严格相等会进行类型转换再比较不进行类型转换直接比较类型和值都必须相等才为真。let t1 5 5; // truelet t2 5 5; // false!、!宽松不等、严格不等。let u1 5! 3; // truelet u2 5! 5; // true逻辑运算符 与两边都为真才为真。console.log(true false); // false|| 或只要一边为真就为真。console.log(true || false); // true! 非取反。console.log(!true); // false空值合并运算符「ES6」如果左边值为null或undefined返回右边值否则返回左边值。let w1 null?? 10; // 10let w2 5?? 10; // 5可选链操作符.「ES6」对象. 属性安全访问对象属性若对象为null或undefined不会报错。let obj {sub: {prop: value}}; let value obj?.sub?.prop; // value 为 value数组.[]安全访问数组元素。let arr [1, 2]; let element arr?.[1]; // element 为 2如果arr为null或undefined返回undefined函数.()安全调用函数。let func; let res func?.(); // res 为 undefined如果func为null或undefined不会报错而是返回undefined三元运算符 条件a : b如果条件为真返回a为假返回b。let x 5 3? yes : no; // yes位运算符按位与对每一位进行与运算对应位都为 1 才为 1。let y1 5 3; // 15 的二进制是 1013 的二进制是 011按位与后为 001 即 1|按位或对每一位进行或运算对应位有一个为 1 就为 1。let y2 5 | 3; // 7二进制运算101 | 011 111 即 7^按位异或对每一位进行异或运算对应位不同为 1相同为 0。let y3 5 ^ 3; // 6二进制101 ^ 011 110 即 6~按位取反对每一位取反。let y4 ~5; //-65 的二进制 101 取反为 010在 JavaScript 中以补码形式表示负数010 补码为 110 即-6 左移将二进制数左移指定位数右边补 0、有符号右移将二进制数右移指定位数左边补符号位、无符号右移将二进制数右移指定位数左边补 0。let y5 5 1; // 105 的二进制 101 左移一位为 1010 即 10逗号运算符从左到右计算表达式返回最后一个表达式的值。let z1 (1 2, 3 4); // 7in 运算符检测属性是否存在对象。let person {name: John}; let hasName name in person; // truedelete 运算符删除对象属性。let person2 {age: 30}; delete person2.age; // person2 变为 {}new 运算符实例化构造函数。function Animal() {}; let myAnimal new Animal();展开运算符 …「ES6」数组展开将数组展开成多个元素。例如constarr1[1,2];constarr2[...arr1,3,4];console.log(arr2);// [1, 2, 3, 4]对象展开将对象展开成多个键值对。例如constobj1{name:Tom};constobj2{...obj1,age:20};console.log(obj2);// {name: Tom, age: 20}函数传参展开将数组展开作为函数参数。例如functionadd(a,b){returnab;}constnumbers[3,5];constresultadd(...numbers);console.log(result);// 8运算优先级、括号改变优先级规则优先级从高到低括号()最高其次是一元运算符如!、、--等然后是算术运算符*、/、%高于、-接着是比较运算符再是逻辑运算符高于||最后是赋值运算符。括号可以改变优先级例如(2 3) * 4先计算括号内的加法再进行乘法。实战练习对比 与 多组测试用例展开运算符合并数组、合并对象、函数传参思考题|| 和空值合并运算符区别展开运算符是浅拷贝还是深拷贝delete 能删除 var 声明的全局变量吗