[TOC]
# 格式化Date
想得到format后的時間?現在不用再get年月日時分秒了,三步搞定
```js
var temp = new Date();
var regex = /\//g;
(temp.toLocaleDateString() + ' ' + temp.toLocaleTimeString().slice(2)).replace(regex,'-'); // "2015-5-7 9:04:10"
```
想將format后的時間轉換為時間對象?直接用Date的構造函數
```js
new Date("2015-5-7 9:04:10"); // Thu May 07 2015 09:04:10 GMT+0800 (CST)
```
經測試發現火狐沒法對format后的時間字符串使用`Date.parse()`,故這個方法在火狐上不好使
想將一個標準的時間對象轉換為unix時間戳?`valueOf`搞定之
```js
(new Date).valueOf(); // 1431004132641
```
許多朋友還提醒了這樣可以快速得到時間戳
```js
+new Date // 1431004132641
```
# 一元加
一元加可以快速將字符串的數字轉換為數學數字,即
```js
var number = "23"
typeof number // string
typeof +number // number
```
可以將時間對象轉為時間戳
```js
new Date // Tue May 12 2015 22:21:33 GMT+0800 (CST)
+new Date // 1431440459887
```
# 轉義URI
需要將url當做參數在路由中傳遞,現在轉義之
```js
var url = encodeURIComponent('http://segmentfault.com/questions/newest')
// "http%3A%2F%2Fsegmentfault.com%2Fquestions%2Fnewest"
```
再反轉義:
```js
decodeURIComponent(url)
// "http://segmentfault.com/questions/newest"
```
# toFixed
希望保留小數點后的幾位小數,不用再做字符串截取了,`toFixed`拿走
```js
number.toFixed() // "12346"
number.toFixed(3) // "12345.679"
number.toFixed(6) // "12345.678900"
```
參數范圍為`0~20`,不寫默認`0`
***
Xee:這里其實它有時候的結果并不是我們需要的:
例如:
```js
Number((1.005).toFixed(2)); // 1 instead of 1.01
Math.round(1.005*100)/100; // 1 instead of 1.01
```
更好的方案:
```js
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
round(1.005, 2); // 1.01
```
[`Rounding Decimals in JavaScript`](http://www.jacklmoore.com/notes/rounding-in-javascript/)
# JS中的`~~`
今天在一代碼中到這樣一句:
`~~(Math.random() * 2e3)`
其中的代碼上用到了位運算符~(按位非),在平時的編程中很少用到位運算符,只是學習編程基礎的時候看到過,也沒多做了解,既然現在遇到了,就打算對這一運算符一探究竟。
其實上面那一段代碼用可讀性強的方式來寫的話,如下面
`parseInt(Math.random()*2e3)`
那為什么使用~~能實現parseInt取整的效果呢?
《Javascript權威指南》里是這么說的:
位運算符"~"是一元運算符,位于一個整型參數之前,它將操作數的所有位取反。根據javascript中所帶符號的整數的表示方法,對一個值使用"~",運算符相當于改變它的符號并減1。例如`~0x0F = 0xFFFFFFF0或-16。`
請注意,上面的句子中提到的是所帶符號的整數!那么也就是說~9.88只是取整數部分,也即是~9。
根據上面的描述,使用~相當于改變參數的符號并減1,那么也就是:
~~~
~9 => -9 - 1 => -10
然而,使用兩個~,那么就是相當于boolean中的!!一樣,只是!!返回的是布爾類型,~~返回的是原來的值,如果參數是小數的話,就相當于對該參數取整!
~~~
# 復雜的if-else
今天在寫一個代碼的時候,發現在我們的代碼里有一個很復雜的if-else語句——主要是在開發的過程中,業務在不斷地變化。
```js
function categoryHandleRefactor(category) {
var categoryAction = {
'A': {
run: function () {
console.log('A')
}
},
'B': {
run: function () {
console.log('B')
}
},
'C': {
run: function () {
console.log('C')
}
},
'D': {
run: function () {
console.log('D')
}
}
};
categoryAction[category].run();
}
```
# [Array.prototype.slice](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
`Array.prototype.slice.call(arguments)`能將類數組(Array-like)對象/集合轉換成一個新數組。可以簡單的使用 `[].slice.call(arguments)` 來代替
如:
```js
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
```
## [前端小知識10點(2020.2.10)](https://mp.weixin.qq.com/s/tt2XcW4GF7oBBZOPwTiCcg)
- 步入JavaScript的世界
- 二進制運算
- JavaScript 的版本是怎么回事?
- JavaScript和DOM的產生與發展
- DOM事件處理
- js的并行加載與順序執行
- 正則表達式
- 當遇上this時
- Javascript中apply、call、bind
- JavaScript的編譯過程與運行機制
- 執行上下文(Execution Context)
- javascript 作用域
- 分組中的函數表達式
- JS之constructor屬性
- Javascript 按位取反運算符 (~)
- EvenLoop 事件循環
- 異步編程
- JavaScript的九個思維導圖
- JavaScript奇淫技巧
- JavaScript:shim和polyfill
- ===值得關注的庫===
- ==文章==
- JavaScript框架
- Angular 1.x
- 啟動引導過程
- $scope作用域
- $q與promise
- ngRoute 和 ui-router
- 雙向數據綁定
- 規范和性能優化
- 自定義指令
- Angular 事件
- lodash
- Test