前端JS相关
三元运算
v1 = 条件 ? 值A : 值B;
res = 1 === 1 ? 99 : 88 # res = 99
如果条件成立则返回冒号前的那个值,如果条件不成立则返回冒号后面那个值
特殊的逻辑运算
v1 = 1===1 || 2===2
这种运算是比较运算+或运算,在或(||)的前面和后面都是比较运算,前后的返回值都是ture,因为是或运算,只需要满足一个条件就可以返回,因此v1的值为ture
v2 = 9 || 14
V3 = 0 || 15
最终结果取决于哪个值? 在这里v2是一个或,前面为真,因此结果为9 v3的话,这里同样也是或,在或前面值为假,因此取后面那个真值,最后结果为15
赋值和比较
v1 = 11 === (n=123)
结果为false
案例
v1 = 1 > ( n = 2) || 1 === 1 ? 9 : 8
大家在这里可以先计算一下再看下面的解析
首先将2赋值给n ,中间有一个或运算, 在或运算的后面是一个三元运算 1 === 1 ?9 :8
这个三元运算的答案为9,在或运算前面是 1 > 2 结果为false, 因此v1的最终答案为 9
var o = (null === (n = window.byted_acrawler) || void 0 === n ?void 0 : null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, i) ) || "";
这个案例是某头条的JS运算,下面将会一步步的对这个JS进行分析
#分析 n = window.byted_acrawler Null === n 进行比较 要么是ture 要么是 false void 0 === n ? void 0 : null === (a = n.sign) 是一个三元运算 在这里要知道void 0 为undefined(Null和undefined的区别在下方进行了说明比较) 可以发现undefined和n比较不正确,因此返回null === (a = n.sign) 在这里 a = n.sign a = window.byted_acrawler.sign 这里可以发现 a 是不等于空的,因此为false 在看前面 null === n n也是不为空 ,因此结果也是false 这里 var o = (false || false || void 0 === a ? void 0 : a.call (n,i)) || "";
void 0 === a ? void 0 : a.call(n,i) 也是一个三元运算 可以发现 返回值为 a.call(n,i)
var o = window.byted_arcawler.sign.call(n,i) || ""
在JavaScript中null和undefined的区别
1、Null 表示一个“无”的对象,转为数值为0;作为函数的参数,表示改函数的参数不是对象;作为对象原型链的终点;Number(null)为0;JSON。stringify(null)为'null'(字符串)
2、Undefined 变量被声明了,但是没有赋值,就等于undefined;调用函数时,应提供的参数没有提供,该参数等于undefined;函数没有返回值时,默认返回undefined