js基礎總結

基礎

普通---當即執行
async---異步加載,當即執行,不按照順序執行
defer---異步加載,最後執行
<noscript>

數據類型json

number
    NaN---未知的數值 經過inNaN(判斷是否能轉化爲數值)來判斷
    infinity
    指數形式:aE+n a乘10的n次方,11E-3 ===> 11*10^-3 = 0.011
undefined---未定義
null---空對象指針
string
boolean
object
typeof操做符:undefined boolead string number object(null) function
基本轉義字符 \n換行,\b空格

控制結構windows

1.do-while
先執行,再判斷
2.while
判斷再執行
3.for
---都是爲假就跳出循環
4.for-in-迭代讀取對象的key,可能不會按照順序讀取...
5.label,break,continue
6.with---將代碼的做用域設定到特定對象中
with(a){
    var x=b;
    var y=c;
}---將做用域設定到a對象中;
等同於
var x=a.b;
var y=a.c;
7.switch
    case x : 語句;break;
    default: 語句;

變量,做用域和內存數組

變量類型:
基本類型---簡單數據段
引用類型---對象類
1.對於直接賦值 a=b
基本類型傳遞值
引用類型傳遞指針,因此改變b,a會改變;
2.對於向函數傳遞參數
都是傳遞值;

執行環境及做用域
function  a(){
    function b(){
    }
}
環境棧: ↓
        b的環境對象---活動對象,包括arguments變量
        a的環境對象---第二級做用域
        window---全局做用域

引用類型瀏覽器

經過new或者字面量的形式建立
公共方法:
    tostring()
    tolocalstring()
    valueof()
引用類型包括如下幾類:
1.object
2.array
3.date
    得到時間
     var now = new Date;
     而後經過getTime()等方法
    建立時間
     var dateTime = new Date("2016/05/20 23:42:00");
4.RegExp
5.Function
6.包裝類型-boolean,string,number
---
var a='xx';
var b=a.length; b=2;
至關於:
var a='xx';
a1=new string('xx');
b=a1.length;
a1=null;
基本數據類型能使用方法,是由於轉換成了這些包裝類型,而後當即被釋放;
a.color='red';---a變成包裝類型string,添加屬性color,而後被釋放
alert(a.color);---undefined,又變成了基本類型.
---
var value='1';
Number(value);---轉換函數,轉成數值
new Number(value);---構造函數,構造了一個包裝類型
7.單體內置對象
Global
    全局對象---最底層的對象---沒有直接調用的方法,只有經過window對象調用
    window對象是Global(js語法中的最底層對象)與瀏覽器對象之和;
Math

面向對象

對於一個屬性--由一個name,6個特性組成;
可配置性 configurable ---可否delete刪除;可否修改特效;可否設置爲訪問器屬性;
可枚舉性 enumerable---可否for-in
數據屬性:
可修改性 writable
數值 value---默認undefined
訪問器屬性:(es5標準,ie8及如下沒有--主要 適用與移動端);
set
get

前三個特性,默認true,可是若是開始設置,任意一個特性,其他的默認false;   
數據屬性和訪問器屬性不能混用;

var a = {};
Object.defineProperty(a,"name",{
    value:"lh",
    writable:false          --- 這個時候,其他兩個屬性設置爲了false;
})
var b = Object.getOwnPropertyDescriptor(a,"name");
獲得特性名=>值組成的對象;

Object.defineProperty(a,"name",{
    set:function(e){
        this.name=e+1;
    }
設置多個屬性
Object.defineProperties(a,{
    name:{},
    vale:{}
})

Object模式  
var x = new Object()
x.name='';
...

對象字面量
var x = {
    name:'',
    ...
    }
    
工廠模式
function x (){
    var o = new Object();
    o.name='';
    ...;
    return o;
}

構造函數
function x(){
    this.name='';
    }
var y =new x (); 

除了構造函數,這幾種方法原型鏈都是
對象--對象原型(Object.prototype)--null
構造函數是
實例化的對象(y)--實例原型(y.__proto__/x.prototype)--對象原型(Object.prototype)--null


function a(){
    this.fn=function(){}
}---構造函數a中建立一個方法fn;
var b1 = new a();
var b2 = new a();
這個時候 b1.fn並不等於b2.fn;
要他們共用一個方法,要將方法放在原型a上;
a.prototype.fn = function(){...};

----------------------------------------
實際使用:
function student(){
    this.name=prop.name||"匿名";
};
student.prototype.fn=function(){...};
function createstudent(prop){
    return new student(prop||{});
}
---而後直接用 var xiaoming = createstudent();來建立
1.不要new
2.傳參數不用管順序,和有沒有,還能設置默認值...
3.徹底匹配json數據;
var x = createstudent({
    "name":"xiaoming",
    ...
}) 

function mor(obj) {
    var rs = [];
    while(obj) {
       rs.push(obj);
       obj = Object.getPrototypeOf(obj);
    } 
    return rs;
}




原型上的變量,實例中賦值後,變成不繼承了??--繼承,可是優先級不一樣
q.hasOwnProperty("vv") true
w.hasOwnProperty("vv") flase  --
在q中添加了vv屬性,由於調用是從上至下的,因此如今實例中查找,再去原型--
能夠經過delete q.vv;而後調用的又是原型中的了.

function empty(){};??
                            實例a                    構造函數b                   原型c  
---------------------------------------------------------------------------------------------

constructor                  b                  functon Function(){}                 b
-----------------------------------------------------------------------------------------------

prototype                   undefine                    c                        undefine
-----------------------------------------------------------------------------------------------

__proto__                       c               function Empty(){}               Object
-----------------------------------------------------------------------------------------------
__proto__纔是原型,繼承.
定義函數時,就會有construct和prototype出現
    函數的原型是個空對象,繼承自Object;
    new的做用是將this綁定?
------------------------------------------------------------------------------------------------


構造函數模式+原型模式實際運用
var prop = {
    name:"gou",
    cat:"miao"
}

function a(){
    this.cat=prop.cat||'mao' 
};
a.prototype={
    constructor:a,
    創建對象的時候,設置原型的時候.只能單個設置
eg:
    a.prototype.name:'="name',
    say:function(){
        return this.say+this.name;
    }
}

function createA(){
    return new a (prop||{})
}

var b = createA(prop);

穩妥構造模式
function a (){
    var o = new Object();
    name="xx";
    o.sayname=function(){
        alert(name);
    }
    return o;
}
適應在須要安全的地方--除了o.sayname方法,沒法訪問內部屬性;

函數

閉包:
能訪問函數內部.
匿名函數的返回---
            function a(x){
                var t='he';
                console.info(x);                        
                return function (x){
                console.info(t,x,this);
                }
            }
        var b=a('he');---'he',b=function(){...};this指向windows,可是環境仍然爲a;
        能訪問到t,x又做爲匿名函數的參數了,因此如b不賦值,則爲undefined;
        b('he');---'he,he,window';
嚴格模式下,不能使用arguments.callee;
var a = (function b(){})---用來內部調用本身;
閉包用途:
function a(){
    var x=1;
    add=function(t){
        x=x+t;
        console.info(x);
    };
    return function b(){
        x++;
    console.info(x);
    };

}
var b=a();
b();2
b();3
add(1);5

---經過閉包,b函數賦予給全局變量b,b函數又依賴a,因此將a環境一直保存在內存中了...
add沒用var建立,因此是個能訪問a內部的全局函數,能夠用來設置a內的變量;

其餘

錯誤處理

因此拋出的錯誤都是error對象的實例
error對象:
    message:錯誤提示信息
    name:錯誤名稱(非標準屬性)
    stack:錯誤的堆棧(非標準屬性)
派生的六種對象
1.syntaxError---語法錯誤
2.refrenceError---引用了不存在的變量
3.rangeError---超出範圍
4.typeError---使用變量或參數不是預期類型
5.URIError---URI相關函數的參數不正確
6.EvalError---Eval函數沒有正確執行
自定義錯誤:
function a(){}
a.prototype=new Error;
a.contructor=a;
var b=new a;

throw語法
throw拋出一個對象,而後中斷
try{}
catch(){}
finally{}
執行try中的語句,若是完成,執行finally語句
若是錯誤,catch捕獲錯誤(不拋出錯誤),而後執行catch語句,再finally語句

經常使用操做符與方法彙總

```
操做符
typeof---主要檢測基本類型
instanceof---主要檢測引用類型 檢測對象的cunstructor
1.Object
實例 instanceof 原型
Object.getPrototypeOf() 得到對象的原型
Object.constructor 對象的構造函數
Object.hasOwnProperty( ) 檢查屬性是否被繼承
Object.isPrototypeOf(a) 一個對象是不是另外一個對象的原型 (a原型鏈上是否有Object);
Object.propertyIsEnumerable( ) 是否能夠經過for/in循環看到屬性
Object.toLocaleString( ) 返回對象的本地字符串表示
Object.toString( ) 定義一個對象的字符串表示
Object.valueOf( ) 指定對象的原始值
2.Array
Array.concat( ) 鏈接數組
Array.join( ) 將數組元素鏈接起來以構建一個字符串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最後一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字符串
Array.toString( ) 將數組轉換成一個字符串
Array.unshift( ) 在數組頭部插入一個元素
Array.安全

3.Boolean
Boolean.toString( ) 將布爾值轉換成字符串
Boolean.valueOf( ) Boolean對象的布爾值
4.Function
Function.apply( ) 將函數做爲一個對象的方法調用
Function.arguments[] 傳遞給函數的參數
Function.call( ) 將函數做爲對象的方法調用
Function.caller 調用當前函數的函數
Function.length 已聲明的參數的個數
Function.prototype 對象類的原型
Function.toString( ) 把函數轉換成字符串
5.Number
Number.MAX_VALUE 最大數值
Number.MIN_VALUE 最小數值
Number.NaN 特殊的非數字值
Number.toLocaleString( ) 把數字轉換成本地格式的字符串
Number.toPrecision( ) 格式化數字的有效位
Number.toString( ) 將—個數字轉換成字符串
Number.valueOf( ) 返回原始數值
6.String(字符串對象)
String.charAt( ) 返回字符串中的第n個字符
String.charCodeAt( ) 返回字符串中的第n個字符的代碼
String.concat( ) 鏈接字符串
String.indexOf( ) 檢索字符串
String.lastIndexOf( ) 從後向前檢索一個字符串
String.length 字符串的長度
String.localeCompare( ) 用本地特定的順序來比較兩個字符串
String.slice( ) 抽取一個子串
String.split( ) 將字符串分割成字符串數組
String.substr( ) 抽取一個子串
String.substring( ) 返回字符串的一個子串
String.toLocaleLowerCase( ) 把字符串轉換小寫
String.toLocaleUpperCase( ) 將字符串轉換成大寫
String.toLowerCase( ) 將字符串轉換成小寫
String.toString( ) 返回字符串
String.toUpperCase( ) 將字符串轉換成大寫
String.valueOf( ) 返回字符串
7.其餘
parseInt(x,16/10/8) --- 若是x=08 有沒有指定radix 那就會輸出8進制
parseFloat(x,16/10/8)
isNaN()
isFinite() 檢測是否是infinity與NaN
escape() 對整個字符串進行轉義 (% ? 等在url中有意義的也會被轉義)
encodeURI() 對URL進行轉義(只會對參數) --- decode...反轉義
encodeURIComponent() 對整個url轉義(當url做爲參數時,如跳轉)閉包

相關文章
相關標籤/搜索