JS获取本机IP地址的方法(附上解决浏览器无法获取IP的方法)

JavaScript012

JS获取本机IP地址的方法(附上解决浏览器无法获取IP的方法),第1张

获取本机IP地址: if(typeof window != 'undefined'){     var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection     if (RTCPeerConnection) (()=>{         var rtc = new RTCPeerConnection()         rtc.createDataChannel('') //创建一个可以发送任意数据的数据通道         rtc.createOffer( offerDesc => { //创建并存储一个sdp数据         rtc.setLocalDescription(offerDesc)     }, e => { console.log(e)})     rtc.onicecandidate =(evt) => { //监听candidate事件         if (evt.candidate) {             console.log('evt:',evt.candidate)             let ip_rule = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/             var ip_addr = ip_rule.exec(evt.candidate.candidate)[1]             console.log('ip_addr:',ip_addr)   //打印获取的IP地址         }}     })()     else{console.log("没有找到")} } 如果电脑没获取到,基本上是因为浏览器限制了,解除方法如下: 解决方案: 火狐(FireFox) 删除隐藏IP 浏览器输入 about:config 搜索配置 media.peerconnection.enabled 改为false ( 刷新程序,IP正常显示 ) 谷歌(Chrome) 删除隐藏IP 浏览器输入:chrome://flags/#enable-webrtc-hide-local-ips-with-mdns 把 Anonymize local IPs exposed by WebRTC 设置为 disabled ( 刷新程序,IP正常显示 )

一. js对象的内存地址的解析 注:上面的例子中Object/Function/Array的对比结果都好说,因为他们构建出来的都是新的对象,对象比较是要比较根源(数据是否是同一个)。无论是使用new还是直接调用生成一个新的对象是要开辟新的空间存储的,不会和任何一个对象相等。 js中对象的比较:只有地址相同才相等。 其中地址指的是内存地址,即:在电脑内存中存放的位置。 如: ··· var a = new Object() var b = new Object() a.name = "mm" b.name = "mm" var c = a var d = a ··· 1、a == b //false 2、a == c //true 3、a == d //true 4、b == c //false 5、b == d //false 其中a == b 为false 就是因为其内存地址不同,通俗点理解就是两个东西在堆内存的位置不同。 对于 var a = 1; 其实是建立了一个对象a,但是js并不能直接引用它的值,而其实是在引用对象a所对应的堆的地址。可以理解为:保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。 例: 详细关于JS内存空间的描述请移步: https://blog.csdn.net/pingfan592/article/details/55189622/二. 原型 原型链 懂了上面关于内存地址的介绍,将更加有利于理解原型与原型链三. 使用 使用原型对象的好处是让所有对象实例共享他的属性和方法。 例: 参考 《高级程序设计》 问题:1、什么是原型链:ECMAScript中 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。基本的实现是利用构造函数,原型和实例的关系。即是每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针[[prototype]].由于构造函数,原型和实例存在这样的关系,如果我们让一个原型对象等于另一个构造函数的实例,那么此时这个原型对象将包含一个指向另一个原型对象的指针,这样的话,另一个原型原型中也包含着指向另一个构造函数的指针。如果另一个原型又是另一个类型的实例,那么上面的关系还是会成立。这样层层递进,就够成了实例与原型的链条,这就是所谓的原型链的基本概念。