语言中俚语和方言。在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
.双重否
!!
如果是真就输出真,如果是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/