typeof:javascript
alert(typeof 1); // 返回字符串"number" alert(typeof "1"); // 返回字符串"string" alert(typeof true); // 返回字符串"boolean" alert(typeof {}); // 返回字符串"object" alert(typeof []); // 返回字符串"object " alert(typeof function(){}); // 返回字符串"function" alert(typeof null); // 返回字符串"object" alert(typeof undefined); // 返回字符串"undefined"
示例代碼:css
<script type="text/javascript"> var app={}; alert(typeof app); </script>
運行效果: html
問題:點擊每一個li輸出裏面的內容java
示例代碼:node
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>閉包</title> </head> <body> <ul id="parent"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> </ul> <script> var ul = document.getElementById('parent'); var li = ul.getElementsByTagName('li'); for(var i=0;i<li.length;i++){ li[i].onclick=function(){ alert(i); } } </script> </body> </html>
運行效果:jquery
我點擊的是3 而彈出i的是倒是7面試
緣由就在於 點擊事件的函數內部使用外部的變量i一直在變化,當咱們指定click事件時並無保存i的副本,這樣作也是爲了提升性能,但達不到咱們的目的,咱們要讓他執行的上下文保存i的副本,這種機制就是閉包。ajax
所以,小編總結了三種比較常見的辦法 讓點擊每一個li輸出裏面的內容數組
No1: 閉包
運行效果:
達到了咱們想要的效果
理解:當一個內部函數被調用,就會造成閉包,閉包就是可以讀取其餘函數內部變量的函數,定義在一個函數內部的函,建立一個閉包環境,讓返回的這個子程序抓住i,以便在後續執行時能夠保持對這個i的引用。內部函數比外部函數有更長的生命週期;函數能夠訪問它被建立時所處的上下文環境。
No2:
運行效果:
達到了咱們想要的效果
理解:使用this的原理,由於對於this的隱式綁定來講,this指向的是調用位置上的包含對象,也就是你點擊的那個li[i]
。this 誰調用它他就指向誰 經過this的指向就能夠獲得咱們想要的結果
No3:
運行效果:
理解:使用的是事件代理以及event事件的內置屬性來達到效果。
對象就是「鍵/值」對的集合並擁有一個鏈接到原型(prototype)對隱藏鏈接。
2.一、對象常量(字面量)
一個對象字面量就是包含在一對花括號中的零個或多個「鍵/值」對。對象字面量能夠出如今任何容許表達式出現的地方。
對象的定義:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>面向對象</title> <script> //空對象對象 var obj={}; //對象的屬性 var obj1 = {name:"foo",age:"19"}; var obj2 = {"nick name":"dog"}; //對象中的方法 var obj4 = { price:99, inc:function(){ //obj4這個對象調用this this指向obj4 obj4.price+=1 =100; alert(this.price+=1); } } obj4.inc(); </script> </head> <body> </body> </html>
對象中可包含的內容:
對象常量能夠出如今任何容許表達式出現的地方,對象、數組、函數能夠相互間嵌套,形式能夠多種多樣。對象的值能夠是:數組,函數,對象,基本數據類型等。
//對象中可包含的內容 var obj5 = [{ name: "jack" }, { name: "lucy", //常量 hobby:["讀書","上網","代碼"], //數組 friend:{name:"mark",height:198,friend:{}}, //對象 show:function(){ //函數 console.log("你們好,我是"+this.name); } }]; //對象中的this是動態的,指向的是:調用者 obj5[1].show();
輸出:你們好,我是lucy
2.二、取值
方法一:直接使用點號運算
//3取值 var obj6={"nick name":"pig",realname:"Rose"}; console.log(obj6.realname); //console.log(obj6.nick name); 錯誤
2.三、枚舉(遍歷)
var obj7={weight:"55Kg","nick name":"pig",realname:"Rose"}; for (var key in obj7) { console.log(key+":"+obj7[key]); }
運行結果:
weight:55Kg
nick name:pig
realname:Rose
輸出的順序是不必定的
2.四、更新與添加
若是對象中存在屬性就修改對應值,若是不存在就添加。對象經過引用傳遞,它們永遠不會被複制
var obj8={realname:"King"}; obj8.realname="Queen"; //修改 obj8.weight=1000; //添加屬性 obj8.show=function() //添加方法 { console.log(this.realname+","+this.weight); } obj8.show();
輸出:
Queen,1000
var obj8={realname:"King"}; obj8.realname="Queen"; //修改 obj8.weight=1000; //添加屬性 obj8.show=function() //添加方法 { console.log(this.realname+","+this.weight); } obj8.show(); //引用 var obj9=obj8; //obj9指向obj8的引用 obj9.realname="Jack"; obj8.show();
在JavaScript中this表示:誰調用它,this就是誰。
JavaScript是由對象組成的,一切皆爲對象,萬物皆爲對象。this是一個動態的對象,根據調用的對象不一樣而發生變化,固然也可使用call、apply修改this指向的對象。它表明函數運行時,自動生成的一個內部對象,只能在函數內部使用
在面向過程的語言中咱們習慣把完成某個特定功能的代碼塊稱爲「函數」或「過程」,固然過程通常沒有返回值。在面嚮對象語言中咱們把對象的功能稱爲「方法」。但JavaScript是種介於面向對象與面向過程當中間的語言,一樣的方法有時是函數,有時是方法,以下所示:
<script type="text/javascript"> //1 function show(){ console.log("這是一個函數"); } //2 (function(){ console.log("這是一個函數表達式"); })(); //3 var obj1={ show:function(){ console.log("這是一個方法"); } }; //4 function obj2(){ //obj2是函數,構造函數 this.show=function(){ console.log("這是一個方法,是一個表達式"); } } var obj3=new obj2(); </script>
當在所有範圍內使用 this,它將會指向全局對象。通常是window對象,但全局對象不必定只有window,特別是在node.js環境中。做爲函數調用時通常指向全局對象。
<script type="text/javascript"> var name="tom"; console.log(this.name); //頂層對象,通常爲window function show() { console.log(this.name); //頂層對象,通常爲window return function(){ console.log(this.name); //頂層對象,通常爲window,由於返回的是函數 } } var f1=show(); f1(); </script>
示例代碼
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this</title> </head> <body> <input type="button" value="btnA" class="btn"/> <input type="button" value="btnB" class="btn"/> <input type="button" value="btnC" class="btn"/> <input type="button" value="btnD" onclick="handler()"/> <input type="button" value="btnE" id="btnE"/> <script> var btns= document.getElementsByClassName("btn"); for (var i=0;i<btns.length;i++) { btns[i].onclick=handler; } function handler(){ alert(this.value); } //handler中的this指向btnE document.getElementById("btnE").addEventListener("click",handler,false); </script> </body> </html>
運行結果:
點擊按鈕A
點擊按鈕D
沒有取到this的值 此時的this指向了window對象
示例代碼
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>this</title> </head> <body> <input type="button" value="按鈕F的值" id="btnF" /> <input type="button" value="按鈕G的值" id="btnG" onclick="app.show()"/> <script type="text/javascript"> value="window的值" var app = { value: "app的值", show: function() { alert(this.value); //若是show爲事件,則this指向觸發事件的對象 }, init: function() { //handler中的this指向btnE document.getElementById("btnF").addEventListener("click", this.show, false); } }; app.show(); //"app的值",show方法中的this指向app這個對象 app.init(); //init中的this指向誰app對象 </script> </body> </html>
運行加載時的結果:
點擊按鈕F時
點擊按鈕G時:
在HTML元素上直接指定事件嚴格來講都不能說是事件綁定,只能描述是當按鈕點擊完成後執行的函數。若是想將執行時的對象帶回,能夠增長參數this。
var array01 = new Array(); //空數組 //alert(typeof array01); object var array02 = new Array(5); alert(array02.length); 5 var array03 = new Array("a","b" ,1,2,3,true,false); var array04 = [] //空數組 var array05 = [2,3,4,"x","y"];
運行效果:彈出array02的長度
//訪問數組 No1 console.log(array03[6]);
運行效果:
//訪問數組 No2 for (var i = 0; i<array05.length;i++) { console.log("第"+(i+1)+"個值: "+array05[i]); }
運行效果:
//訪問數組 No3 枚舉 for(var i in array03){ console.log("下標爲"+i+"的值爲: "+array03[i]);//此處是i的下標 }
運行效果:
將一個或多個新元素添加到數組未尾,並返回數組新長度
arrayObj. push([item1 [item2 [. . . [itemN ]]]]);
將一個或多個新元素添加到數組開始,數組中的元素自動後移,返回數組新長度
arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);
將一個或多個新元素插入到數組的指定位置,插入位置的元素自動後移,返回被刪除元素數組,deleteCount要刪除的元素個數
arrayObj.splice(insertPos,deleteCount,[item1[, item2[, . . . [,itemN]]]])
示例代碼:
//添加元素 array03.push(5,8); //添加到末尾 array03.unshift("we"); //添加到末尾 for(var i in array03){ console.log("下標爲"+i+"的值爲: "+array03[i]);//此處是i的下標 }
運行效果:
//添加到中間 array05.splice(3,0,"w","e"); //從第三位開始插入 刪除第三位後面 0 個元素 默認會刪除3後面一個元素的 for (var i=0;i<array03.length;i++) { console.log(array05[i]); }
運行結果:
移除最後一個元素並返回該元素值
arrayObj.pop();
移除最前一個元素並返回該元素值,數組中元素自動前移
arrayObj.shift();
刪除從指定位置deletePos開始的指定數量deleteCount的元素,數組形式返回所移除的元素
arrayObj.splice(deletePos,deleteCount);
示例:
//刪除最後一個元素 array03.pop(); for (var i in array03) { console.log(array03[i]); }
運行效果:
//刪除首個一個元素 array03.shift(); for (var i in array03) { console.log(array03[i]); }
運行效果:
//刪除指定位置與個數 array05.splice(1,2);//從下標第二的開始刪 刪2個 for (var i=0 ;i<array05.length; i++) { console.log(array05[i]); }
運行效果:
以數組的形式返回數組的一部分,注意不包括 end 對應的元素,若是省略 end 將複製 start 以後的全部元素
arrayObj.slice(start, [end]);
將多個數組(也能夠是字符串,或者是數組和字符串的混合)鏈接爲一個數組,返回鏈接好的新的數組
arrayObj.concat([item1[, item2[, . . . [,itemN]]]]);
示例:
//4.五、截取和合並 var array51=[1,2,3,4,5,6]; var array52=[7,8,9,0,"a","b","c"]; //截取,切片 var array53=array51.slice(2); //從第3個元素開始截取到最後 console.log("被截取:"+array53+"——"+array51); var array54=array51.slice(1,4); //從第3個元素開始截取到索引號爲3的元素 console.log("被截取:"+array54+"——"+array51); //合併 var array55=array51.concat(array52,["d","e"],"f","g"); console.log("合併後:"+array55);
運行效果:
返回數組的拷貝數組,注意是一個新的數組,不是指向
arrayObj.slice(0);
返回數組的拷貝數組,注意是一個新的數組,不是指向
arrayObj.concat();
由於數組是引用數據類型,直接賦值並無達到真正實現拷貝,地址引用,咱們須要的是深拷貝。
反轉元素(最前的排到最後、最後的排到最前),返回數組地址
arrayObj.reverse();
對數組元素排序,返回數組地址
arrayObj.sort();
arrayObj.sort(function(obj1,obj2){});
示例:
var array71=[4,5,6,1,2,3]; array71.sort(); console.log("排序後:"+array71); var array72=[{name:"tom",age:19},{name:"jack",age:20},{name:"lucy",age:18}]; array72.sort(function(user1,user2){ return user1.age<user2.age; }); console.log("排序後:"); for(var i in array72) console.log(array72[i].name+","+array72[i].age);
運行效果:
返回字符串,這個字符串將數組的每個元素值鏈接在一塊兒,中間用 separator 隔開。
arrayObj.join(separator);
//4.八、合併成字符與將字符拆分紅數組 var array81=[1,3,5,7,9]; var ids=array81.join(","); console.log(ids); //拆分紅數組 var text="hello nodejs and angular"; var array82=text.split(" "); console.log(array82);
運行效果:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* *(1)在數據集之中,選擇一個元素做爲"基準"(pivot)。 *(2)全部小於"基準"的元素,都放置於"基準"的"小值區域"(左邊);全部大於"基準"的元素,都被置於"基準"的"大值區域"(右邊)。 *(3)對以"基準"爲分割線的兩個子集,不斷重複第一步和第二步,直到全部子集只剩下一個元素爲止。 */ //定義一個數組 var arr = [85, 24, 63, 45, 17, 31, 96, 50]; //定義一個存放結果的result var result = ""; var quickSort = function(arr) { if(arr.length <= 1) { return arr; } //選取被排序數組中的任一元素做爲"基準"(這裏咱們就選取數組中間的元素) var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1); //聲明兩個數組分別用來放置"小值"和"大值" var left = []; var right = []; //而後,開始遍歷數組,小於"基準"的元素放入左邊的子集,大於基準的元素放入右邊的子集。 for(var i = 0; i < arr.length; i++) { if(arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return result = quickSort(left).concat(pivot, quickSort(right)); }; //執行方法 quickSort(arr); //輸出結果 console.log(result.join(" < ")); </script> </head> <body> </body> </html>
運行效果:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>數組去重</title> <script type="text/javascript"> var array11 = [2, 3, 4, 2, 3]; var newArr = []; //新建一個數組 function unique1(arr) { for(var i = 0, len = arr.length; i < len; i++) { if(newArr.indexOf(arr[i]) == -1) { //若新數組中未包含該項則將其存入新數組 newArr.push(arr[i]); } } return newArr; } unique1(array11); alert(newArr.length)//3 for(var i in newArr){ console.log(newArr[i]); } </script> </head> <body> </body> </html>
運行效果:
代碼:
$('input').keyup(function() { console.log($(this).val()); var num = 0; $('input').each(function(index, item){ num += Number($(item).val()); }); $("#business").text(num); });
效果:
附:
判斷輸入的是不是數字:
$.isNumber($(this).val());
判斷輸入的是不是大於0的數字:
$(this).val()<0;
代碼:
$('tr td').slice(-3).css("color", "red");
效果:
<ul class="ul"> <li ><a href="#">第一條</a></li> <li ><a href="#">第二條</a></li> <li ><a href="#">第三條</a></li> <li ><a href="#">第四條</a></li> <li ><a href="#">第五條</a></li> <li ><a href="#">第六條</a></li> <li ><a href="#">第七條</a></li> </ul> <span class="span">12.234567</span> <span class="span">43.7675</span> <span class="span">54.456765</span> <span class="span">23.76543</span> <span class="span">232.765</span> <span class="span">9876.4542345</span> <script type="text/javascript"> var arr = [1,5,3,6]; for(var i=0;i<arr.length;i++){ $(".ul li a:eq('"+arr[i]+"')").css("color","red"); console.log(arr[i]); } var span=0; for(var i=0;i<$(".span").length;i++){ span = Number($(".span:eq('"+i+"')").text()); span = parseFloat(span.toFixed(2)); $(".span:eq('"+i+"')").html(span); } </script>
運行效果:
六、jQuery 驗證from表單提交文件類型
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> </head> <body> <form action="002.html" method="post"> <input type="file" name="myFile" id="myFile"/> <br /> <input type="file" name="myImg" id="myImg" /> <br /> <input type="submit" id="sub" value="提交"/><br /> </form> <script type="text/javascript"> $(document).ready(function () { $("#sub").on('click',function(){ function check(){ var filepathExl = $("input[name='myFile']").val(); var extStartExl = filepathExl.lastIndexOf("."); var ext1 = filepathExl.substring(extStartExl, filepathExl.length).toUpperCase(); var filepathImg = $("input[name='myImg']").val(); var extStart = filepathImg.lastIndexOf("."); var ext = filepathImg.substring(extStart, filepathImg.length).toUpperCase(); if (ext1 != ".XLS" && ext1 != ".XLSX") { alert("文件限於Excel格式"); return false; } if (ext != ".BMP" && ext != ".PNG" && ext != ".GIF" && ext != ".JPG" && ext != ".JPEG") { alert("圖片限於bmp,png,gif,jpeg,jpg格式"); return false; } } return check(); }); }); </script> </body> </html>
七、圖片顯示並修改
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> <style> .topleftbox { width: 200px; height: 130px; border: 1px solid #262626; padding: 3px; border-radius:4px; margin-left: 10px; margin-top: 10px; float: left; } .topleftbox #addimga { display: block; width: 100%; height: 100%; background-size:100% 100%; background-position: center center; background-repeat: no-repeat; } .topleftbox #addimga input { width: 100%; height: 100%; opacity: 0; } #sub{margin: 120px 10px;} </style> </head> <body> <form method="get" action="001.html" enctype="multipart/form-data"> <div class="topleftbox"> <a class="addimga" id="addimga" href="javascript:;"> <input type="file" name="file" onchange="showImg(this)"/> </a> </div> <input type="submit" name="" id="sub" value="提交" /> </form> <script> //經常顯示的是一張原圖 $("#addimga").css("background-image","url(img/10.jpg)"); //顯示上傳的圖片 function showImg(obj) { var srcs = window.URL.createObjectURL(obj.files[0]); var addimga = document.getElementById("addimga"); if(srcs){ //把上傳後的圖片路徑給a連接背景圖片的路徑 addimga.style.background = "url(" + srcs + ") center no-repeat"; $("#addimga").css("background-size", "100% 100%"); } } </script> </body> </html>
運行效果:
選擇一張圖片後
點擊提交以後,圖片信息已經發送過去
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> <style> .topleftbox { width: 200px; height: 130px; border: 1px solid #262626; padding: 3px; border-radius:4px; margin-left: 10px; margin-top: 10px; float: left; } .topleftbox #addimga { display: block; width: 100%; height: 100%; background-size:100% 100%; background-position: center center; background-repeat: no-repeat; } .topleftbox #addimga input { width: 100%; height: 100%; opacity: 0; } #sub{margin: 120px 10px;} </style> </head> <body> <div class="topleftbox"> <a class="addimga" id="addimga" href="javascript:;"> <input type="file" name="file" id="file" onchange="showImg(this)"/> </a> </div> <input type="submit" name="" id="sub" value="提交" /> <script> //經常顯示的是一張本來的圖 $("#addimga").css("background-image","url(img/10.jpg)"); //顯示上傳的圖片 function showImg(obj) { var srcs = window.URL.createObjectURL(obj.files[0]); var addimga = document.getElementById("addimga"); if(srcs){ //把上傳後的圖片路徑給a連接背景圖片的路徑 addimga.style.background = "url(" + srcs + ") center no-repeat"; $("#addimga").css("background-size", "100% 100%"); } } $("#sub").on('click',function(){ var imgFile = $("#file").val(); $.ajax({ url:'001.html', data:imgFile, type:'get', dataType:'JSON', success:function(res){ console.log(res); }, error:function(re){ console.log("er") } }) }) </script> </body> </html>
如何讓銀行卡卡號每四位出現空格隔開
return val.replace(/\s/g,'').replace(/(\d{4})(?=\d)/g,"$1 ");
JS 計算時間差
function getTimeSpace(startTime,endTime){ console.log(startTime,endTime) var spaceTine = new Date(endTime).getTime()-new Date(startTime).getTime(); //時間差的毫秒數 if (spaceTine<0) { alert('結束時間必須大於開始時間'); return ; } //計算出相差天數 var days=Math.floor(spaceTine/(24*3600*1000)) //計算出小時數 var leave1=spaceTine%(24*3600*1000) //計算天數後剩餘的毫秒數 var hours=Math.floor(leave1/(3600*1000)) //計算相差分鐘數 var leave2=leave1%(3600*1000) //計算小時數後剩餘的毫秒數 var minutes=Math.floor(leave2/(60*1000)) //計算相差秒數 var leave3=leave2%(60*1000) //計算分鐘數後剩餘的毫秒數 var seconds=Math.round(leave3/1000) if (days>0) { if (hours==0) { return " 相差 "+days+"天 "+minutes+"分鐘 "; }else{ return " 相差 "+days+"天 "+hours+"小時 "; } }else if(hours>0){ if (minutes==0) { return hours+"小時 "+seconds+" 秒"; }else{ return hours+"小時 "+minutes+" 分鐘"; } }else if(minutes>0){ return minutes+" 分鐘"+seconds+" 秒"; }else{ return seconds+" 秒"; } } console.log(getTimeSpace(new Date().getTime(),'2019-06-29 23:00:00'));