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. 【原创】关于Adapter的The content of the adapter has changed问题分析

    关于Adapter的The content of the adapter has changed问题分析   1.问题描述 07-28 17:22:02.162: E/AndroidRuntime(1 ...

  2. CentOS下如何查找大文件

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  3. CentOS Mysql自动备份 .txt

    http://fly.b3log.org/articles/2011/10/25/1319505473928.html MySql数据库备份: 说明:我这里要把MySql数据库存放目录/var/lib ...

  4. SSIS -->> Variable

    变量的特点: 1)大小写敏感 2)可见范围限制,里层可以看到外层,外层看不到里层的: 在属性窗口开启EvaluateAsExpression选项可以支持expression动态赋值变量

  5. dojo 二 AMD模块

    可参考官方教程:http://dojotoolkit.org/documentation/tutorials/1.7/hello_dojo/教程里主要定义了两个方法,setText设置文本内容和res ...

  6. django如何检查创建的模型(model)是否有语法错误或者逻辑错误

    首先,用下面的命令验证模型的有效性: python manage.py validate validate 命令检查你的模型的语法和逻辑是否正确. 如果一切正常,你会看到 0 errors found ...

  7. OSX 升级 vim

    善用 Homebrew 神器啊,少年!Homebrew - The missing package manager for OS X安装完成后打开终端输入: brew install vim --wi ...

  8. GMT and CST

    GMT(Greenwich Mean Time) 代表格林尼治标准时间 而CST却同时可以代表如下 4 个不同的时区: Central Standard Time (USA) UT-6:00    C ...

  9. apache 配置用户级目录

    如果你只需要在用户目录下使用apache的话,还有一个最简单的方式,直接将 httpd.conf文件下的 DocumentRoot "/Library/WebServer/Documents ...

  10. singleton单例模式

    单例设计模式 单例设计模式概述    单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供    优点:    在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...