var a = "10" | 0;
alert(a);
alert (typeof a);

结果为10,number。

这就是说这条语句可以将字符串转化为number。

如果:


var a = "sss" | 0;
alert(a);

结果为0

parseInt("sss")的话,会返回NaN。

这个太强大了,就是说不管是啥都能转换为number。。。

比如:


(function (){})| 0;
({})| 0;
([])| 0;

我了个去……变态啊。

这玩意绝对不不合常理啊。

位运算是按操作符两边内容的二进制值计算的。

就拿String来说,字符串“1”和数值1的二进制难道是一样的?觉没可能!!

那function和object就更没法解释了。

我了个去……还是搞出java来看看吧。

public class aaa {

    public String toBinary(String str){
char[] strChar = str.toCharArray();
String result = "";
for(int i = 0; i 输出结果:

1010
110001 110000

说明1的二进制值是1010,“1”的是110001110000。

显然他们按位或运算后转换成二进制值完全不同。

运行再次还原回number后结果必然会不同。

那js的内核又是怎么实现的呢?

这里仅作猜测,可能为如下方式:


public class aaa {
private int _OR_ (String s1, String s2){
int result1,result2;
try {
result1 = Integer.parseInt(s1);
}catch(Exception e){
result1 = 0;
}
try {
result2 = Integer.parseInt(s2);
}catch(Exception e){
result2 = 0;
}
return result1 | result2;
}
private int _OR_ (String s1, int s2){
int result1,result2;
try {
result1 = Integer.parseInt(s1);
}catch(Exception e){
result1 = 0;
}
return result1 | s2;
}
private int _OR_ (int s1, String s2){
int result2;
try {
result2 = Integer.parseInt(s2);
}catch(Exception e){
result2 = 0;
}
return s1 | result2;
}
private int _OR_ (int n1, int n2){
return n1 | n2;
}
public static void main(String[] args) {
System.out.println(new aaa()._OR_("10","1"));
}
}

由于在强类型语言中,位运算符仅能用在int和long类型中。

如果猜测没错,js是弱类型,所有内容在位运算操作前需要在js引擎实现内部统一转换为int或long。

如果无法转换则默认为赋值为0。最后再经行位运算操作。由此也就产生了这个"变态"现象。

javascript 的位操作符转换推断的更多相关文章

  1. javascript按位操作符操作以及用途

    所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数.正数的补码是自己本身,负数的补码是取反后加一,所以经过操作运算后的值是补码形式. 描述 按位与( AN ...

  2. 【JavaScript】进制转换&位运算,了解一下?

    前言 在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它.作为一位编程人员,这些都是基础知识.如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难.本文你将会学习到: 进制转 ...

  3. 浅谈JavaScript位操作符

    因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...

  4. 为什么不要在 JavaScript 中使用位操作符?

    如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...

  5. javascript运算符——位运算符

    × 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...

  6. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  7. JavaScript 32位整型无符号操作

    在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^ ...

  8. ECMAScript位操作符

    在ECMAScript中,有少数的几个操作符可以对二进制位进行直接操作,这几个操作符本身直接对二进制进行操作,所有它们的本身是非常效率的,学习这一段有助于以后的优化以及理解. ECMAScript中采 ...

  9. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

随机推荐

  1. Native App、Web App 还是Hybrid App?

    一.什么是Native App? Native App即原生应用,即我们一般所称的客户端,是针对不同手机系统单独开发的本地应用,如需使用需要先下载到手机并安装,下载Native App的最常见方法是访 ...

  2. Linux系统下查看已经登录用户并踢出的方法

    LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务. 查看用户的操作 查看当前用户: [ROOT@LOCALHOST ROOT] # W                    ...

  3. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  4. CentOS安装中文输入法:ibus

    转自 http://gnucto.blog.51cto.com/3391516/935964 系统环境:Centos 6.3 编程语言:python + Bash 输入法:ibus 权限支持:root ...

  5. the NTP socket is in use, exiting

    centos下使用如下命令手动同步服务器时间 ntpdate ntp.fudan.edu.cn 或 ntpdate ntp.api.bz 出现“the NTP socket is in use, ex ...

  6. ipc.Client: Retrying connect to server: h1/192.168.1.61:9000. Already tried 0 time(s);解决方法

    1.检查namenode服务器的是否运行正常,我的问题是没有开启hadoop集群出现的. 2.检查namenode服务器的防火墙是否开放的响应端口,一般内网建议关闭.

  7. searchDisplayController 时引起的数组越界

    当  [searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNo ...

  8. 【JSON】JSON字符串的操作(不断积累中)

    一.JS遍历JSON串 示例01 目标:返回的JSON串中,一个Key对应的Value是一个数组(若在Java程序中,是一个List). 现在要求获取每个数组中的第一个对象元素中的name属性的值. ...

  9. SQLCONNECTION使用HTTP通信协议和中间件连接

    SQLCONNECTION支持TCP/IP和HTTP两种通信协议和中间件连接.一般地,默认情况下使用TCP/IP协议. HTTP 协议的一个非常重要的优势在于穿越防火墙. SQLCONNECTION使 ...

  10. js set

    function ff(){ var sArray = ['a','b','b','b','b','b','d','b']; var iSet = {}; for(var i=0;i<sArra ...