1. 程式人生 > >JS基礎知識(一)【資料型別基本介紹,檢測資料型別端方法簡介】

JS基礎知識(一)【資料型別基本介紹,檢測資料型別端方法簡介】

1、基礎知識

ECMAScript(ES):規定了JS的一些基礎核心的知識(變數、資料型別、語法規範、操作語句等)  DOM:document object model 文件物件模型,裡面提供了一些屬性和方法,可以讓我們操作頁面中的元素  BOM:browser object model 瀏覽器物件模型,裡面提供了一些屬性和方法,可以讓我們操作瀏覽器

常用瀏覽器核心

瀏覽器的核心是分為兩個部分的,一是渲染引擎,另一個是JS引擎。現在JS引擎比較獨立,核心更加傾向於說渲染引擎。

  • webkit核心(V8引擎)

    • 谷歌
    • 大部分移動端瀏覽器
    • 國內大部分瀏覽器 360 QQ UC 獵豹 搜狗
    • NODE基於V8來渲染JS
  • Gecko 火狐瀏覽器

  • Presto 歐朋瀏覽器
  • Trident IE瀏覽器

資料型別的分類和檢測

  • Number
  • String
  • bloean
  • null:空物件指標基礎
  • undefined:未定義
  • function 函式型別
  • object物件資料型別: 
    • {}普通物件
    • 陣列
    • /$/ 正則  [物件資料型別:是把描述同一事物的屬性和方法放在一個記憶體空間中,起到了分組的作用]

檢測資料型別

  • typeof:檢測資料型別的運算子
  • instanceof:檢測某個例項是否屬於這個類
  • constructor:獲取當前例項的構造器
  • Object.prototype.toString.call:獲取當前例項所屬的類資訊

typeof:結果返回的是一個字串,字串內包含的是資料型別

  • typeof 的侷限性 
    • typeof null 的檢測結果不是‘null’ 而是’object’: 而null是基本資料型別 ,並不是object
    • 使用typeof 無法具體區分出到底是陣列還是正則或普通物件

Boolean

  • 把其他型別轉換為布林型別
  • 只有0,NaN,空字串、null、undefined為false;其餘都是true;

  • ! 或者 !!的意義 !:先將資料型別轉化為布林值,再取反 !!:兩次取反相當於沒有取反,只是把資料型別轉化為布林型別

  1. !null => true

  2. !!undefined =>false

Number

[NaN]

  • js中新增了一個數據型別:NaN(not a number 不是一個有效數字,但是屬於number) 
    • typeof NaN =>’number’
  • NaN!=NaN NaN和任何值都不等

[isNaN]

isNaN:用來檢測這個值是否是有效數字,如果不是,則為true,反之,則為false  當時使用isNaN檢測時,()中如果不是number型別:  基本資料型別:先將其他型別值轉化為Number型別值再運算  物件資料型別:先將對其呼叫toString方法,再轉化為Number型別值

[Number]

  • 使用Number把字串轉換為數字的時候,空字串是零,其它字串中如果出現的字元代表純數字可以轉為正常的數字,如果出現了任何一個非有效數字的字元,最後的結果都是NaN
  • 將引用型別轉化資料型別時,先將其轉化為字串,後再轉化為number;
  1. ({name:'zxt'}).toString() =>"[object Object]"

  2. Number(undefined) =>NaN

  3. [parseInt()]

將其他型別值轉換number,和Number不同,提取規則:從左至右依次查詢有效數字字元,直到遇見非有效字元為止(不管後面還有沒數字)

  1. parseInt(‘12px’) =>12

  2. parseInt(‘px1’) =>NaN

  3. parseInt(‘122.3’) =>122

[parseFloat()]

與parseInt不同的是支援小數

  • parseFloat(‘12.34pxc’)= 12.34 由於浮點數不是精確的值,所以涉及小數的比較和運算要特別小心
  1. 0.1 + 0.2 === 0.3

  2. // false

  3. 0.3 / 0.1

  4. // 2.9999999999999996

  5. [toFixed()]

控制數字保留小數點後面幾位

  1. 1.var num = parseFloat('width:12.5px'); //=>NaN

  2. 2.if(num==12.5){

  3. 3. alert(12.5);

  4. 4.}else if(num==NaN){//=> NaN!=NaN

  5. 5. alert(NaN);

  6. 6.}else if(typeof num=='number'){//=> typeof NaN->'number'

  7. 7. alert(0);//=>'0'

  8. 8.}else{

  9. 9. alert('啥也不是!');

  10. 10.}

null 和 undefined

null: 沒有,沒有開闢記憶體空間  undefined: 未定義  “” : 空字串,什麼都沒有,但是開闢了記憶體空間

null:什麼都沒有,但一般都是自己手動賦值的,後期再自己賦值  unfefined:完全不在預期之內

Object

物件是由0到多組鍵值對組成的,每一組之間用逗號分離

每一個物件資料型別,都是有0到多組的屬性名和屬性值組成的  屬性名:描述當前物件具備的某些特徵(數字/字串格式)  屬性值:具體特徵的值(任何資料型別)

操作一個物件的屬性有2種方式 obj['key'] obj.key(屬性名是數字不可以使用這種方法)

建立物件

字面量方式:var obj={}  建構函式方式:var obj=new Object();

物件鍵值對的操作:增、刪、改、查

var obj = {};  obj.name = ‘zxt’;//=>增加一個叫做NAME的屬性,屬性值是:’zxt’  obj[‘name’] = 29;//=>修改NAME對應的屬性值:一個物件的屬性名是不能重複的,之前沒有這個屬性,我們的操作是增加操作,之前有這個屬性,當前操作就是在修改現有屬性名的屬性值  obj.age = null; //=>假刪除:把屬性值設定為空,但是屬性名是存在的 <=> obj[‘age’] = null =>獲取age的屬性值結果是null  delete obj.age;//=>真刪除:把屬性名和屬性值徹底從物件中移除掉 =>獲取age的屬性值結果是undefined 獲取一個物件某一個屬性名對應的屬性值,如果當前這個屬性在物件中並不存在,獲取的結果是undefined

obj[name]和obj['name']的區別

  1. //-> age:變數名,代表的是它儲存的值

  2. //-> 'age':常量,字串的具體值

  3. var age = 'name';

  4. var obj = {

  5. name:'zhufeng',

  6. age:8};

  7. console.log(obj.age); =>8

  8. console.log(obj['age']); =>8

  9. console.log(obj[age]); => obj[age變數] =>obj['name'] =>獲取name屬性名的屬性值 =>'zhufeng'

Object.keys:

Object.keys 返回一個所有元素為字串的陣列,其元素來自於從給定的物件上面可直接列舉的屬性。這些屬性的順序與手動遍歷該物件屬性時的一致。 可以用來判斷物件是否為空:Object.keys(obj).length

  1. let obj = { 0 : "a", 1 : "b", 2 : "c"};

  2. console.log(Object.keys(obj));

  3. // ['0', '1', '2']

函式資料型別

函式資料型別也是按照引用地址來操作的

函式:具備一定功能的方法

基本資料型別和引用資料型別的區別

JS是執行在瀏覽器中的(核心引擎),瀏覽器會給JS提供一個賴以生存的環境,所以我們把這個環境叫做全域性作用域 window(global是後臺的)

JS程式碼是自上而下依次執行的

基本資料型別是按值操作的:基本資料型別再賦值時,是直接把值賦值給變數即可

  1. var a=12;

  2. var b=a; // b=12 把變數a存的值賦值給變數b

  3. b=13;

  4. alert(a); //a=12

引用資料型別是按空間地址(引用地址)來操作的:

var n={name:’主動’};  1、先建立一個變數n;  2.瀏覽器首先會開闢一個儲存空間(記憶體空間),是把物件中需要儲存的鍵值對分別儲存在這個空間中,後期為了方便找到這個空間,瀏覽器會給空間設個地址(16進位制);  3、把空間的地址賦值給變數;所以n儲存的是一個引用地址,並不是一個具體的值

Alt text

&&邏輯與||邏輯或

  • 在條件判斷中  &&:所有都為真,才是真  ||:只要一個為真,就是真

  • 在賦值操作中 (短路操作) ||: a||b;看a的真假,a為真,則返回a的值,a為假,則返回b,不管b是什麼  &&:a&&b, a為假,則返回a的值,a為真,則返回b,不管b是什麼  真實專案中應用邏輯或實現預設值的設定操作

邏輯與的優先權高於邏輯或

JavaScript常用的操作語句

通過一系列的邏輯判斷,來完成特定的事情  for迴圈  if迴圈:當在判斷的操作中,很多條件都是符合的,執行完成第一個符合的條件後,後面的條件不管是否符合都不在處理了

for in 迴圈

用來遍歷(迴圈)物件鍵值對的, '迴圈陣列中的每一項', '條件?條件成立執行:條件不成執行;, 執行步驟:]

key儲存的值都是字串格式,key中存的是屬性名  在for in 迴圈遍歷時,大部分瀏覽器都是先把物件中的鍵值對進行排序(整數數字在前,由小到大,其餘按原來編寫順序排列)(小數算作字母,不算數字) for in迴圈會遍歷物件原型上的方法  itin [Tab] for in 迴圈快捷鍵

三元運算子

['條件?條件成立執行:條件不成執行;]是簡單的if、else的另外一種寫法  如果某種情況並不需要做處理,我們可以用null,undefined,void 0佔位即可  某一情況執行多條操作,使用()包起來,每一項處理的事情之間用逗號分隔  在三元運算子中不能出現 break/continue/return  會出現 SyntaxErrorr 語法錯誤

switch case

也是if else某種特定情況的簡寫,可以在switch 語句中使用任何資料型別(在很多其他語言中只能使用數值),無論是字串,還是物件都沒有問題。其次,每個 case 的值不一定是常量,可以是變數,甚至是表示式。  每一種case情況結束都需要加break,達到條件成立處理完成,跳出當前判斷 每一種case情況的比較都是使用===進行比較的:絕對相等

=:賦值,變數=值 ==:比較,值==值 絕對比較,值===

如果左右兩邊比較的值是相同型別的,那麼直接比較內容是否一樣即可;如果兩邊值的型別不一樣,==和===是有區別的:  ===型別不一樣,最後的結果就是false,更加的嚴謹  ==型別不一樣,瀏覽器首先會預設的把型別轉化為一樣的,然後再比較內容,相對鬆散一些

for迴圈語句

for(初始值;驗證條件;步長累加){  迴圈體} 

設定初始值  驗證條件  條件成立執行迴圈體,否則推出迴圈  步長累加  驗證條件  ···············  沒有步長累加會陷入死迴圈

for迴圈與for in迴圈的區別:for in 迴圈可以遍歷到原型上的公有屬性,而for迴圈只能遍歷私有的屬性

騰訊面試題

  1. for(var i=0;i<10;i+=2){

  2. if(i<=5){

  3. i++;

  4. continue;

  5. }else{

  6. i--;

  7. break;

  8. }

  9. console.log(i);}

  10. console.log(i); //=>5