js里的void计算一个表达示,但是没有返回值,,链接里用void(0),计算结果就是0,但是不会返回任何东西,所以点击了不会有任何动作,另外一种是使用#号,#号是带有锚定位功能的,默认会跳转到页面顶端,所以,在建空链接的时候,最好用void(0),不要用#。
具体如下:
1、简介
编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,是计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
2、汇编程序
汇编程序。使用汇编语言编写计算机程序,程序员仍然需要十分熟悉计算机系统的硬件结构,所以从程序设计本身上来看仍然是低效率的、繁琐的。但正是由于汇编语言与计算机硬件系统关系密切,在某些特定的场合,如对时空效率要求很高的系统核心程序以及实时控制程序等,迄今为止汇编语言仍然是十分有效的程序设计工具。
3、执行原理
计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。这种将高级编程硬件程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。
按位操作符(Bitwise operators)会使用内置函数, 7.1.5 ToInt32 ( argument ) ,
先将其操作数转换成32位有符号整数 ,再进行位操作,最后返回一个32位有符号整数。
包括,
12.5.8 Bitwise NOT Operator ( ~ ) ,
12.9.3 The Left Shift Operator ( <<) ,
12.9.4 The Signed Right Shift Operator ( >>) ,
12.12 Binary Bitwise Operators
因此, a | 0 , 0 | a ,都可以将变量 a 中数值转换为32位有符号整数。
某些特殊的值,并不是32位有符号整数的安全范围,它们会被转换为 0 。
在计算机中表示有符号整数,通常使用 补码 (two's-complement)进行编码。
它将字的最高有效位解释为符号位,符号位被置为 1 时,表示值为负,
符号位被置为 0 时,表示值为非负。
因此,字长为4的二进制数 0001 表示整数 1 ,其中 0*2^3+0*2^2+0*2^1+1*2^0=1 ,
而 1111 就表示整数 -1 ,其中 -1*2^3+1*2^2+1*2^1+1*2^0=-1 。
负数的补码,还可以按照“ 逐位取反后,加一 ”的方式来获取相应的整数值。
例如, 1111 逐位取反 0000 ,然后再加一 0001 ,它是 1 的二进制表示,
因此 1111 就是表示 -1 了。
~ 操作符,它首先将操作数转换成32位有符号整数,然后再按位取反。
例如, 1 的32位补码编码为,
按位取反,
它表示什么呢?
先看最高为的符号位,是 1 ,它表示一个负数,
然后“逐位取反后,加一”, 00000000 00000000 00000000 00000002 值为 2 ,
因此, 11111111 11111111 11111111 11111110 表示 -2 。
一般的, 可以证明 ,
对于任意的32位有符号整数 x 来说, ~x === -(x+1) 。
详细证明见文后的附录。
ECMAScript中,数组元素的索引范围是, 0 到 Math.pow(2,32)-2 。
规范 9.4.2 Array Exotic Objects 中指出,
超过数组 length 的索引,会被看做数组的属性值,
因此, indexOf 返回的最大值为 Math.pow(2,32)-2 。
Array.prototype.indexOf ,
会返回给定数组元素在数组中的索引,如果找不到给定元素,就返回 -1 。
因为只有 ~-1 等于 0 ,其他索引值取反都非 0 ,
所以,人们经常使用 !~a.indexOf(element) 来判断元素是否在数组中。
这里有一个值得注意的事情,由于 ~ 会首先将操作数转换成32位有符号整数,
所以, -1 和 Math.pow(2,32)-1 具有相同的编码,
但是,数组的最大索引为 Math.pow(2,32)-2 ,小于上面这个值,
因此,对 indexOf 返回的值进行取反,除了 -1 之外,总是非 0 值,是安全的做法。
下面给出 ~x === -(x+1) 的证明。
(1)先看正整数
对于32位正整数来说,它的二进制编码为,
其中 n 表示 0 或者 1 ,
则, ~x 为,
其中 u 为 n 的取反结果。
以上二进制表示,如果看成32位有符号整数,则由于符号位 1 ,它是一个负数,
其绝对值为,“逐位取反后,加一”,即为, (0nnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn)+1 === x+1 ,
即, -(x+1) 。
因此,对于正数, ~x === -(x+1) 。
(2)再看负整数
对于32位负整数来说,它的二进制编码为,
其中 n 表示 0 或者 1 ,
则, ~x 为,
其中 u 为 n 的取反结果。
设 0uuuuuuu uuuuuuuu uuuuuuuu uuuuuuuu 的值为 t ,
则 1nnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn 的值为, -(t+1) ,(逐位取反后,加一)。
因此, x === -(t+1) , ~x === t ,
即, ~x === t === -(-(t+1) + 1) === -(x+1) 。
证毕。
你不知道的JavaScript(中卷)
ECMAScript Language Specification
深入理解计算机系统