一、连接过程继续解读-----fun32解读

1.1 fun32.02

"undefined" != typeof cordova && (N = !0, D = !0),
navigator &&
navigator.userAgent &&
-1 !== navigator.userAgent.indexOf("Crosswalk") &&
(N = !0, D = !0);
console.info('fun32.02==>2252==>2252');

注:关于函数中的逗号表达式,第一个逗号表达式执行完,不管它成立不成立,都要执行第二字逗号表达示,以最后一个逗号表达式生成的结果或真假为准;但在同一个逗号表达式中,如果是&&连接的,如果第一个("undefined" != typeof cordova)不成立,就不会执行第二个((N = !0, D = !0))了。

1)第一行代码

"undefined" != typeof cordova && (N = !0, D = !0),

注:"undefined" != typeof cordova这一句为假,后面的(N = !0, D = !0)不执行了,因为&&连接的表达式,必须都为真,总体的结果才为真。这一行,包括以下的几行,是判断一对一的客户端用没用手机,并且用没用crosswalk进行包裹,就是说webrtc代码不仅可以跑在浏览器上,也可以跑在crosswalk框架上。

2)第二至四行代码

navigator &&
navigator.userAgent &&
-1 !== navigator.userAgent.indexOf("Crosswalk") &&
(N = !0, D = !0);

a.) navigator如下:

b.) navigator.userAgent如下:

navigator.userAgent:  Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36

c.) navigator.userAgent.indexOf("Crosswalk")如下:

navigator.userAgent.indexOf("Crosswalk"):  -1

注:没查到Crosswalk,说明用的不是Crosswalk。这个判断为false,不再往下执行。

1.2  fun32.03

var V = !N && (I || L);

注:V是false表示PC端不是IE浏览器,true表示PC端是IE浏览器。

 

1.3 fun32.04

V &&

"undefined" != typeof URL &&

(URL.createObjectURL = function() {});

1)V

V是false

2)typeof URL

URL是个函数

3)URL.createObjectURL

URL.createObjectURL是个函数

总的截图如下:

注:总的来说,这一行还是false,因为第一个就是false。

1.4 fun32.05

    var W = (!!(window.process &&

                "object" == typeof window.process &&

                window.process.versions &&

                window.process.versions["node-webkit"]), 50),

        B = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);

console.info('fun32.05==>2263==>2263');

1)变量W

    var W = (!!(window.process &&

                "object" == typeof window.process &&

                window.process.versions &&

                window.process.versions["node-webkit"]), 50),

注:W里面是个逗号表达式,!!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false;

var a;

var b=!!a;

a默认是undefined。!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值。

2)变量B

B = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);

注:B能匹配出三个变量。

1.5 fun32.06

D && B && B[2] && (W = parseInt(B[2], 10));

1)D

D:用于判断是不是谷歌浏览器。

2)B

B是一个数组,如果是谷歌浏览器,它会产生三个元素。通过运行发现:D && B=B

3)B[2]

B[2]:64,表示安装的是64位的浏览器。

注:此时,走到这一步了,结果就是64,即:D && B && B[2] = B[2],这建立在D,B都成立的情况下。

4)W = parseInt(B[2], 10)

parseInt()函数,用于解析一个字符串,并返回一个整数。

注:所以W= parseInt(B[2], 10)= parseInt(64, 10)=60+4=64

所以整个表达式的值为64

1.6 fun32.07

    var F = 50;

    B = navigator.userAgent.match(/Firefox\/(.*)/),

    U && B && B[1] && (F = parseInt(B[1], 10)),

    window.addEventListener || (window.addEventListener = function(e, n, t) {

        e.attachEvent && e.attachEvent("on" + n, t)

    }),

    window.attachEventListener = function(e, n, t, o) {

        e.addEventListener(n, t, o)

    };

console.info('fun32.07==>2277==>2277');

1)var F = 50;

定义一个变量F,并赋值为50.

2)B = navigator.userAgent.match(/Firefox\/(.*)/),

用于判断是否为火狐浏览器,输出应该为false为空。截图如下:

3)U && B && B[1] && (F = parseInt(B[1], 10)),

U为false,不用往下看了,由上可以B是null,也为假。

4)监听

window.addEventListener || (window.addEventListener = function(e, n, t) {

e.attachEvent && e.attachEvent("on" + n, t)

}),

注:这是一个监听函数,但后面不知为什么,重定义了。用到时,再说吧。

webrtc底层一对一连接过程探索(二)的更多相关文章

  1. webrtc底层一对一连接过程探索(三)

    一.连接过程继续解读-----fun33-fun35解读 完整代码如下: //fun33-37 console.error('fun35-37==>2332==>2332'); var q ...

  2. webrtc初探之一对一的连接过程(一)

    说明,我研究的是muan-khan的一个github项目,针对的是chrome对chrome,也就是pc对pc的一对一,一对多通话,感兴趣的可以继续往下看. github地址:https://gith ...

  3. WebRTC 源码分析(五):安卓 P2P 连接过程和 DataChannel 使用

    从本篇起,我们将迈入新的领域:网络传输.首先我们看看 P2P 连接的建立过程,以及 DataChannel 的使用,最终我们会利用 DataChannel 实现一个 P2P 的文字聊天功能. P2P ...

  4. 基于webrtc的资源释放问题(二)

    基于webrtc的资源释放问题(二) ——建立连接的过程中意外中断 应用背景: 我们在打电话的时候会不会遇到这种情况?打电话的时候未接通之前挂掉了电话,或者在接通之后建立的连接的过程中挂掉电话? 特别 ...

  5. [网络技术][转]PPTP连接过程

    转自:http://blog.csdn.net/zhu_hit/article/details/5698958 在未来几天会总结一下PPTP的工作过程,分为以下3篇讲述. 1. PPTP连接过程: 2 ...

  6. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53150322 Agenda: 一 ...

  7. DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描

    DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许进制转载  吐槽之后应该有所改了,该方式可以作为一种过渡方式 ...

  8. Dual Path Networks(DPN)——一种结合了ResNet和DenseNet优势的新型卷积网络结构。深度残差网络通过残差旁支通路再利用特征,但残差通道不善于探索新特征。密集连接网络通过密集连接通路探索新特征,但有高冗余度。

    如何评价Dual Path Networks(DPN)? 论文链接:https://arxiv.org/pdf/1707.01629v1.pdf在ImagNet-1k数据集上,浅DPN超过了最好的Re ...

  9. Hadoop集群搭建安装过程(二)(图文详解---尽情点击!!!)

    Hadoop集群搭建安装过程(二)(配置SSH免密登录)(图文详解---尽情点击!!!) 一.配置ssh无密码访问 ®生成公钥密钥对 1.在每个节点上分别执行: ssh-keygen -t rsa(一 ...

随机推荐

  1. hdu_1025(LIS Nlog(N)算法)

    题意:自己慢慢读吧.大概就是道路两边建路,给出建路需求,要求两条路不能有交叉,问最多可以建多少条路. 题解:一看数据范围500000,应该是dp,再画个图模拟一下,发现实质就是求最长上升子序列,很自然 ...

  2. c++(排序二叉树线索化)

    前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么 ...

  3. 【Linux搭建创建FTP服务器】---完美解决 - 费元星

    配置大红字文件置顶:   vsftp d.conf 4.5KB     useradd -d /home/bai_du -s /sbin/nologin bai_du 修改访问权限: usermod ...

  4. Oracle_建表

    Oracle_建表 --设计要求: --建立一张用来存储学生信息的表 --字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息   create table student(        ...

  5. 关于将dede织梦data目录迁移出web目录

    关于将dede织梦data目录迁移出web目录织梦官方提供了一个教程,但是如果你是按照他们提供的教程做的话会出现很多问题.比如验证码问题,图片显示问题等等一大堆.织梦官方这种是很不负责任的,因为那个教 ...

  6. 宝塔服务器管理助手Linux面版-使用教程

    在顺利安装宝塔服务器linux面板之后,我们打开这个面板,UI界面设计的很简介,所有命令一看就知道是干什么用的,和我们以前用过的虚拟主机管理后台是很像的. 方法/步骤 1 使用方法如下: 面板地址:h ...

  7. dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置

    后台,系统,系统基本参数,附件设置格式

  8. 新版Azure Automation Account 浅析(一) --- 创建和Run As Account

    去年年底Azure中国的Automation Account悄悄做了升级.新版本不管从功能还是end user experience方面都让人耳目一新.如果说升级前只是一个运行脚本的小工具,升级后的A ...

  9. MYSQL Nested Join Optimization

    table_factor的语法和标准sql比较,后者只接受table_reference,每个逗号项都等于一个inner Join,e.g. SELECT * FROM t1 LEFT JOIN (t ...

  10. spring task 定时

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...