前端筆記—第12篇js基礎1

數據類型

  • Number類型
  • String類型
  • Boolean類型
  • undefined
  • null
  • object
  • symbol(es6新增長的)

break 和continue之間的區別

  • break:語句用於跳出代碼塊或循環
  • continue:語句用於當即終止本輪循環,返回循環結構的頭部,開始下一輪循環

javascript肯定一個值是什麼類型的三種方法

  • typeof運算符
  • instanceof
  • Object.prototype.toString()

與數值相關的全局方法

  • parseInt()方法用於將字符串轉爲整數。若是字符串頭部有空格,空格會被自動去除。若是parseInt的第一個參數不是字符串,則會先轉爲字符串再轉換,若是第一個字符不能轉化爲數字則會返回NaN,因此parseInt()的返回值只能是十進制整數和NaN
  • parseInt('1000',2):還能夠接受第二個參數(2到36之間),表示被解析的值的進制,返回該值對應的十進制數。默認狀況下,parseInt的第二個參數爲10,即默認是十進制轉十進制。在本例中也就是說它會把第一個'1000'參數當作二進制處理,返回的結果依然是十進制的數,若是第二個參數的方位不是在2-36之間放回的結果是NAN,若是第二個參數是0 undefined null則會直接忽略,至關因而沒有傳入第二個參數
  • parseFloat():parseFloat()方法用於將一個字符串轉爲浮點數
  • isNaN()方法能夠用來判斷一個值是否爲NaN。可是,isNaN只對數值有效,若是傳入其餘值,會被先轉成數值,注意點:若是傳入的是字符串則字符串是此案會被轉化爲NAN,最後返回的結果是true。也就是時說iSNaN返回的true的時候不必定是NaN有多是一個字符串
  • 出於一樣的緣由,對於對象和數組,isNaN也返回true。可是,對於空數組和只有一個數值成員的數組,isNaN返回false,能轉化爲false是由於這些數能被Number函數轉化爲數值類型
isNaN('hello')//true
console.log(isNaN({}));//true
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
複製代碼
  • isFinite():方法返回一個布爾值,表示某個值是否爲正常的數值,除了Infinity-InfinityNaN這三個值會返回false,isFinite對於其餘的數值都會返回true

字符串

  • undefined 和 null 是沒有toString()方法的若是強制調運則會報錯,其餘的數據類型是都有該方法的
  • NAN是能夠轉化爲一個字符串的,也是能夠調運toString()方法的
//快速轉換字符串的方法
var num = 123456;
var res = num + '';
console.log(typeof res);//string
複製代碼
  • 字符串能夠被視爲字符數組,所以可使用數組的方括號運算符,用來返回某個位置的字符(位置編號從0開始)
  • 若是方括號中的數字超過字符串的長度,或者方括號中根本不是數字,則返回undefined。
  • 字符串與數組的類似性僅此而已。實際上,沒法改變字符串之中的單個字符
var s = 'hello';
console.log(s[0]);//h
console.log(s[8]);//undefined
複製代碼
  • 有時,文本里麪包含一些不可打印的符號,好比 ASCII碼0到31的符號都沒法打印出來,這時可使用 Base64 編碼,將它們轉成能夠打印的字符。另外一個場景是,有時須要以文本格式傳遞二進制數據,那麼也可使用 Base64 編碼。所謂 Base64 就是一種編碼方法,能夠將任意值轉成 0~九、A~Z、a-z、+和/這64個字符組成的可打印字符。使用它的主要目的,不是爲了加密,而是爲了避免出現特殊字符,簡化程序的處理。注意,這裏不是爲了加密任務的,只是爲了處理特殊的字符
var str = 'Hello World!';
console.log(btoa(str));//"SGVsbG8gV29ybGQh"
console.log(atob('SGVsbG8gV29ybGQh'));// "Hello World!"
複製代碼
  • 字符的加法運算符:若是加法兩邊都是數字,進行普通的加法運算,若是是字符串的加法會根據不一樣的運算子肯定是加法運算仍是字符串的拼接。注意點:非字符串 + 字符串會把非字符串轉化爲字符串
1 + 2 // 3
 1 + false //1
 true + true // 2
 1 + 'hello' //1hello
 'hello' + 2 // hello2
 2 + 3 +'hello' // 5hello
 'hello' + 'world' // helloworld
 false + 'hello' // falsehello
 // 取反返回true的六個值: false 0 NaN undefined null  ‘’  
複製代碼
  • 嚴格不相等運算符的計算規則是:先按照嚴格相等運算符計算,而後在進行取反。

對象

  • 對象是JavaScript核心概念,也是最重要的數據類型
  • 注意點:對象的鍵名是字符串,加不加引號都是能夠的,若是鍵名是數字,則會自動轉化爲字符串
  • 若是鍵名不符合標識符的條件或者也不是數字,這是就必須加上引號。開發中對象的屬性都會有一些有意義的標識符,不會起咱們本身都不認識的鍵名,這樣很是不利於咱們去閱讀代碼
  • 對象的鍵值能夠是任意的數據類型,若是鍵值是一個函數,咱們通常稱這個函數爲該對象的方法
  • 若是取消某一個變量對於原對象的引用,不會影響到另外一個變量。可是,這種引用只侷限於對象,若是兩個變量指向同一個原始類型(number boolean string)的值。那麼,變量這時都是值的拷貝
  • 表達式仍是語句
    • 對象採用一個大括號表示,這這會產生一個問題,若是行首是一個大括號,它究竟是語句仍是表達式,所以JavaScript規定若是行首是一個大括號,一概解釋爲語句(即代碼塊),若是要解釋爲表達式須要在大括號前面加上一個()
  • 屬性的操做:對象的屬性經過點運算符或者方括號運算符調運,方括號運算是必須在屬性上面加上單引號,不然JavaScript引擎會把他當作變量處理,若是方括號內是數字鍵能夠不加引號,JavaScript引擎會自動轉換,可是數字鍵不能進行點運算,js會覺得是小數點,所以數字鍵只能使用方括號運算符
  • 查看對象自己的屬性:Object.keys()返回的是一個數組
  • 對象屬性的刪除:只有一種狀況是返回false,那就是對象的屬性存在並且不能刪除,其他的狀況都是會返回true的,注意點:它只能刪除對象自身的屬性,繼承的屬性是不會刪除的
  • in 運算符符用於檢查對象是否包含某個屬性,若是包含返回true,若是不包含則返回false,可是有一個問題它是不能判斷那個屬性是對象自身的仍是對象繼承的屬性
  • for...in循環:它遍歷的是對象全部可遍歷(enumerable)的屬性,會跳過不可遍歷的屬性,它不只遍歷對象自身的屬性,還遍歷繼承的屬性。咱們最好的作法就是在遍歷的時候判斷一下,過濾掉繼承的屬性
var obj = {
    name:'geek',
    age: 10,
    sex: male
};
for(var key in obj){
    if(obj.hasOwnProperty(key)){
        console.log(key);
    }
}
複製代碼

函數

  • 函數有三種聲明方式:
    • function命令聲明
    • 函數表達式聲明
    • Function構造函數
  • 採用函數表達式聲明函數時,function命令後面不帶有函數名。若是加上函數名,該函數名只在函數體內部有效,在函數體外部無效。
  • 函數的重複聲明:函數的重複聲明後面聲明的會覆蓋掉前面聲明的,並且因爲函數名的提高
  • 函數的length屬性是得到函數定義時的參數個數,一但函數被定義,這個值是不會被改變的
  • javaScript 語言將函數看做一種值(也就是說是一種數據類型),與其它值(數值、字符串、布爾值等等)地位相同。凡是可使用值的地方,就能使用函數。好比,能夠把函數賦值給變量和對象的屬性,也能夠看成參數傳入其餘函數,或者做爲函數的結果返回。函數只是一個能夠執行的值,此外並沒有特殊之處
  • 若是同時採用function命令和賦值語句聲明同一個函數,最後老是採用賦值語句的定義,爲何會這樣,這跟執行期上下文有關係。
  • 函數預編譯的過程發生在函數指向的前一刻,預編譯的四部曲:
    • 第一步:建立AO對象(activation object)也叫生成上下文
    • 第二步:找形參和變量聲明,將變量和形參名做爲AO對象的屬性名,值爲undefined
    • 第三步:將實參值和形參同一,也就是傳參的過程
    • 第四步:在函數體裏面找函數聲明,值賦於函數體
    • 注意點:預編譯不只僅發生在函數體內,也發生在全局範圍內
  • 函數也是一個對象,它也是有屬性和方法的
function f1(a,b,c){
    console.log('hello world');
}
console.log(f1.name);//f1,若是是經過函數表達式的方式聲明函數,則返回的是變量名,前提是這個函數是一個匿名函數
console.log(f1.length);//3
console.log(f1.toString());//返回函數源碼的字符串
複製代碼
  • 函數參數的傳遞方式:
    • 若是函數的參數是原始類型的值,傳遞是按照傳值傳遞
    • 若是函數的參數是複合類型的值,傳遞的方式是地址傳遞
  • arguments對象:因爲 JavaScript容許函數有不定數目的參數,因此須要一種機制,能夠在函數體內部讀取全部參數。這就是arguments對象的由來
  • 在嚴格模式下arguments對象是一個只讀對象,經過arguments修改參數的值是不起做用的
  • 經過arguments對象的length屬性,咱們能夠判斷函數真是傳遞進去了幾個參數
  • arguments對象是一個相似數組的對象
  • 兩種將arguments轉爲真實數組的方法
    • var args = Array.prototype.slice.call(arguments);
    • 經過for循環逐一填入

閉包

  • 閉包是將函數內部和函數外部連接起來的一座橋樑
  • 閉包的兩個做用:
    • 讀取函數內部的值
    • 讓這些變量始終保存在內存中,即閉包可讓誕生它的環境一直存在
    • 封裝對象的私有屬性和方法,jQuery就是這樣作的
  • 當即調運的函數表達式使用的兩個目的:
    • 沒必要爲函數命名,避免污染全局變量
    • 二是 IIFE 內部造成了一個單獨的做用域,能夠封裝一些外部沒法讀取的私有變量。

運算符

  • 加法運算符的重載現象:加法運算符是在運行時決定,究竟是執行相加,仍是執行鏈接。也就是說,運算子的不一樣,致使了不一樣的語法行爲,這種現象稱爲「重載」(overload)
  • 若是運算子是對象,就必須先轉化爲原始類型的值再進行現加
//對象的加法
var obj = { p: 1 };//注意:轉化爲原始類型的時候是一個字符串的形式
console.log(obj + 2); // "[object Object]2"
複製代碼
  • 對象轉化爲原始值類型的過程:先自動調用對象的valueOf方法。這是再自動調運對象的toString方法,將其轉化爲字符串。對象的valueOf返回的是對象自己,toString方法默認返回的是[objcet Object]
  • 注意點:若是運算子是Data對象的實例,那麼就會先調運toString()方法,再調運valueOf()方法
  • 布爾運算符:一共包含四種:或運算 且運算 取反運算 三目運算
  • 對於非布爾的取反運算:只有這六種返回true,其他的都是返回false 他們分別是:null undefined false 0 NaN ''(空字符)
  • 若是對於一個值進行兩次取反運算就會轉化爲布爾值,與布爾函數的做用同樣

數據類型的轉化

  • 強制類型的轉換:強制類型主要指Number String Boolean這三種
  • Number:數值轉換爲數值型 字符串轉換爲數值 空字符串轉化是0 布爾轉化數值 undefined轉化爲NaN null轉化是0
  • Number:數值轉化爲數值型字符串轉化爲數值,若是轉化不了直接返回NaN(typeof NAN返回的是Number),空字符串轉化爲0布爾值轉化爲數值undefined轉化爲NaNnull轉化爲 0對象轉化爲NaN
  • String:數值會轉換爲相應的字符串 字符串依舊是字符串 布爾也會轉換爲字符串 undefined轉爲"undefined" null 轉化爲"null" 對象轉化爲"[object Object]" 數組轉化爲字符串例如:String([1, 2, 3]) // "1,2,3"
  • Boolean:能夠將其餘類型的值轉化爲布爾類型 只有這5個(+0或-0 null undefined NaN ''(空字符串))是返回的false,其他的都是true,包括對象也是true
相關文章
相關標籤/搜索