|
| 1 | +# Js实用小技巧 |
| 2 | +这是一份`Js`实用小技巧,也可以是一份`Js`挨打小技巧,下面的一系列操作虽然能够在一定程度上使代码更加简洁,但是在缺少注释的情况下会降低可读性,所以需要谨慎使用这些黑魔法。 |
| 3 | + |
| 4 | + |
| 5 | +## 位元算 |
| 6 | + |
| 7 | +### 取整 |
| 8 | + |
| 9 | +```javascript |
| 10 | +console.log(~~(11.11)); // 11 |
| 11 | +console.log(11.11 >> 0); // 11 |
| 12 | +console.log(11.11 << 0); // 11 |
| 13 | +console.log(11.11 | 0); // 11 |
| 14 | +console.log(11.11 >>> 0); // 11 // 注意 >>> 不可对负数取整 |
| 15 | +``` |
| 16 | + |
| 17 | +### 判断奇偶 |
| 18 | + |
| 19 | +```javascript |
| 20 | +console.log(7 & 1); // 1 |
| 21 | +console.log(8 & 1) ; // 0 |
| 22 | +``` |
| 23 | + |
| 24 | +### 转换布尔值 |
| 25 | + |
| 26 | +```javascript |
| 27 | +console.log(!!7); // true |
| 28 | +console.log(!!0); // false |
| 29 | +console.log(!!-1); // true |
| 30 | +console.log(!!0.71); // true |
| 31 | +console.log(!!""); // false |
| 32 | +console.log(!![]); // true |
| 33 | +console.log(!!{}); // true |
| 34 | +console.log(!!null); // false |
| 35 | +console.log(!!undefined); // false |
| 36 | +``` |
| 37 | + |
| 38 | +### 移位运算 |
| 39 | + |
| 40 | +```javascript |
| 41 | +console.log(16 >> 1); // 8 |
| 42 | +console.log(16 << 2); // 64 |
| 43 | +console.log(1 >>> 1); // 2 |
| 44 | + |
| 45 | +``` |
| 46 | + |
| 47 | +### 进行值交换 |
| 48 | + |
| 49 | +```javascript |
| 50 | +let a = 7; |
| 51 | +let b = 1; |
| 52 | +a ^= b; |
| 53 | +b ^= a; |
| 54 | +a ^= b; |
| 55 | +console.log(a); // 1 |
| 56 | +console.log(b); // 7 |
| 57 | + |
| 58 | +// 也可以借助数组 |
| 59 | +b = [a, a = b][0]; |
| 60 | + |
| 61 | +// 当然解构赋值更简单 |
| 62 | +[a, b] = [b, a]; |
| 63 | +``` |
| 64 | + |
| 65 | +### 判断符号是否相同 |
| 66 | + |
| 67 | +```javascript |
| 68 | +let a = 1; |
| 69 | +let b = 1; |
| 70 | +console.log((a ^ b) >= 0); // true |
| 71 | +console.log((a ^ -b) >= 0); // false |
| 72 | +``` |
| 73 | + |
| 74 | +### 检查数字是否不相等 |
| 75 | + |
| 76 | +```javascript |
| 77 | +let a = 111; |
| 78 | +if(a ^ 111) console.log("Not equal"); |
| 79 | +if(a !== 111) console.log("Not equal"); |
| 80 | +if(a ^ 11111) console.log("Not equal"); // Not equal |
| 81 | +``` |
| 82 | + |
| 83 | +### 判断是否2的整数幂 |
| 84 | + |
| 85 | +```javascript |
| 86 | +const check = n => !(n & (n - 1)); |
| 87 | +console.log(check(7)); // false |
| 88 | +console.log(check(8)); // true |
| 89 | +``` |
| 90 | + |
| 91 | +### 条件语句 |
| 92 | + |
| 93 | +```javascript |
| 94 | +let bool = true; |
| 95 | +if(bool) console.log(1); // 1 |
| 96 | +console.log(bool && console.log(1)); // 1 |
| 97 | +``` |
| 98 | + |
| 99 | +### 四舍五入取整 |
| 100 | + |
| 101 | +```javascript |
| 102 | +const round = n => n + 0.5 * (n > 0 ? 1 : -1) | 0; |
| 103 | +console.log(round(0)); // 0 |
| 104 | +console.log(round(1.1)); // 1 |
| 105 | +console.log(round(1.6)); // 2 |
| 106 | +console.log(round(-1.1)); // -1 |
| 107 | +console.log(round(-1.6)); // -2 |
| 108 | +``` |
| 109 | + |
| 110 | +## 字符串 |
| 111 | + |
| 112 | +### 取随机字符串 |
| 113 | + |
| 114 | +```javascript |
| 115 | +console.log(Math.random().toString(16).slice(2)); // c21f331e6ce2b |
| 116 | +``` |
| 117 | + |
| 118 | +### 重复字符串 |
| 119 | + |
| 120 | +```javascript |
| 121 | +const repeat = (n, str) => Array(n+1).join(str); |
| 122 | +console.log(repeat(5, "ab")); // ababababab |
| 123 | +console.log("ab".repeat(5)); // ababababab // ES6 |
| 124 | +``` |
| 125 | + |
| 126 | +### 创建链接 |
| 127 | + |
| 128 | +```javascript |
| 129 | +console.log("Google".link("www.google.com")); // <a href="www.google.com">Google</a> |
| 130 | +``` |
| 131 | + |
| 132 | +## 其他 |
| 133 | + |
| 134 | +### 正确处理异常的方法 |
| 135 | + |
| 136 | +```javascript |
| 137 | +try { |
| 138 | + // something |
| 139 | +} catch (e) { |
| 140 | + window.location.href = "http://stackoverflow.com/search?q=[js]+" + e.message; |
| 141 | +} |
| 142 | +``` |
| 143 | + |
| 144 | +### 优雅地证明自己NB |
| 145 | + |
| 146 | +```javascript |
| 147 | +console.log(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]); |
| 148 | +``` |
| 149 | + |
| 150 | +### 可以替代undefined的操作 |
| 151 | + |
| 152 | +```javascript |
| 153 | +console.log(void 0); // undefined |
| 154 | +console.log(""._); // undefined |
| 155 | +console.log(1.._); // undefined |
| 156 | +console.log(0[0]); // undefined |
| 157 | +``` |
| 158 | + |
| 159 | +### 替代Infinity |
| 160 | + |
| 161 | +```javascript |
| 162 | +console.log([-1/0, 1/0]); // [-Infinity, Infinity] |
| 163 | +``` |
| 164 | + |
| 165 | +### 清空数组 |
| 166 | + |
| 167 | +```javascript |
| 168 | +let arr = [1]; |
| 169 | +arr.length = 0; |
| 170 | +console.log(arr); // [] |
| 171 | +``` |
| 172 | + |
| 173 | +### 快速判断IE8以下的浏览器 |
| 174 | + |
| 175 | +```javascript |
| 176 | +var isIE8 = !+"1"; |
| 177 | +console.log(isIE8); // false // Chrome 87 |
| 178 | +``` |
| 179 | + |
| 180 | + |
| 181 | +## 每日一题 |
| 182 | + |
| 183 | +``` |
| 184 | +https://github.com/WindrunnerMax/EveryDay |
| 185 | +``` |
| 186 | + |
| 187 | +## 参考 |
| 188 | + |
| 189 | +``` |
| 190 | +https://zhuanlan.zhihu.com/p/150556186 |
| 191 | +https://zhuanlan.zhihu.com/p/262533240 |
| 192 | +https://github.com/jed/140bytes/wiki/Byte-saving-techniques |
| 193 | +``` |
| 194 | + |
0 commit comments