javascript的变态位运算

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 < strChar.length; i++){
            result += Integer.toBinaryString(strChar[i]);
        }
        return result;
        }
  
    public static void main(String[] args) {
        String s = "1";
        int n = 1;
        System.out.println(Integer.toBinaryString(n));
        System.out.println(new aaa().toBinary(s));
    }
输出结果:
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中的位运算,

    罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...

  2. javascript位运算

    javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面.不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与 ...

  3. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

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

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

  5. javascript 位运算

    位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...

  6. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  7. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  8. leetcode - 位运算题目汇总(下)

    接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...

  9. Javascript中的位运算符和技巧

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...

随机推荐

  1. 转 RMI、RPC、SOAP通信技术介绍及比对

    http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...

  2. docker基本概念,创建、起动实例,保存自定义镜像等常用操作

    14年docker火了一阵,当时自学整理了一份文档,后来冷落了. 现在发现很多同事还是想学习docker,但无从下手,所以重新整理了这篇分享,10分钟就可以带你彻底理解docker,并能够创建属于自己 ...

  3. USACO Section 3.3: A Game

    第一次碰到博弈论题目,是很棘手,博弈论题目要考虑全局最优的解法,我第一次用了局部最优的,而且vector也没pop_front()操作.后来看了网上的用dp的方法解的. 博弈论的题目基本都得用dp法子 ...

  4. Asp.net Json 解析 与 直接用ip访问返回josn

    数据分析 目前手头上需要制作一个天气预报功能,现成的接口已经有了.我随便输入一个城市,然后出现了如下的信息: {"wdata":{"cityName":&quo ...

  5. ubuntu装机后的一些零散配置

    -2 以root用户登录 su passwd root 可参考http://blog.csdn.net/happyteafriends/article/details/7518893 : 先设定一个r ...

  6. django中post方法和get方法的不同

    当我们提交表单仅仅需要获取数据时就可以用GET: 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST. 在这个搜索书籍的例子里,我们 ...

  7. leetcode:Implement Stack using Queues 与 Implement Queue using Stacks

    一.Implement Stack using Queues Implement the following operations of a stack using queues. push(x) - ...

  8. ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

    一.实体类或属性名与数据库关键字冲突问题1.实体类名与数据库中的关键字冲突比如:实体表User与oracle中的系统表冲突解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等 ...

  9. 浅析Java web程序之客户端和服务器端交互原理(转)

    转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...

  10. HDU 2516 (Fabonacci Nim) 取石子游戏

    这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败:否则,先手必胜. 结论很简单,但是证明却不是特别容易.找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看 ...