国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

你可能不知道的一些JavaScript 奇技淫巧

開發 開發工具 前端
這里記錄一下以前學習各種書籍和文章里邊出現的JS的小技巧,分享給大家,也供自己查閱,同時感謝那些發現創造和分享這些技巧的前輩和大牛們。

這里記錄一下以前學習各種書籍和文章里邊出現的JS的小技巧,分享給大家,也供自己查閱,同時感謝那些發現創造和分享這些技巧的前輩和大牛們。

[[131590]]

1、遍歷一個obj的屬性到數組

 

  1. var a=[];  
  2. for(a[a.length] in obj);  
  3. return a; 

 

  乍一看可能比較蒙,不過仔細分析還是不難理解的。常見用法是for(var key in obj),這里key初始也是undefined的,a[a.length]整體也是undefined,所以二者其實是等價的。在for循環中,obj 的屬性會依次賦值給key,同樣,也依次賦值給a[a.length],這里length一直在變,就巧妙地挨個賦值給數組的每一個元素了。

2、重復字符串(如abc=>abcabc)

 

  1. function repeat(target,n){          
  2. return (new Array(n+1).join(target));    
  3.  } 

 

  改良版本:

 

  1. function repeat(target,n){          
  2. return Array.prototype.join.call(         
  3.  {length:n+1},target);//之所以要創建帶length屬性的對象,是因為調用數組原型方法時,必須是一個類數組對象,而類數組對象的條件就是length為非負整數 
  4.   } 

 

  不新建數組,而是用擁有length屬性的對象替代,然后調用數組的join方法,性能提升很大  

  再改進:

 

  1. var repeat=(function(){          
  2.  join=Array.prototype.join,obj={};          
  3. return function(target,n){               
  4. obj.length=n+1;               
  5. return join.call(obj,target);          }     })(); 

利用閉包將對象和join方法緩存起來,不用每次都新建對象和尋找方法

 

3、for循環中,當第二項為false時會終止循環,這里并不一定存在比較,可以直接賦值,如果賦值為undefined之類的值時,轉成bool值也為假,因此也會終止,比如遍歷數組可以寫成:

 

  1. for(var i=arr.length,element;element=arr[—-i];){…} 

 

  這里,第二項一定是arr[—-i]而非arr[i--],如果是后者的話,上來就是undefined,就不會執行循環體,或者for(var i=0,element;element=arr[i++];){…}

4、NaN是JS中唯一不等于自己的值,因此可以用來判斷一個變量是否真的為NaN:a!==a

5、“<”,”+”等運算符會強制符號兩邊的表達式執行valueOf然后比較,所以如果兩邊是函數或者對象,而又重寫了該對象的valueOf方法,就會自動執行兩邊的方法。如:

 

  1. var a={valueOf:function(){console.log(“aaa”);}},b={valueOf:function(){console.log(“bbb”);}};    
  2. a<b;//會輸出:aaa;bbb;false; 

 

6、JS具備自動插入分號的能力,但是自動插入分號并不是***的,其有三條規則:

  1)只在”}”標記之前、一個或多個換行之后以及程序輸入的結尾被插入;

  2)分號只在隨后的輸入標記不能被解析時插入;

       這一點很重要,比如:

  1. a=b 
  2. (f()); 

       是不會在a=b之后自動插入分號的,因為a=b(f())是可以被解析的,因此像”(“,”[“,”+”,”-“,”/“開頭的時候,需要特別注意上一行可能不會自動插入。

    還有一些情況,盡管不會出現解析錯誤,JS仍然會強制插入分號,這就是所謂的JS語法限制產生式。它不允許在兩個字符間出現換行,最危險的就是return語句,如

    return 

    {};

    會被強制插入而成為

    return;

    {};

    類似的還有:throw語句、帶有顯示標簽的break活著continue語句、后置自增或自減運算符

  3)分號不會作為分隔符在for循環空語句的頭部被自動插入

    因此,***的辦法是在自己的js文件的最開始防御性地插入”;”,這樣在合并js文件的時候就不會出問題了。

7、閉包。理解閉包需學會三個基本事實:

(1)JS允許你引用在當前函數意外定義的變量

(2)即使外部函數已經返回,當前函數仍然可以引用在外部函數所定義的變量。這是因為JS的函數值包含里比調用它們時執行所需要的代碼更多的信息

(3)閉包可以更新外部變量的值。這是因為閉包存儲的是外部變量的引用而非值副本。如:

 

  1. function box(){     var val=undefined;     return {          set:function(x){val=x;},          get:function(){return val;}     };}var b=box();b.get();//“undefined” 
  2. b.set(5);b.get();//5 

 

  這一點很重要,比如在函數的for循環體內返回閉包或者有閉包取for循環的計數器值,那么這個閉包取到的永遠是for循環結束時i的最終值,因為閉包存儲的是它的引用而非當時的值副本。

8、JS沒有塊級作用域,因此通常情況下函數內部的所有變量都是綁定到函數作用域的,也就是說相當于都在函數一開始就聲明了的,一個例外就是try/catch中的變量是塊級的,只屬于try/catch塊。

9、眾所周知,在函數內部聲明函數是可以的,但是在在函數內的局部塊里聲明,可能會出現問題:

 

  1. function f(){return “global”;}function test(x){     function f(){return “local”}     var result=[];     if(x){          result.push(f());     }     result.push(f());     return result;}test(true);//[“local”,”local”] 
  2. test(false);//[“local”] 

 

將函數聲明到if塊中:

 

 

  1. function f(){return “global”;}function test(x){     var result=[];     if(x){          function f(){return “local”}          result.push(f());     }     result.push(f());     return result;} test(true);//? 
  2. test(false);//? 

 

 

結果會如何呢?理論上講,JS沒有塊級作用域,因此f()的作用域是整個test函數,因此合理猜測應該是與上一次輸出相同,全部 為”local”,可是并不是所有的JS執行環境都如此行事,有的會根據是否執行包含f的代碼塊來有條件地綁定函數f(綁定即意味著將該變量綁定到其最近 的作用域,而賦值是發生在代碼實際執行到賦值那一步的時候進行的)。

因此***的辦法是如果要聲明嵌套函數,都在其富函數的最外層聲明,要么就不要聲明函數,而是使用var聲明和函數表達式來實現:

 

 

  1. function f(){return “global”;}function test(x){     var result=[];     if(x){          var g=function(){return “local”}          result.push(g());     }     result.push(f());     return result;}   

 

 

10、用js創建字典的時候,如果是利用對象的方式(因為JS對象的核心是一個字符串屬性名稱和屬性值的映射表),會遇到一個問題就是原型污染,因 為獲取字典屬性值的時候用hasOwnProperty還好,如果用for in遍歷的話,不僅會遍歷對象本身,包括它的原型,因此如果在其他地方污染了Object的原型,那么for in就會產生非預期的結果,這時可能會用hasOwnProperty來先檢測該對象本身是否含有屬性來避免原型污染,然而更極端的情況是連 hasOwnProperty這個原型方法都有可能被污染。避免原型污染的方法是在創建字典對象的時候用Object.create(null)來創建一 個完全空對象,這個對象沒有原型,這個方法是ES5的,在沒有這個方法可用的時候,***是創建字典類,然后在字典類里用數組來存儲有序集合,自己維護這個 集合。

11、JS中的類數組對象可以享用數組的大部分原型方法如map等,類數組對象是指滿足兩個條件的對象:一是具備合理范圍值內的length屬性, 二是length屬性大于該對象的***索引,索引是一個合理范圍的證書,它的字符串表示的是對象的一個key;但是數組的一個原型方法contact是不 能被類數組對象調用的,因此需要先用[].slice.call把類數組對象轉換為真正的數組比如[].slice.call(arguments)。

12、并不是所有時候都需要繼承,繼承也不是***的,有時候會創造比他能解決的更多的問題,特別是當層次關系沒那么明顯的時候,這時候應該多用結構 類型(又叫鴨子類型,如果它看起來像鴨子、游泳像鴨子并且叫聲像鴨子,那么它就是鴨子),用結構類型設計靈活的對象接口的時候,不需要創建類工廠來返回類 的實例,而是直接返回對象,對象具備預期的方法和屬性,比如:

  1. SomeObj.someWidget=function(opts){     return {          a:blabla,          b:function(){...},          c:blabla     }} 

 原文鏈接:http://www.cnblogs.com/dson/p/4415278.html

【編輯推薦】

 

  1. JavaScript全文搜索之相關度評分
  2. 編程語言流行榜:JavaScript 坐頭把交椅,Swift 躥升最快
  3. JavaScript中常見的字符串操作函數及用法
  4. JavaScript開發者:Win10斯巴達瀏覽器很贊
  5. JavaScript將在企業環境中引發巨大變革

 

【責任編輯:wangxueyan TEL:(010)68476606】

 

責任編輯:王雪燕 來源: 博客園
相關推薦

2015-05-07 13:13:27

JavaScript JavaScript

2021-02-16 09:02:59

Python代碼技巧

2021-07-05 05:34:10

Typescript語言開發

2022-04-24 16:00:15

LinuxLinux命令ls命令

2021-11-01 12:10:56

Python技巧代碼

2012-11-23 10:57:44

Shell

2020-05-09 08:48:21

JavaScript原生方法代碼

2023-02-27 09:20:24

絕對定位CSS

2023-01-29 09:46:47

Dialog彈窗模態

2021-01-05 11:22:58

Python字符串代碼

2020-01-29 19:40:36

Python美好,一直在身邊Line

2015-08-13 09:03:14

調試技巧

2019-11-20 10:25:06

sudoLinux

2017-11-07 21:58:25

前端JavaScript調試技巧

2020-11-03 09:51:04

JavaScript開發 技巧

2021-07-12 07:59:06

安全 HTML 屬性

2019-11-25 14:05:47

Python裝飾器數據

2014-12-08 10:39:15

2025-03-19 09:46:45

2024-09-11 16:21:09

點贊
收藏

51CTO技術棧公眾號

亚洲午夜久久| 日日夜夜亚洲精品| 久久99精品久久久| 老牛影视免费一区二区| 18涩涩午夜精品.www| 久久综合伊人77777麻豆最新章节| 国产真实精品久久二三区| 天天综合色天天综合色hd| 久久成人羞羞网站| 亚洲国产精品无码av| 91日韩在线专区| 成人18网址在线观看| 亚洲免费在线观看视频| 亚洲最新合集| 欧美一级二级在线观看| 日韩精品一区二区三区| 欧美大奶子在线| 国产中文精品久高清在线不| 成人精品一二区| 紧缚奴在线一区二区三区| 人妻有码中文字幕| 亚洲欧美日韩久久| 老司机午夜在线视频| 亚洲欧洲中文天堂| 丝袜美腿综合| 精品国产一区二区三区麻豆免费观看完整版| 亚洲免费综合| 国产婷婷一区二区三区| 悠悠色在线精品| 黄色国产网站在线播放| www.日本久久久久com.| 成人羞羞视频播放网站| 日本10禁啪啪无遮挡免费一区二区| 国产不卡一区视频| 影音先锋一区| 日韩一级免费看| 亚洲国产综合在线| freexxx性亚洲精品| 欧美日韩国产成人在线| 国产精品观看| 夫妻免费无码v看片| 欧美日韩国产中字| 四虎4545www国产精品| 国产精品久久久久久久久久久不卡| av成人天堂| 黄在线观看网站| 91电影在线观看| 国产原创一区| 999精品在线观看| 99riav一区二区三区| 久香视频在线观看| 美乳少妇欧美精品| 免费亚洲一区| 一级片视频免费观看| 欧美一区二区视频网站| 中文字幕亚洲在线观看| 国产超碰91| 日本一区二区三区高清不卡| 久久精品视频免费看| 午夜精品久久久久久99热软件| 久久五月激情| 天天操夜夜干| www亚洲精品| 88久久精品| 日韩精品一区二区三区丰满| 亚洲成人自拍| 日韩成人三级视频| av色综合网| 久久精品男人天堂| 日韩精品在线免费观看| 91蝌蚪国产九色| 亚洲人人精品| 成人av地址| 国产成人77亚洲精品www| 欧美韩日一区二区| 亚洲国产精品一区二区尤物区| 国产精品嫩草久久久久| 亚洲国产精品影院| 亚洲高清在线视频| 国产成人啪免费观看软件| 懂色av一区二区三区蜜臀| 变态调教一区二区三区| 免费一区二区三区在线观看| 性欧美.com| 亚洲先锋成人| 91成人福利在线观看| 妺妺窝人体色www在线观看| 国产伦精品一区二区三区视频免费 | 天天射综合网站| 精品久久精品久久| 一本到不卡免费一区二区| 日韩精品成人一区二区在线| 成人高清电影网站| 激情婷婷久久| 精品国产一区二区三区成人影院| 都市激情亚洲一区| 欧美在线se| 久草中文在线| 3dmax动漫人物在线看| 成人影视在线播放| 爱情岛论坛亚洲品质自拍视频网站| 久久久久久美女精品| 色素色在线综合| 日产精品久久久一区二区福利| 欧美大香线蕉线伊人久久国产精品| 国产片侵犯亲女视频播放| 国产亚洲黄色片| 亚洲在线免费视频| 国产伦理久久久| 99高清视频有精品视频| 91精品国产综合久久久久久丝袜| 日韩精品中文字| 精品久久人人做人人爽| 精品国产伦一区二区三区免费| 国产91成人video| 国产精品wwwwww| 亚洲最大福利视频| 日本丰满少妇黄大片在线观看| 六月婷婷激情网| 日本高清不卡的在线| 亚洲欧美成人一区| 亚洲人成网站在线播放2019| 久久婷五月综合| √天堂资源地址在线官网| 香蕉视频亚洲一级| 亚洲色图插插| 日韩免费视频播放| 久久精品一二三区| 久久综合九色欧美狠狠| 国产精品国色综合久久| 国产一区二区色| 国产精品 欧美在线| 久久高清视频免费| 成人国产精品一区二区| 欧美专区第一页| 亚洲xxxxx电影| 免费在线激情视频| 亚洲美女久久精品| 亚洲激情专区| 亚洲国产精品高清| 亚洲一区视频| 亚洲国产导航| 亚洲日本成人| 亚洲经典在线| 国产欧美三级| 日韩在线播放一区二区| 2023国产精品视频| 亚洲欧美日本另类| 天天综合色天天综合色hd| 亚洲精品一区二区毛豆| 国产精品嫩草在线观看| 六月丁香婷婷在线| 欧美伦理片在线看| 亚洲免费一级视频| 欧美精品成人网| 大香一本蕉伊线亚洲网| 激情综合网五月激情| 性欧美videossex精品| 久久在线免费视频| 日本韩国精品一区二区在线观看| 97久久精品人人做人人爽50路| 国产很黄免费观看久久| 日日噜噜夜夜狠狠视频欧美人| 亚洲一区不卡| 久久精品免费观看| 国产精品资源网站| 久久久不卡影院| 色菇凉天天综合网| 色视频www在线播放国产| 日韩中文一区| 成人免费在线视频播放| www日韩视频| 婷婷视频在线| 在线观看网站免费入口在线观看国内 | 99久久综合99久久综合网站| 久久国产88| 国内成人精品2018免费看| 久久99热99| 欧美电影免费| 91丨九色丨黑人外教| 欧美激情自拍偷拍| 五月婷婷综合网| 亚洲视频在线看| 77777亚洲午夜久久多人| 成人蜜桃视频| 国产福利视频在线播放| 国产一区一一区高清不卡| 亚洲不卡系列| 亚洲欧美综合国产精品一区| 狠狠色丁香久久婷婷综合_中| 亚洲欧美日韩在线| 亚洲欧美在线x视频| 国产精品亚洲网站| 国产午夜福利100集发布| 视频一区二区三区不卡| 电影一区二区三区| 波多野结衣在线观看一区二区| 国产精品日韩| 亚洲精品视频一区| 欧美激情按摩在线|