Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 一级毛片一级毛片,91国内在线观看,欧美精品a毛片免费观看

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          EV屏幕共享-投屏軟件推薦

          EV屏幕共享-投屏軟件推薦

          V屏幕共享電腦版是一款投屏軟件,使用這款工具只需要通過局域網(wǎng)(互聯(lián)網(wǎng)亦可),就能讓電腦顯示器顯示其他設(shè)備的畫面,比如另一臺電腦或者自己的收集,可以用于辦公遠(yuǎn)程操作,和手機(jī)PPT投屏。

          來源:http://www.3h3.com/soft/180376.html

          軟件介紹

          EV屏幕共享是一唯科技推出的電腦屏幕共享投屏軟件,在同一局域網(wǎng)內(nèi),可以讓電腦和手機(jī)共享同一屏幕,不僅可以給您帶來優(yōu)秀的一站式屏幕交互解決方案,更有著同類軟件不可比擬的極簡式操作體驗(yàn)!

          通過軟件只要連接相同的網(wǎng)即可即可支持屏幕共享,支持局域網(wǎng)搜索和手動輸入兩種方式,任意選擇,手機(jī)和電腦共享,任意切換攝像頭的畫面,可以滿足用戶的視頻畫質(zhì)需求,操作簡單,支持多人快速打開屏幕共享,沒有任何的廣告,所有的功能全都可以免費(fèi)使用。

          軟件特色

          【快速連接,屏幕共享】

          局域網(wǎng)搜索、手動輸入,兩種方式隨意選擇。

          【超低延遲,屏幕共享】

          局域網(wǎng)內(nèi)超低延遲,手機(jī)和電腦屏幕共享。

          【前置后置,隨意切換】

          手機(jī)投屏過程中,可以隨時切換攝像頭的畫面。

          軟件功能

          一、高清大屏,極致體驗(yàn)

          現(xiàn)在 你可以直接在電腦屏幕中查看手機(jī)里的圖片、視頻了。

          只需將手機(jī)連接至同局域網(wǎng)內(nèi)的電腦,即可輕松投屏手機(jī)中的多媒體畫面,橫屏豎屏隨時切換,開啟大屏視覺體驗(yàn)!

          二、會議演示,不再繁瑣

          有了EV屏幕共享,你可以更加從容地準(zhǔn)備你的會議了。

          多人局域網(wǎng)內(nèi)實(shí)時共享屏幕,最多可同步共享4臺移動設(shè)備/電腦。手機(jī)麥克風(fēng)清晰收音至電腦端,無論是演示文稿,還是工作匯報、小組溝通,用它一定錯不了。

          三、文檔影音,即時傳輸

          QQ、微信傳文件早已過時,現(xiàn)在,EV屏幕共享為你開啟極速傳輸。

          投屏過程中,可將文檔、圖片、音樂等多媒體文件,實(shí)時一鍵批量傳輸至其他共享設(shè)備。近乎0壓縮的傳輸技術(shù),絕對捍衛(wèi)你的圖片/視頻畫質(zhì)。

          更新日志

          1、修復(fù)部分已知bug;

          2、優(yōu)化用戶體驗(yàn)。


          拷貝和深拷貝都是對于 JS 中的引用類型而言的,淺拷貝就只是復(fù)制對象的引用,如果拷貝后的對象發(fā)生變化,原對象也會發(fā)生變化。只有深拷貝才是真正地對對象的拷貝。

          前言

          說到深淺拷貝,必須先提到的是JavaScript的數(shù)據(jù)類型,之前的一篇文章JavaScript基礎(chǔ)心法——數(shù)據(jù)類型說的很清楚了,這里就不多說了。

          需要知道的就是一點(diǎn):JavaScript的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

          對于基本數(shù)據(jù)類型的拷貝,并沒有深淺拷貝的區(qū)別,我們所說的深淺拷貝都是對于引用數(shù)據(jù)類型而言的。

          淺拷貝

          淺拷貝的意思就是只復(fù)制引用,而未復(fù)制真正的值。

          const originArray=[1,2,3,4,5];const originObj={a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};const cloneArray=originArray;const cloneObj=originObj;console.log(cloneArray); // [1,2,3,4,5]console.log(originObj); // {a:'a',b:'b',c:Array[3],d:{dd:'dd'}}cloneArray.push(6);cloneObj.a={aa:'aa'};console.log(cloneArray); // [1,2,3,4,5,6]console.log(originArray); // [1,2,3,4,5,6]console.log(cloneObj); // {a:{aa:'aa'},b:'b',c:Array[3],d:{dd:'dd'}}console.log(originArray); // {a:{aa:'aa'},b:'b',c:Array[3],d:{dd:'dd'}}

          上面的代碼是最簡單的利用=賦值操作符實(shí)現(xiàn)了一個淺拷貝,可以很清楚的看到,隨著 cloneArray 和 cloneObj 改變,originArray和 originObj 也隨著發(fā)生了變化。

          深拷貝

          深拷貝就是對目標(biāo)的完全拷貝,不像淺拷貝那樣只是復(fù)制了一層引用,就連值也都復(fù)制了。

          只要進(jìn)行了深拷貝,它們老死不相往來,誰也不會影響誰。

          目前實(shí)現(xiàn)深拷貝的方法不多,主要是兩種:

          1. 利用 JSON 對象中的 parse 和 stringify
          2. 利用遞歸來實(shí)現(xiàn)每一層都重新創(chuàng)建對象并賦值

          JSON.stringify/parse的方法

          先看看這兩個方法吧:

          The JSON.stringify() method converts a JavaScript value to a JSON string.

          JSON.stringify 是將一個 JavaScript 值轉(zhuǎn)成一個 JSON 字符串。

          The JSON.parse() method parses a JSON string, constructing the JavaScript value or object described by the string.

          JSON.parse 是將一個 JSON 字符串轉(zhuǎn)成一個 JavaScript 值或?qū)ο蟆?/p>

          很好理解吧,就是 JavaScript 值和 JSON 字符串的相互轉(zhuǎn)換。

          它能實(shí)現(xiàn)深拷貝呢?我們來試試。

          const originArray=[1,2,3,4,5];const cloneArray=JSON.parse(JSON.stringify(originArray));console.log(cloneArray===originArray); // falseconst originObj={a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};const cloneObj=JSON.parse(JSON.stringify(originObj));console.log(cloneObj===originObj); // falsecloneObj.a='aa';cloneObj.c=[1,1,1];cloneObj.d.dd='doubled';console.log(cloneObj); // {a:'aa',b:'b',c:[1,1,1],d:{dd:'doubled'}};console.log(originObj); // {a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};

          確實(shí)是深拷貝,也很方便。但是,這個方法只能適用于一些簡單的情況。比如下面這樣的一個對象就不適用:

          const originObj={  name:'axuebin',  sayHello:function(){    console.log('Hello World');  }}console.log(originObj); // {name: "axuebin", sayHello: ?}const cloneObj=JSON.parse(JSON.stringify(originObj));console.log(cloneObj); // {name: "axuebin"}

          發(fā)現(xiàn)在 cloneObj 中,有屬性丟失了。。。那是為什么呢?

          在 MDN 上找到了原因:

          If undefined, a function, or a symbol is encountered during conversion it is either omitted (when it is found in an object) or censored to null (when it is found in an array). JSON.stringify can also just return undefined when passing in "pure" values like JSON.stringify(function(){}) or JSON.stringify(undefined).

          undefined、function、symbol 會在轉(zhuǎn)換過程中被忽略。。。

          明白了吧,就是說如果對象中含有一個函數(shù)時(很常見),就不能用這個方法進(jìn)行深拷貝。

          遞歸的方法

          遞歸的思想就很簡單了,就是對每一層的數(shù)據(jù)都實(shí)現(xiàn)一次 創(chuàng)建對象->對象賦值 的操作,簡單粗暴上代碼:

          function deepClone(source){  const targetObj=source.constructor===Array ? [] : {}; // 判斷復(fù)制的目標(biāo)是數(shù)組還是對象  for(let keys in source){ // 遍歷目標(biāo)    if(source.hasOwnProperty(keys)){      if(source[keys] && typeof source[keys]==='object'){ // 如果值是對象,就遞歸一下        targetObj[keys]=source[keys].constructor===Array ? [] : {};        targetObj[keys]=deepClone(source[keys]);      }else{ // 如果不是,就直接賦值        targetObj[keys]=source[keys];      }    }   }  return targetObj;}

          我們來試試:

          const originObj={a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};const cloneObj=deepClone(originObj);console.log(cloneObj===originObj); // falsecloneObj.a='aa';cloneObj.c=[1,1,1];cloneObj.d.dd='doubled';console.log(cloneObj); // {a:'aa',b:'b',c:[1,1,1],d:{dd:'doubled'}};console.log(originObj); // {a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};

          可以。那再試試帶有函數(shù)的:

          const originObj={  name:'axuebin',  sayHello:function(){    console.log('Hello World');  }}console.log(originObj); // {name: "axuebin", sayHello: ?}const cloneObj=deepClone(originObj);console.log(cloneObj); // {name: "axuebin", sayHello: ?}

          也可以。搞定。

          是不是以為這樣就完了??當(dāng)然不是。

          JavaScript中的拷貝方法

          我們知道在 JavaScript 中,數(shù)組有兩個方法 concat 和 slice 是可以實(shí)現(xiàn)對原數(shù)組的拷貝的,這兩個方法都不會修改原數(shù)組,而是返回一個修改后的新數(shù)組。

          同時,ES6 中 引入了 Object.assgn 方法和 ... 展開運(yùn)算符也能實(shí)現(xiàn)對對象的拷貝。

          那它們是淺拷貝還是深拷貝呢?

          concat

          The concat() method is used to merge two or more arrays. This method does not change the existing arrays, but instead returns a new array.

          該方法可以連接兩個或者更多的數(shù)組,但是它不會修改已存在的數(shù)組,而是返回一個新數(shù)組。

          看著這意思,很像是深拷貝啊,我們來試試:

          const originArray=[1,2,3,4,5];const cloneArray=originArray.concat();console.log(cloneArray===originArray); // falsecloneArray.push(6); // [1,2,3,4,5,6]console.log(originArray); [1,2,3,4,5];

          看上去是深拷貝的。

          我們來考慮一個問題,如果這個對象是多層的,會怎樣。

          const originArray=[1,[1,2,3],{a:1}];const cloneArray=originArray.concat();console.log(cloneArray===originArray); // falsecloneArray[1].push(4);cloneArray[2].a=2; console.log(originArray); // [1,[1,2,3,4],{a:2}]

          originArray 中含有數(shù)組 [1,2,3] 和對象 {a:1},如果我們直接修改數(shù)組和對象,不會影響 originArray,但是我們修改數(shù)組 [1,2,3] 或?qū)ο?{a:1} 時,發(fā)現(xiàn) originArray 也發(fā)生了變化。

          結(jié)論:concat 只是對數(shù)組的第一層進(jìn)行深拷貝。

          slice

          The slice() method returns a shallow copy of a portion of an array into a new array object selected from begin to end (end not included). The original array will not be modified.

          解釋中都直接寫道是 a shallow copy 了 ~

          但是,并不是!

          const originArray=[1,2,3,4,5];const cloneArray=originArray.slice();console.log(cloneArray===originArray); // falsecloneArray.push(6); // [1,2,3,4,5,6]console.log(originArray); [1,2,3,4,5];

          同樣地,我們試試多層的數(shù)組。

          const originArray=[1,[1,2,3],{a:1}];const cloneArray=originArray.slice();console.log(cloneArray===originArray); // falsecloneArray[1].push(4);cloneArray[2].a=2; console.log(originArray); // [1,[1,2,3,4],{a:2}]

          果然,結(jié)果和 concat 是一樣的。

          結(jié)論:slice 只是對數(shù)組的第一層進(jìn)行深拷貝。

          Object.assign()

          The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object.

          復(fù)制復(fù)制復(fù)制。

          那到底是淺拷貝還是深拷貝呢?

          自己試試吧。。

          結(jié)論:Object.assign() 拷貝的是屬性值。假如源對象的屬性值是一個指向?qū)ο蟮囊茫仓豢截惸莻€引用值。

          ... 展開運(yùn)算符

          const originArray=[1,2,3,4,5,[6,7,8]];const originObj={a:1,b:{bb:1}};const cloneArray=[...originArray];cloneArray[0]=0;cloneArray[5].push(9);console.log(originArray); // [1,2,3,4,5,[6,7,8,9]]const cloneObj={...originObj};cloneObj.a=2;cloneObj.b.bb=2;console.log(originObj); // {a:1,b:{bb:2}}

          結(jié)論:... 實(shí)現(xiàn)的是對象第一層的深拷貝。后面的只是拷貝的引用值。

          首層淺拷貝

          我們知道了,會有一種情況,就是對目標(biāo)對象的第一層進(jìn)行深拷貝,然后后面的是淺拷貝,可以稱作“首層淺拷貝”。

          我們可以自己實(shí)現(xiàn)一個這樣的函數(shù):

          function shallowClone(source) {  const targetObj=source.constructor===Array ? [] : {}; // 判斷復(fù)制的目標(biāo)是數(shù)組還是對象  for (let keys in source) { // 遍歷目標(biāo)    if (source.hasOwnProperty(keys)) {      targetObj[keys]=source[keys];    }  }  return targetObj;}

          我們來測試一下:

          const originObj={a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};const cloneObj=shallowClone(originObj);console.log(cloneObj===originObj); // falsecloneObj.a='aa';cloneObj.c=[1,1,1];cloneObj.d.dd='surprise';

          經(jīng)過上面的修改,cloneObj 不用說,肯定是 {a:'aa',b:'b',c:[1,1,1],d:{dd:'surprise'}} 了,那 originObj 呢?剛剛我們驗(yàn)證了 cloneObj===originObj 是 false,說明這兩個對象引用地址不同啊,那應(yīng)該就是修改了 cloneObj 并不影響 originObj。

          console.log(cloneObj); // {a:'aa',b:'b',c:[1,1,1],d:{dd:'surprise'}}console.log(originObj); // {a:'a',b:'b',c:[1,2,3],d:{dd:'surprise'}}

          What happend?

          originObj 中關(guān)于 a、c都沒被影響,但是 d 中的一個對象被修改了。。。說好的深拷貝呢?不是引用地址都不一樣了嗎?

          原來是這樣:

          1. 從 shallowClone 的代碼中我們可以看出,我們只對第一層的目標(biāo)進(jìn)行了 深拷貝 ,而第二層開始的目標(biāo)我們是直接利用=賦值操作符進(jìn)行拷貝的。
          2. so,第二層后的目標(biāo)都只是復(fù)制了一個引用,也就是淺拷貝。

          總結(jié)

          1. 賦值運(yùn)算符=實(shí)現(xiàn)的是淺拷貝,只拷貝對象的引用值;
          2. JavaScript 數(shù)組和對象自帶的拷貝方法都是“首層淺拷貝”;
          3. JSON.stringify 實(shí)現(xiàn)的是深拷貝,但是對目標(biāo)對象有要求;
          4. 若想真正意義上的深拷貝,請遞歸。

          文末粉絲福利:

          → 送全套程序員必讀資料!

          → 精選技術(shù)資料共享!

          → 高手如云交流社群!

          介紹,Chrome瀏覽器中進(jìn)行的關(guān)于網(wǎng)絡(luò)共享API的實(shí)驗(yàn),預(yù)計在2017年4月份才能落幕,進(jìn)展情況信息更新較快,詳情可訪問developers.google.com。

          Chrome 55版本的發(fā)行,為Android系統(tǒng)采用Web共享API提供了可能性,這篇文章主要介紹,如何用Web共享API來豐富當(dāng)前的分享聚道。

          ? 要求一

          2017年4月份之前,Web共享API都只處于探索時期,因此需要先注冊,1天之后會收到一份相關(guān)電子郵件。

          下一步必須在網(wǎng)站上做好標(biāo)記:

          ?要求二

          ?網(wǎng)站需要通過HTTPS服務(wù)

          ?使用navigator.share(),由用戶操作(點(diǎn)擊)

          ?所有屬性值必須是字符串

          現(xiàn)在可以試著用Web共享API, 如圖:

          首先,了解一下靜態(tài)twitter分享鏈接:

          用這種方式,使用不支持API的瀏覽器,會獲得一個鏈接(看起來似乎像一個按鈕),可以在twitter上直接分享網(wǎng)站。

          接下來,在網(wǎng)站下方添加一個腳本,使用API來分享鏈接:

          逐一檢查代碼:添加功能,測試是否支持navigator.share,若支持,直接更改分享鏈接的文本,從“推特共享”到“分享”顯示各種分享聚道。

          接下來,給分享鏈接添加一個EventListener指引,即:navigator.share,用于點(diǎn)擊分享,可在此定義標(biāo)題和網(wǎng)址的屬性,也可添加一個文本屬性,鏈接規(guī)范的話可直接使用,否則用當(dāng)前網(wǎng)址。

          最后,添加:ev.preventDefault();防止鏈接自動默認(rèn)分享。

          現(xiàn)在,使用瀏覽器支持共享API,可以輕松共享所有服務(wù)網(wǎng)站了,通過安裝服務(wù)器或者APP,直接分享twitter鏈接或復(fù)制網(wǎng)址,分享個鏈接,你也可以在Github中直接找到代碼:https://justmarkup.com/web-share-api/using-the-web-share-api.html

          注意:為了解決瀏覽器不支持Web共享API的問題,以便用戶更好地參與分享,可使用https://jonsuh.com/blog/social-share-links/,在彈出窗口中加載共享內(nèi)容。

          總結(jié):

          Web 共享API功能的實(shí)現(xiàn)至少要到2017年4月,我個人比較喜歡文中提到的方法,也是一次很不錯的嘗試,許多網(wǎng)站已經(jīng)在使用瀏覽器實(shí)現(xiàn)各種特性,增強(qiáng)用戶體驗(yàn),有興趣的朋友也可以親自試試哦。

          分享快樂!

          智能社撰稿,更多知識請關(guān)注微信號zhi_neng_she


          主站蜘蛛池模板: 国产成人精品无码一区二区三区| 色欲AV无码一区二区三区| 国产传媒一区二区三区呀| 立川理惠在线播放一区| 亚洲成AV人片一区二区| 韩国精品一区二区三区无码视频 | 久久久久久免费一区二区三区| 日韩免费一区二区三区| 精品人妻一区二区三区浪潮在线| 久久精品人妻一区二区三区| 日韩精品无码Av一区二区| 性色AV一区二区三区无码| 91在线精品亚洲一区二区| 国产精品日本一区二区不卡视频 | 日本免费一区二区久久人人澡| 午夜视频一区二区| 国产精品无码一区二区三区不卡 | 熟妇人妻系列av无码一区二区| 国产熟女一区二区三区五月婷| 久久精品成人一区二区三区| 无码人妻精品一区二区三区蜜桃| 91一区二区在线观看精品| 中文字幕一区二区精品区| AA区一区二区三无码精片| 国产香蕉一区二区精品视频| 2022年亚洲午夜一区二区福利| 国产精品va无码一区二区| 国99精品无码一区二区三区| 午夜影视日本亚洲欧洲精品一区| 亚洲国产精品一区| 亚洲美女视频一区二区三区 | 一区视频在线播放| 风流老熟女一区二区三区| 无码精品人妻一区二区三区AV| 亚洲日本一区二区三区在线不卡| 国产一区二区三区精品视频| 亚洲av无码一区二区乱子伦as| 少妇激情一区二区三区视频| 中文字幕AV一区二区三区人妻少妇 | 波多野结衣高清一区二区三区| 成人区精品人妻一区二区不卡|