JavaScript中有7个位运算相关的运算符:
- 按位非(NOT) - 用一个波浪线"
~
"表示,对二进制的每一位进行取反操作,即将 变成 ,将 变成 。 - 按位与(AND) - 用一个和好"
&
"表示,必须有两个操作数,先对齐二进制位,然后把对应位都为 的为筛下来,其他的都为 。 - 按位或(OR) - 用一个竖线"
|
"表示,也必须有两个操作数,对齐位之后只要对应位有1就筛下来,只有同时位0时才返回 。 - 按位异或(XOR) - 用一个插入符号"
^
"表示,也必须有两个操作数,对齐位之后不同的返回1,相同的返回0。 - 左移 - 用两个小于号"
<<
表示,顾名思议,将操作数左移指定位数,右侧空位用0补齐。 - 有符号右移 - 用两个大于号"
>>
"表示,保留符号位,剩下的右移指定位。 - 无符号右移 - 用三个大于号"
>>>
"表示,往右侧移动指定位数。
以上这些位运算符,最终操作的都是二进制数值。
按位“异或”运算符说明
^ 运算符查看两个表达式的二进制表示法的值,并执行按位异或。该操作的结果如下所示:
0101 (expression1)
1100 (expression2)
----
1001 (结果)
当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。
做奇偶性样式,
html:
<div id="tpl_content_month">
<div class="c_item c_item_{leftOrRight}"></div>
</div>
var isleft=0;
isLeft = isLeft ^ 1;
// 模版 去掉前后html空格
var tpl_content_month=document.getElementById('tpl_content_month').innerHTML.replace(/^\s*/,'').replace(/\s*$/,'');
tpl_content_month.replace(/\{leftOrRight\}/g, isLeft ? 'left' : 'right')
###########################################################################
// 获取0-max之间随机整数
function random(max) {
return Math.random() * max | 0;
// 获取 1-max之间的随机整数
// return Math.random() * max | 1
}
// 奇偶判断
function isOdd(number) {
return (parseInt(number) & 1) === 0;
}
function isEven(number) {
return (parseInt(number) & 1) === 1;
}
// 取整
function int(number) {
return number | 0;
}
// 取半
number >> 1;
// 2x
number << 1;
// 随机颜色
'#'+ ('000000' + (Math.random()*0xFFFFFF<<0).toString(16)).slice(-6);
ch.charCodeAt(0) | 32 // 大写转小写
ch.charCodeAt(0) & ~32 // 小写转大写
void运算符的作用是:计算表达式expr,并返回undefined.例子:
> void 0
undefined
> void(0)
undefined
> void 4+7 // 由于void比+优先级更高,所以该表达式被解析为(void 4)+7NaN
> void(4+7)
undefined
> var x;
> x = 3;
3
> void(x = 5);
undefined
> x
5
###########################################################################
void是个运算符,而不是函数,它不能被重新定义,如果自定义一个void函数,会抛出异常,像下面这样:
在Firefox中,只有在严格模式下才会报错,其他的关键字和保留关键字作为函数声明的函数名时也一样.
>function void(expr) { // 没有报错,但不会真正声明一个void函数
return undefined;
}
>function void(expr) { // 严格模式下会报错
"use strict";
return undefined;
}
SyntaxError: redefining void is deprecated
>function class(expr) { // class也是个保留关键字
"use strict";
return undefined;
}
SyntaxError: redefining class is deprecated
###########################################################################
void的三种用途.
本文剩余的部分讲讲void运算符的三种用途:
- 用void 0代替undefined
- 书签小程序
- 在链接中执行JavaScript代码
用途1: 用void 0代替undefined
void 0或者void(0)总是等于undefined
用途2: 书签小程序
书签小程序(Bookmarklets)是一个能够执行JavaScript代码的URI(译者注:使用JavaScript伪协议).如果一个bookmarklet返回的结果不是undefined,那么当前页面显示的内容会被这个返回值替代.这时候就得用到void运算符.[Webkit内核的浏览器不会有这样的麻烦]:
- javascript:3+4 会把当前页面的内容替换成7.
- javascript:void(3+4) 不会改变当前页面的内容.void会“隐藏”掉表达式3+4的结果.
类似的:
- javascript:window.open("http://www.whitehouse.gov/")
- javascript:void window.open("http://www.whitehouse.gov/")
更复杂的例子:这个bookmarklet可以把当前页面的URL提交到submit.example.com:
javascript:void window.open("http://submit.example.com/submit?"+encodeURIComponent(document.location.href))
这个bookmarklet不会改变当前页面的内容,会在新标签或新窗口中打开页面.
译者注:网上有很多流行的Bookmarklet,通常是导入了另外一个js文件,比如繁体字转换成简体字,比如购物网站比价.
javascript: void(document.body.appendChild(document.createElement("script")).src = "http://tongwen.openfoundry.org/NewTongWen/tools/bookmarklet_cn2.js")
用途3: 在链接中执行JavaScript代码
虽然这种做法是不推荐的,但的确是可行的,例如下面的代码:
<a href="javascript:void computeResult()">Compute</a>
如果函数computeResult()返回undefined(或者没有return语句,也默认返回undefined),则不会有什么事.但 如果这个函数返回了其他的值,那么你必须在函数前面添加void运算符来防止它改变当前页面的内容.[Webkit内核的浏览器不会有这样的麻烦].
译者注:更常见的用法是:javascript:void(0),用来阻止链接默认的跳转行为.