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;
! 或者 !!的意義
!:先將資料型別轉化為布林值,再取反
!!:兩次取反相當於沒有取反,只是把資料型別轉化為布林型別
-
!null => true
-
!!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;
-
({name:'zxt'}).toString() =>"[object Object]"
-
Number(undefined) =>NaN
-
[parseInt()]
將其他型別值轉換number,和Number不同,提取規則:從左至右依次查詢有效數字字元,直到遇見非有效字元為止(不管後面還有沒數字)
parseInt(‘12px’) =>12
parseInt(‘px1’) =>NaN
parseInt(‘122.3’) =>122
[parseFloat()]
與parseInt不同的是支援小數
- parseFloat(‘12.34pxc’)= 12.34
由於浮點數不是精確的值,所以涉及小數的比較和運算要特別小心
-
0.1 + 0.2 === 0.3
-
// false
-
0.3 / 0.1
-
// 2.9999999999999996
-
[toFixed()]
控制數字保留小數點後面幾位
-
1.var num = parseFloat('width:12.5px'); //=>NaN
-
2.if(num==12.5){
-
3. alert(12.5);
-
4.}else if(num==NaN){//=> NaN!=NaN
-
5. alert(NaN);
-
6.}else if(typeof num=='number'){//=> typeof NaN->'number'
-
7. alert(0);//=>'0'
-
8.}else{
-
9. alert('啥也不是!');
-
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']的區別
-
//-> age:變數名,代表的是它儲存的值
-
//-> 'age':常量,字串的具體值
-
var age = 'name';
-
var obj = {
-
name:'zhufeng',
-
age:8};
-
console.log(obj.age); =>8
-
console.log(obj['age']); =>8
-
console.log(obj[age]); => obj[age變數] =>obj['name'] =>獲取name屬性名的屬性值 =>'zhufeng'
Object.keys:
Object.keys 返回一個所有元素為
字串的陣列
,其元素來自於從給定的物件上面可直接列舉的屬性。這些屬性的順序與手動遍歷該物件屬性時的一致。可以用來判斷物件是否為空:Object.keys(obj).length
-
let obj = { 0 : "a", 1 : "b", 2 : "c"};
-
console.log(Object.keys(obj));
-
// ['0', '1', '2']
函式資料型別
函式資料型別也是按照引用地址來操作的
函式:具備一定功能的方法
基本資料型別和引用資料型別的區別
JS是執行在瀏覽器中的(核心引擎),瀏覽器會給JS提供一個賴以生存的環境,所以我們把這個環境叫做全域性作用域 window(global是後臺的)
JS程式碼是自上而下依次執行的
基本資料型別是按值操作的:基本資料型別再賦值時,是直接把值賦值給變數即可
-
var a=12;
-
var b=a; // b=12 把變數a存的值賦值給變數b
-
b=13;
-
alert(a); //a=12
引用資料型別是按空間地址(引用地址)來操作的:
var n={name:’主動’}; 1、先建立一個變數n; 2.瀏覽器首先會開闢一個儲存空間(記憶體空間),是把物件中需要儲存的鍵值對分別儲存在這個空間中,後期為了方便找到這個空間,瀏覽器會給空間設個地址(16進位制); 3、把空間的地址賦值給變數;所以n儲存的是一個引用地址,並不是一個具體的值
&&邏輯與||邏輯或
-
在條件判斷中 &&:所有都為真,才是真 ||:只要一個為真,就是真
-
在賦值操作中 (短路操作) ||: 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迴圈只能遍歷私有的屬性
騰訊面試題
-
for(var i=0;i<10;i+=2){
-
if(i<=5){
-
i++;
-
continue;
-
}else{
-
i--;
-
break;
-
}
-
console.log(i);}
-
console.log(i); //=>5