语言中俚语和方言。在JavaScript中也有一些俚语或者说是术语,看似奇淫巧技,还是有一些用处,有三种语言组件可以来构造术语:强转、逻辑运算符和位变换。
1、强转:在javascript和大部分的语言中,强转是指强制将一种类型的对象或者实体转成另外一种的行为
1.转成String var d = ' ' + 0; console.log(d); //'0'
2.转成数字 console.log(+'10')//10 console.log(+new Date()) //时间戳 1471493169160 console.log(new Date() + '') //Thu Aug 18 2016 12:06:49 GMT+0800 (中国标准时间)
3.复杂的强转 ++[[]][+[]]+[+[]] //'10' [[]] // =>[Array[0]] [+[]] // =>[0] 就是0 1 + [0] //=>10
2.逻辑运算符
1.通过比较或隐式回退赋值 && 可以避免报错 当赋值语句来用 || 可以用来填加默认值 name = arg [0] || "dfd" ! 转换成布尔值来做捷径 1.console.log(!0) // true 2.console.log(!1) //false 3.console.log(!-1) //false 4.console.log(!'0')//false 5.console.log(!'1')//false 6.console.log(!undefined)//true 7.console.log(!this)//false 8.console.log(!+[]) // true 9.console.log(![][![]])//true 10.console.log(!null)//true
2.双重否 !! 如果是真就输出真,如果是null和undefined就!null 就是false false直接输入false,避免报错。 var user = { isAdmin: function(){ return !! this.admin } } ; console.log(user.isAdmin()) //false !! undefined => !true =>false user.admin = true; console.log(user.isAdmin()) //true !!true => !false =>true user.admin = false; console.log(user.isAdmin()) //false !!false => !true =>false
3.立即调用函数
!function(){console.log('foo')}(); //=> foo
3.位变换
1. & 两个操作数进行按位与操作时,如果两个操作数在某个特定的位置都为1,那么按位与返回1 Hex转换为RGB var color = 0xC0FFEE; console.log((color>>16) & 0xFF) //192 red 2. | 两个操作数进行按位与操作时,如果两个操作数在某个特定的位置任意一个为1,那么按位与返回1 数字截断,用来舍入数字 var x = (30.9 | 0); console.log(x); //=> 30
3. ^
是一种判断两个操作数是否具有相反符号的简单方法
1、符号判等
var signsMatch = function(x,y){
return !((x ^ y) < 0);
};
console.log(signsMatch(10, 10)); //fasle
console.log(signsMatch(0, 0)); //true
console.log(signsMatch(-10, -10)); //true
2.翻转位
可以用来切换对象的状态是非常有用。
var light = {
on:1,
toggle: function(){
return this.on ^=1;
}
}
console.log(light.toggle()) //=>0
console.log(light.toggle()) //=>1
console.log(light.toggle()) //=>0
4.~ 非 ,按位非从功能上说,基本是讲一个数字的符号进行反转,然后在减1. 1.按位运算 ~-10 // =>9 -~10 //=>11 2*~-10 // =>18 2.字符串转数字 var num = “100.7” console.log(parseInt(num,10) === ~~num) //true
4.一些难懂的代码
1、暗中的eval
““[”sub”]["constructor"](""console.log('foo')")()
//=>foo
2.进制
当比较不同进制的数字是要保持小心。比如比较八进制和十进制和科学计数
1+ 064 == 65 //false
064 > 60 //false
30000000>4e9 //false
3.Unicode编码的变量
在javascript中允许使用Unicode用作属性描述符和变量名,
var u1000 = {u1001: function(){
return 'Unicode'
}
}
console.log(u1000.u1001()) //'Unicode'
false => ![]
true => !![]
undefined => [][[]]
NaN => +[![]]
0 => +[]
1 => +!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => []["filter"]
eval => []["filter"]["constructor"]( CODE )()
window => []["filter"]["constructor"]("return this")()
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
上面的代码是 alert(2)
具体的网站可以访问:http://www.jsfuck.com/