js小技巧
1.把变量值转为对象属性
var IO = "socket";
var obj = {[IO]: "value"}
console.log(obj); //{socket: "value"}
在对象的key位置上面, 我们可以使用 [] 将变量套住,那么变量值就变key了
2. !!的使用
在看一下源码中,经常看到有人用!!, 觉得奇怪,其实这个是非常有用的一种方式,用于把值转换成 boolean类型
这样有什么用呢? 其实用处是非常大的,很多时候我们需要类型的转化,比如我们从服务器传递数据过来,可能用0 和 1做 false 和 true的标记,那么就意味着,在你的业务代码中,很可能也直接使用0 或者 1, 到时这是一种非常不好的方式,很好是用true 或者 false来进行 bool类型的判断, 而!!恰好提供了非常好的转换方式
!!0 //false
!!1 //true
3.逻辑技巧
逻辑技巧是一个非常有意思的事情,下面会总结子在开发中常用的逻辑技巧。
- 如果存在xx的话,就返回什么
var ret = num && num * 2 //如果num存在的话,就返回num *2的值
- x存在返回x, x 不存在返回y, y不存在返回z....
var ret = x || y || z
- 要么x不存在,要么返回x的某个属性值
var ret = !x || x[props]
- 利用多个 : ? 代替If else
function match(ele) {
return ele === 'a' ? "match a"
: ele === 'b' ? "match b"
: ele === 'c' ? "match c"
: 'default';
}
match('b') //match b
4.NaN
这个在javascript中是一个意外, 一般来说,一个值 应该和 自身 (等值 或者 全等), 但是 NaN和自身 是 不等值和全等的
NaN == NaN //false
NaN === NaN //false
5.==或者===
== 是等值
===是全等
对于基本数据类型,string number等,判断相等,我们全部用 === 全等判断
等值有些情况要注意一下
0 == '0' //true
0 == '' // true
'' == '0' //false
6. \ 在字符串中
注意 \ 在字符串中 也是表示转义字符
比如 我想要在字符串中 表示 \ 那么只能使用 \
var a = '\' //error Invalid token
var a = '\\' //表示 \
a.length = 1
//如果想表示 "abc\n\r"
//应该写成 "abc\\n\\r"
7.对象的声明中,可以直接使用读写器
注意 不用function声明 和 不能和对象原本的已经存在key重复
var obj = {
value: "default",
get props() {
return this.value
},
set props(value) {
this.value = value;
}
}
obj.props //"default"
obj.props = "aaa";
obj.props //"aaa"
8. 对象所属和对象成型的异步分开
借助于javascript的灵活性,可以任意时候给一个对象增加属性,于是就有了对象所属和对象成型的异步分开技巧。
这是什么意思呢? 就是 对象属于哪个集合和这个对象会变成什么样实际可以分开的,而不必必须是生成一个完整的对象,然后再加入到一个具体的集合中。
上面的思考实际在很多时候会带来灵活性,比如它可以减轻我们函数的传参逻辑,比如在用c写代码时,我们知道,c语言的对象属性是固定的,也就是说,如果想把一个对象加入到一个数组中,那么必须是先完整的生成这个对象,然后再加入到数组中。但是对于javascript来说,对象的属性可以改变,那么我们可以先把一个对象加入数组中,然后再去修改对象的对象。
利用订单模型举例,我们想要把所有订单都加入到订单列表中,那么有两种思考模式
一种为 先生成完整订单,然后再把订单加入列表中
var order = {};
handlerOrder(order);
orderList.push(order);
一种为 先把订单数据加入订单列表中,然后在处理订单数据
var order = {};
orderList.push(order);
handlerOrder(order);
相对而言,第二种的处理逻辑会更加简单一点,因为后面仅仅需要思考如何处理订单的数据就行,而不用考虑这个订单的其他外在的连续,相对而言,更加灵活
特别是在一些异步操作的时候,我们可以先把订单对象加入列表中,然后在写一个封装的函数,着重处理订单的数据逻辑。
9 url query正则中获取某个key
function getParam(key) {
var res = new RegExp('[?&]'+ key +'=([^&#]*)').exec(location.search);
return res && res.length === 2 ? res[1] : '';
};