zoukankan      html  css  js  c++  java
  • 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。最后再经行位运算操作。由此也就产生了这个"变态"现象。

  • 相关阅读:
    2020_java面试
    Centos7.2 安装docker、mysql和redis
    【源码讲解】Spring事务是如何应用到你的业务场景中的?
    奇葩说今晚聊前任|扒一扒你的前任企业邮箱
    一封一封邮件发送太累?个人邮箱快速群发解决烦恼
    企业邮箱客户端收发服务器如何设置?
    163VIP邮箱怎么设置邮件签名?如何群发邮件?
    企业版邮箱哪个适合学校邮箱?企业邮箱托管服务
    企业版邮箱购买哪个?公司邮箱如何申请?
    公司邮箱登录入口是?公司邮箱申请入口在?
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/3183616.html
Copyright © 2011-2022 走看看