[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