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. Hbase学习记录(2)| Shell操作

    查看表结构 describe '表名' 查看版本 get '表名','zhangsan'{COLUMN=>'info:age',VERSIONS=>3} 删除整行 deleteall '表 ...

  2. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

  3. SQL 脚本

    1.USE语句 USE语句用于设置当前数据库,如果没有USE语句,那么就由执行脚本的任何用户来确定执行脚本时当前数据库是正确的.如果只是一个通用脚本,那么省去USE语句实际上可能更有益.通常,如果在脚 ...

  4. E:Package 'Vim' has no installation candidate问题解决

    问题描述: root@zhouls-virtual-machine:~# apt-get install vimReading package lists... DoneBuilding depend ...

  5. Dagger2学习资源

    文章 Jack Wharton关于Dagger的幻灯片 代码 用Dagger2改写Jack Wharton的U+2020 我自己写的,包含了dagger2和单元测试 chiuki写的,包含了dagge ...

  6. TcxGrid导出EXCEL

    function ExportExcel(grid: TcxGrid; const fileName: string = '1.xls'): Boolean;var  sd: TSaveDialog; ...

  7. Flipping Parentheses(CSU1542 线段树)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1542 赛后发现这套题是2014东京区域赛的题目,看了排名才发现自己有多low  = =! 题目大意 ...

  8. 乱侃c++

    就在刚才我感觉c++真的好复杂,函数重载,多态,虚函数,虚函数表,模版,继承等一大坨东西好恶心,c++既然完全支持C语言,当然是把它的优缺点统统接下了,C语言中指针本身并不太难,是C语言的精华,当年刚 ...

  9. Ehcache(05)——缓存的查询

    http://haohaoxuexi.iteye.com/blog/2117505 缓存的查询 目录 1.    使Cache可查询 1.1     基于Xml配置 1.2     基于代码的配置 2 ...

  10. 浅谈Oracle函数返回Table集合

    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...