摘要:一直對抱有敬畏的態度,也沒有一直深入學習。當學到各種框架的時候才發現力不從心,感覺到了基礎的重要性,重新認真的系統的學習一下。
一直對javscript抱有敬畏的態度,也沒有一直深入學習。當學到各種js框架的時候才發現力不從心,感覺到了javascript基礎的重要性,重新認真的系統的學習一下。
于是es6中有了let和var
模擬js的塊級作用域
function outputNumbers(count){ (function(){ for(var i=0;i2. javascipt中this用法不同 它指向調用它的那個對象
3. 閉包是指有權訪問另一個函數作用域中的變量的函數。function createAFunction(){ return function(){ return "這是一個閉包"; } }二、基本數據類型undefined、null、boolean、string、number 、object、function
1. undefined
它們有對應的方法
Boolean()、String()、Number() 、Object()沒有被定義就會返回undefined,是null衍生出來的,因些undefined==null 返回true
2. null由于歷史原因 typeof null返回object
3. booleanBoolean()
4. string
非0返回true
0、null、undefined返回falseString()
5. number
不管傳入什么都會原樣返回,但如果是function,會執行該方法并返回undefined
toString(參數,進制)
toUpperCase()
toLowerCase()
substring(parm1,parm2)
substr()
charAt(1)
charCodeAt(2)
concat()
slice()
indexof()
lastIndexOf
trim()
search(pattern) //返回索引
replcae("原","新") //第一個參數支持正則 第二個參數也可以是一個function
splice(",") //支持正則,支持指定長度
它只有length屬性Number() true=>1 false=>0 null=>0 undefined=>NaN
6. object
Number.MAX_VALUE 最大值
Number.MIN_VALUE 最小值
NaN 它是一個特例,不與任何值相等包括自己
parseInt() //可以查找字符串中的數字并轉換
parseFloat() //可以查找字符串中的數字并轉換
inFinite() //是否在最大值和最小值之間
toFixed(小數點位數)
說明:它能夠識別科學計數法 比如 2.15e5 => 215000constructor 構造函數
三、運算符 1. 大于和小于
obj.hasOwnProperty() 是否具有自己的方法
obj.isProtoTypeOf(object) 檢查傳入的對象是否是另一個對象的原型
ob.propertyIsEnumerable(propetyName) 檢查給定的屬性能否使用for-in
obj.toLocaleString() 返回執行地區對應的對象的字符串 =>["Object"]
obj.toString() 返回執行對象的字符串 =>["Object"]
obj.valueOf() 返回對象序列化之后的結果"23"<"3" //true,字符串的比較跟數字的比較不同
2. 全等和不全等
"a"<3 //false a會被轉成NaN
特別注意:NaN和任何數比都是false
NaN>3 //false
NaN<3 //false
"23"<3 //false "23"會被轉成23再與3比較"55"==55 //true 不全等只判斷值不判斷類型
四、條件控制語句
"55"===55 //false 全等不僅判斷值還判斷類型for(proertyName in global){ console.log(proertyName) }五、方法注意:javascript和java不同,它沒有重載,定義兩個方法名相同的方法后面一個會覆蓋前面一個。
六、檢測類型typeof xxx
七、引用類型 1. object
// 返回數據類型聲明對象的方法
var obj = new Object();
var obj = {};賦值
obj.name="xiaomo";使用對象的屬性
2. Array
obj.name
obj["name"]可以存任何類型
聲明
var arr = new Array();
var arr = new Array(3);
var arr = [];添加對象
arr.push("a",b",1,3,4,true)
操作對象(刪除、插入、替換)刪除:起始位置,要刪除的個數
arr.splice(起始位置,刪除的個數)
例子:arr.splice(2,1) //返回[1] 返回刪除的那個數插入:起始位置、要刪除的個數(0)、要插入的數,可以是多個,返回空數組
arr.splice(起始位置,刪除的個數,參數1,參數2,參數n)
例子:arr.splice(1,0,"插入的值1","插入的值2","插入的值n")替換:起始位置、要刪除的項目、要插入的任意項,可以是多個,返回被替換的值
arr.splice(起始位置,刪除的個數,參數1,參數2,參數n)
例子:arr.splice(0,2,"test1","test2")其他數組操作
arr.push("test") 插入到數組的最后面
arr.unshift("xiaomo") 插入到數組的最前面
arr.pop() //刪除數組的最后一個值
arr.shift() //刪除數組第一個值使用對象
arr[1]數組自帶的方法
arr.reverse(); 反轉數組
arr.sort() 默認升序排列
arr.sort((a,b)=>{reutrn b-a}) 傳入排序方法會按照自定義排序
arr.concat(另一個數組或者單個參數) 如果傳入數組也會被展開拿出來,不會影響原數組
arr.slice(0,3) 會把選定的部分截取出來生成一個新的數組,不會影響原數組
arr.indexOf(4) 返回該值存在的下標,不存在返回-1
arr.lastIndexOf(4) 從倒數開始查找,返回該值存在的下標,不存在返回-1
arr.every(fn) 對每個參數進行處理,全部符合返回truefn=(item,index,array){//當前值、索引、該數組 return item>2 }arr.some(fn) 對每個參數進行處理,有一個符合就返回true
fn=(item,index,array){//當前值、索引、該數組 return item>2 }arr.filter(fn) 對每個參數進行處理,返回過濾后的數組
fn=(item,index,array){//當前值、索引、該數組 return item>2 }arr.map(fn) 對每個參數進行處理,返回處理后的數組
fn=(item,index,array){//當前值、索引、該數組 return item*2 }arr.forEach(fn) 對每個參數進行處理,沒有返回值
arr.reduce(fn) 對每個參數進行處理,迭代返回最終結果fn=(prev,cur,index,array){//前一個值、當前值、索引、數組 return prev+cur }arr.reduceRight(fn) 從右邊對每個參數進行處理,迭代返回最終結果
fn=(prev,cur,index,array){//前一個值、當前值、索引、數組 return prev+cur }3. Date類型聲明:
var date = new Date(); 創建當前時間 也可以接收參數
Date.parse(pattern) // 6/13/2016 May 25,2016 或者 yyyy-MM-dd hh:mm:ss格式的 返回時間戳
new Date(Date.parse(pattern)) // 將時間戳格式化為正常的時間
new Date(2016,5,19,20,49,15) //也可以用逗號 2016-05-19 20:49:15
Date.now() //當前時間的時間戳
toDateString() //返回時間的字符串 星期、日、月、年
toTimeString() //時、分、秒、時區
toLocaleDateString() 特定時區的星期、日、月、年
toLocaleTimeString() 特定時區的時、分、秒、時間時間格式
var date = new Date(); var time = date.getTime() //當前時間的時間戳 var fullYear = date.getFullYear(); //2016 var year = date.getYear(); //116 var month = date.getMonth(); //04 從0開始 var d = date.getDate(); //日 19 var day = date.getDay(); //4 返回星期幾 var min = date.getMinitues(); //0 var sec = date.getSeconds() //秒 var mill = date.getMilliSeconds() //毫秒4. 正則 RegExp類型var re = new RegExp("pattern"); re.test(parm); // exec 返回匹配的結果 var test = "abcdef.js"; var pattern = /.js$/ var matches = parrten.exec(test); console.log(matches); // ".js" ,index:6 input:"abcdef.js" //test 返回true/false var text = "abcdef.js"; var pattern = /.js$/ pattern.test(text); // true5. 方法 function方法沒有重載,如果是同名,不管參數個數是不是相同,后面定義的方法都會覆蓋前面的方法
每個方法都包含兩個屬性:length(參數個數)和protoType(原型鏈)function test(a,b){ return a+b; } function test(a){ return a; } test(1) //1 test(1,2) //1你可以不按正常順序執行方法,因為在執行的時候 function都會被提前
test(); function test(){ console.log("這是一個方法"); }但如果是立即執行的函數則不行
( function test(){ }() )方法有兩個特殊的內部屬性和兩個非繼承來的方法 call()、apply(),以及其他方法 toString()、valueOf()
arguments和this
arguments是類數組,保存著參數。它有arguments.callee()方法function factorial(num){ if(num<=1){ return 1; } else { return num * arguments.callee(num-1); } } factorial(5); // 5! 1*2*3*4*5this在javascript中用法比較特殊,它指向它的調用者
var color="green"; function sayColor(){ console.log(this.color); } var o = { color="pink"; } o.sayColor(); //pink sayColor(); //greenprotoType 原型鏈
function sum (num1,num2){ return num1+num2; } // call 參數1:運行函數的作用域 參數2 agruments或者Array function callSum1(num1,num2){ return sum.apply(this,arguments); } function callSum2(num1,num2){ return sum.apply(this,[num1,num2]) } // apply 參數1:運行函數的作用域 其他參數:就是把apply中的數組拆開 function callSum2(num1,num2){ return sum.apply(this,num1,num2) }encodeURIComponent() //encode字符串
6. Math
decodeURICopmonent() //decode字符串
eval(express) //解析字符串表達式
eval("console.log("我是被解析的表達式")")Math.E //e
Math.LN10 //10的自然對數
Math.LOG10E //以10為底e的對數
Math.PI //PI
Math.SQRT2 //2的平方根
Math.SQRT1_2 // 1/2的平方根方法:
八、面向對象的編程方法
Math.min(Array)
Math.max(Array)
Math.ceil(parm) //向上取整
Math.floor(parm) //向下取整
Math.round(parm) //標準的四舍五入
Math.random() // 0-1之間的數
Math.abs(parm) //絕對值var person = { name:"xiaomo", age:25, sayHello:function(){ console.log(this.name); } }工廠模式
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age= age; o.job =job; o.sayName=function(){ console.log(this.name); } return o; } var person1 = createPerson("xiaomo",25,"programer"); var person2 = createPerson("xiaoming",20,"it");構造函數(不用顯式的創建對象,不用返回值,直接把屬性賦給this)
function Person(name,age,job){ this.name = name; this.age = age, this.job = job; this.sayName = function(){ console.log(this.name); } } var person1 = new Person("xiaomo",25,"programer"); var person2 = new Person("xiaoming",20,"it");判斷類型 instanceof
person1 instanceof Object //true person1 instanceof Person //true原型模式
function Person(){} //實際上隱式的創建一個構造函數constructor Person.prototype.name="xiaomo"; Person.prototype.age=25; Person.prototype.job="programmer"; Person.prototype.sayName=function(){ console.log(this.name); } //當前也可以這樣 Person.prototype={ name="xiaomo"; age=25; job="programmer"; sayName=function(){ console.log(this.name); } } var person1 = new Person(); Person.prototype.isPrototypeOf(person1); //true Object.getPrototypeOf(person1.name); //xiaomo person1.hasOwnProperty("name") //false 存在于protoType中,不存在于實例中 "name" in person1 //true 雖然實例中沒有,但是它的原型鏈有,所以返回true Object.keys(person1) //會枚舉出實例中所有的屬性九、定時器和延遲執行//延遲一秒執行fn函數,只執行一次 let timeout = 1000; var fn = function(){ console.log("hello"); } var timeoutId = setTimeout(fn,timeout) //清除間歇執行函數 clearTimeout(timeoutId); //定時器,每秒執行fn函數,直到清除定時器 var timeout = 1000; var fn = function(){ console.log("定時器") } var intervalId = setInterval(fn,timout) //清除定時器 clearInterval(itervalId);十、BOM(瀏覽器相關) 1. 系統對話框alert(); //彈出框 confirm();//確認框 if(confirm("are you sure?")){ console.log("sure"); } else{ console.log("I am not sure!"); } prompt();//交互框 var result = promot("what"s up?","默認值"); if(result!=null){ alert(result); }2. location對象參數
location.hash //#contents url的hash值 location.host // ip location.hostname //域名 location.href //http域名 location.pathname //url的目錄 location.port //8080 location.protocool //協議 location.search //?q=search location.reload() //可能從緩存加載 location.reload(true) //重新加載3. navigator對象檢測瀏覽器屬性
navigator.appCodeName //瀏覽器的名字 navigator.appName //完整的瀏覽器名稱 navigator.appVersion //瀏覽器的版本 navigator.cookieEnabled //cookie是否啟用 navigator.javaEnabled() //java是否啟用 navigator.language //主語言 zh-CH navigator.languages //支持的語言 navigator.onLine //瀏覽器是否連接到了internet navigator.platofrm //瀏覽器的平臺 "Win32" navigator.plugins //返回瀏覽器安裝的插件的數組 function hasPlugin(name){ name = name.toLowerCase(); for(var i = 0 ; i4. history對象-1表示找到了 var isTrue = navigator.plugins[i].name.toLowerCase().indexOf(name)>-1; if(isTrue){ return true; } } return false ; } history.go(-1);//后退一頁 history.back(); history.go(1);//前進一頁 history.forward(); history.go("xiaomo.info")//跳轉到最近訪問過的該頁面 history.length==0 //表示這是用戶打開瀏覽器的第一個頁面十一、表單 1. 表單屬性acceptCharset 服務器能夠處理的字符集 action 接受請求的url elements 表單所有控件的集合 enctype 請求的編碼類型 length 表單中控件的數量 method get/post name 表單的名字 reset() 重置 submit() 提交 targetdocument.forms 可以取到表單的所有控件
2. 控件disabled 當前字段是否禁用 form 指向當前字段所屬表單的指針:只讀 name 當前字段的名字 readOnly 當前字段只讀 tabIndex tab切換的序號 type 當前字段的類型 value 當前字段提交給服務器的值修改控件的值
var input = document.getElementById("name"); name.value="xiaomo" name.focus(); //把焦點設置到當前字段 //在控件中加入 autofocus="focus" 是一樣的效果選擇文本
element.select()取得選中的文本
function alertText(username){ var username = document.getElementById("username"); alert(getSelectText(username)); } function getSelectText(textbox){ return textbox.value.substring(textbox.selectionStart,textbox.selectionEnd); } // html3. 剪貼板事件beforecopy copy cut beforepaste paste //寫一個公用方 var EventUtil = { getClipboardText:function(event){ var clipboardData = (event.clipboardData || window.clipboardData); return clipboardData.getData("text"); } setClipboardText:function(event,value){ if(event.clipboardData){ return event.clipboardData.setData("text/plain",value); } else if (window.clipboardData){ return window.clipboardData.setData("txt",value); } } } EventUtil.addHander(txtbox,"paste",function(event)){ event = EventUtil.getEvent(event); var text = EventUtil.getClipboardText(event); if(!/^d*$/.test(text)){ EventUtil.preventDefault(event); } }EventUtil
自動切換焦點
(function(){ function tabForward(event){ event = EventUtil.getEvent(event); var target = EventUtil.getTarget(event); if(target.value.length = target.maxLength){ var form = target.form; for( var i =0; len = form.elements.length;i4. 下拉框 select add(newOption,relOption) 插入一個option //最佳做法(在列表最后插入一個option) var newOption = new Option("text","value"); selectBox.add(newOption,undefined); multiple 是否允許多選 options 控件中所有options的HTMLCollection remove(index) 移除指定位置的選項 //移除指定的選項(這里移除的是第一項) var index = 0 selectBox.remove(selectBox.options[index]) selectedIndex 基于0的選中項的索引,沒有選中項-1 size 選擇框中可見的行數 text 選中項的文本內容 value 選項的值 //移動一個選項到特定位置(將第2個選項移動到最后一個選項) var optionToMove = selectBox.options[1]; selectBox.insertBefore(optionToMove,selectBox.options[optionToMove.index-1]) /添加一個選項(把當前列表中的第一個選項添加到當前列表的最后) selectBox.appendChind(selectBox.options[0]);5. 表單序列化原則:
對表單字段的名字和值進行url編碼,使用&分割
不發送禁用的表單字段
只發送勾選的單選按鈕和復選框
不發送type為reset和button的按鈕
多選框中的每選中的值多帶帶一個條目
submit的時候,本按鈕也會被提交
select發送的時候如果有value就發value的值 沒有就發text內容form.serialize()
6. 富文本編輯器只要加上contenteditable就可以讓div可以編輯
也可以用js控制var richedit = document.getElementById("richedit"); richedit.contenteditable="true"; // true false inherit document.exexCommand(命令,false,值); //document.exexCommand("bold",false,null);十二、canvas//定義一個canvas //獲取canvas document.getElementById("drawing"); if(drawing.getContext){ var context = drawing.getContext("2d"); context.fillReact(30,30,30,30); //畫了一個正方形 context.fillStyle="#fff"; //填充 context.strokeStyle="red"; //描邊 // todo }十三、html5腳本編程//跨文檔消息傳送 EventUtil.addHander(window,"message",function(event){ if(event.origin="http://www.wrox.com"){//發送消息的文檔所在的域 //接受參數 processMessage(event.data); //可選:向窗口來源發送回執 event.source.postMessage("Receiived","http://xiaomo.info") } })十四、本地存儲 1. cookievar CookieUtil = { //根據key讀取cookie get: function (name){ //注意對鍵編碼 var cookieName = encodeURIComponent(name) + "=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null, cookieEnd; //找到cookie鍵 if (cookieStart > -1){ //鍵后面第一個分號位置 cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1){ cookieEnd = document.cookie.length; } //cookie值解碼 cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); } return cookieValue; }, //設置cookie set: function (name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); //失效時間,GMT時間格式 if (expires instanceof Date) { cookieText += "; expires=" + expires.toGMTString(); } if (path) { cookieText += "; path=" + path; } if (domain) { cookieText += "; domain=" + domain; } if (secure) { cookieText += "; secure"; } document.cookie = cookieText; }, //刪除cookie,保持相同的鍵、域、路徑、安全選項,然后設置失效時間即可 unset: function (name, path, domain, secure){ this.set(name, "", new Date(0), path, domain, secure); } };使用util方法
CookieUtil.set("name","xiaomo"); CookieUtil.set("age",26); console.log(CookieUtil.get("name")); console.log(CookieUtil.get("age")); CookieUtil.unset("name"); CookieUtil.unset("age");2. localStorageWindow.localStorage.setItem(key,value);//存儲數據 Window.localStorage.getItem(key);//讀取數據,返回string類型 Window.localStorage.removeItem(key);//刪除數據項 Window.localStorage.clear();//刪除所有數據
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79696.html
摘要:是什么是一個特別的關鍵字,是自動定義在所有函數和全局的作用域中。是在運行時綁定的,而不是聲明時綁定的。小結的指向取決于函數執行時的塊級上下文 This This是什么:this是一個特別的關鍵字,是自動定義在所有函數和全局的作用域中。this是在運行時綁定的,而不是聲明時綁定的。 為什么要有this假設不存在this關鍵字,那么對于一個函數根據不同上下文背景下的復用就用傳入參數 ...
摘要:更新單元測試,已使用,,,使用測試覆蓋率,并集成配合來做持續化構建,可以參考本項目的配置文件和的配置文件。判斷是否然后記得在文件中暴露函數單元測試在文件新建測試用例然后記得在中引入之前創建的測試用例腳本。 前言作為戰斗在業務一線的前端,要想少加班,就要想辦法提高工作效率。這里提一個小點,我們在業務開發過程中,經常會重復用到日期格式化、url參數轉對象、瀏覽器類型判斷、節流函數等一類函數...
摘要:原文鏈接前端圈快速發展的今天,我們習慣于去嘗試最新的技術并在互聯網上討論它們的優劣。整理了一系列年值得學習的部分。在這兒,我特別推薦以下的課程所著的五本對我最有意義的編程書你喜歡我的推薦嗎你想在年學點什么 原文鏈接 前端圈快速發展的今天,我們習慣于去嘗試最新的技術并在互聯網上討論它們的優劣。我并不是說我們不應該這么做,我只是覺得我們是不是應該慢下來,看看那些不常變的東西:它們能夠很好的...
摘要:突然有需求要做一個圓環的音頻播放進度條上圖效果,自己琢磨嘗試了半天,也沒有實現。然后結合讓這個半圓旋轉,就實現了內的進度條,當超過時,取消對的剪裁,再使用一個半圓來保存的進條,就實現一個的進度條效果。 showImg(https://segmentfault.com/img/remote/1460000009182482?w=208&h=213); ??突然有需求要做一個圓環的音頻播放...
閱讀 4698·2021-09-22 16:06
閱讀 2082·2021-09-22 15:22
閱讀 1430·2019-08-30 15:54
閱讀 2519·2019-08-30 15:44
閱讀 2346·2019-08-29 16:31
閱讀 2016·2019-08-29 16:26
閱讀 2334·2019-08-29 12:41
閱讀 738·2019-08-29 12:22