资讯专栏INFORMATION COLUMN

小tips:JS之按位取反,语法标签label,正则表达式中replace的0,1是什么?

n7then / 847人阅读

摘要:按位取反按位取反运算符,对一个表达式执行位非求非运算。如果语句后面不使用标签,则只能进入下一轮的内层循环。语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。代表的是分组,即小括号里面的小正则捕获到的内容。

JS按位取反

Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;
来看看~1的计算步骤:

将1(这里叫:原码)转二进制 = 00000001

按位取反 = 11111110

发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001

末位加1取其补码 = 10000010

转换回十进制 = -2

按位取反的运算规则这么奇怪并不是JavaScript独有的,而是所有的计算机语言都是这样的。这样做的主要原因是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是因为补码和数字的十进制数有这么转换关系,负数:补码(x) = -x - 1,正数:补码(x) = x
可参考:二进制如何转十进制,十进制如何转二进制
问题地址:https://segmentfault.com/q/1010000005697515

语法标签label

JavaScript语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。

label:
  statement

标签可以是任意的标识符,但是不能是保留字,语句部分可以是任意语句。
标签通常与break语句和continue语句配合使用,跳出特定的循环。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) break top;
      console.log("i=" + i + ", j=" + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0

面代码为一个双重循环区块,break命令后面加上了top标签(注意,top不用加引号),满足条件时,直接跳出双层循环。如果break语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。

continue语句也可以与标签配合使用。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) continue top;
      console.log("i=" + i + ", j=" + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2

上面代码中,continue命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果continue语句后面不使用标签,则只能进入下一轮的内层循环。

说明:
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。
break语句用于跳出代码块或循环。
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。

正则表达式中replace的0,1是什么?

str.replace(reg,function(){}) 应用的地方很多啊,最基本的就是 比如str 是一串数字,比如你要把这些数字替换成 大写的汉字

    var ary=["一","二","三","四","五","六"]
        "123456".replace(/d/g,function(){
            return ary[argument[0]];
        })

还有一种用法就是 不替换 字符串,只是利用replace 可以 匹配几次,这个function 就执行几次的特性。来做一些事情,比如格式化时间字符串。等等。

1−−9 是RegExp 自带的,只要放生了匹配就会有。 test exec str的replace 都会有。代表的是 分组,即小括号里面的小正则 捕获到的内容。

/^(d{4})[/-](d{1,2})[/-](d{1,2})$/
比如这个 简单的匹配 年月日的正则,
我们就可以通过 12 $3 获取到并进行处理。

在一个例子:

    var reg=new RegExp("(http://www.qidian.com/BookReader/)(d+),(d+).aspx","gmi");
    var url="http://www.qidian.com/BookReader/1017141,20361055.aspx";
    
    var rep=url.replace(reg,"$1ShowBook.aspx?bookId=$2&chapterId=$3");

你可能注意到了,在reg正则表达式里的几对"()",
比如("(http://www.qidian.com/BookReader/)(d+),$n就指的是匹配到的第n个括号里的内容,**$n主要是用在后面的程序需要引用前面的正则匹配到的内容时。**在这个例子里:

$1 : http://www.qidian.com/BookReader/
$2 : 1017141
$3 : 20361055

问题地址:https://segmentfault.com/q/1010000005727586

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89775.html

相关文章

  • JavaScript“黑话”

    摘要:数值表示法科学计数法是一种数学术语,将一个数表示为乘以的次方,如光速万公里每秒,在计算中通常将米做单位,则记为,而在中我们可使用科学计数法表示。以下情况会自动将数值转为科学计数法表示小数点前的数字多于位。 showImg(https://segmentfault.com/img/bVbhNqT?w=1024&h=683); 因为球是圆的,所以不论发生什么都有可能,对这点我是深信不疑的,...

    fjcgreat 评论0 收藏0
  • 按位操作符

    摘要:将任一数值与执行按位与操作,其结果都为。中应用判断奇偶性偶数奇数按位异或规则每一位都不同,结果才为将任一数值与进行异或操作,其结果为。 位运算在算法中很有用,速度可以比四则运算快很多。 To2orTo10 JS中十进制转二进制: (val).toString(2)JS中二进制转十进制: parseInt(val, 2) JS中规定安全整数的范围是-2^53~2^53,所以大于90071...

    caiyongji 评论0 收藏0
  • js按位运算

    摘要:中的数字也是按照的标准存储的,按位存储,但是操作符不会直接去操作位,会将位数转换成位整数操作,完成运算后再转换成位,这个位对用户来说是透明的。虽然经常写,但是还是对一些按位运算比较迷茫。 javascript中的数字也是按照IEEE754的标准存储的,按64位存储,但是操作符不会直接去操作64位,会将64位数转换成32位整数操作,完成运算后再转换成64位,这个64位对用户来说是透明的。...

    cnio 评论0 收藏0
  • 请回答c语言-操作符【入门】

    摘要:操作符的两个操作数必须为整数。函数调用用作为函数调用操作符。访问一个结构的成员结构体成员名结构体指针成员名还是熟悉的栗子在之前的博客请回答语言初识语言下入门的结构体出现过的栗子名字图鉴编号身高重量属性类型 ...

    frolc 评论0 收藏0
  • 001_第一部分_[Python基础]

    摘要:一基础数据类型原始类型复合类型由其他原始类型组合起来的类型运算符和表达式算术运算符加减乘除取模幂地板除的除位运算符二进制之间的运算转换成二进制数将二进制转换成十进制按位与都为才为按位或存在即为按位异或相同的为不同的为按位取反正数的补码,反 一.python基础: 数据类型: 原始类型: int float byte 复合类型: 由其他原始类型组合...

    WrBug 评论0 收藏0

发表评论

0条评论

n7then

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<