1. JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
JavaScript的數據類型,共有六種。
- 數值(number):整數和小數(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個特定值
- undefined:表示“未定義”或不存在,即此處目前沒有任何值
- null:表示空缺,即此處應該有一個值,但目前為空
- 對象(object):各種值組成的集合
數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值。
2. typeof和instanceof的作用和區別?
在變量和值上調用typeof,將返回一個字符串,這個字符串提示了這個變量或值得類型。如果這個變量或值是一個引用類型將會返回“object”。如果是原始類型輸出結果如下:
其中typeof null返回的object,這是因為JavaScript最初實現的一個錯誤,然后被沿用到現在。現在,null被認為是對象的占位符,從而揭示了這一矛盾。從技術將null還是一個元素類型。比如:var obj 變量時一個對象類型的,我們在程序中會這樣給obj初始值:var obj=null;
typeof在運算一個引用類型時,總是返回object。不能判斷這個引用類型是數組還是對象,這時就可以用instanceof,它用于判斷一個變量是否是某個對象的實例:
3. 如何判斷一個變量是否是數字、字符串、布爾、函數
用type變量名;就可返回一個此變量類型的字符串,假如此變量名為a;
type a ===“number”;
type a ===“string”;
type a ===“boolean”;
type a ===“function”;
4. NaN是什么?有什么特別之處?
不是數值(非數值),字面全拼為: Not a Number
用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了),就會返回“NaN”值。
NaN值非常特殊,因為它“不是數字”,所以任何數跟它都不相等,甚至NaN本身也不等于NaN。
任何涉及NaN的操作(例如NaN/10)都會返回NaN,這個特點在多步計算中有可能導致問題。
isNaN()計算一個參數,檢查它是否為數值,語法是isNaN(testValue),返回true或者false。
5. 如何把非數值轉化為數值?
JavaScript有3個函數可以把非數值轉換為數值:Number()、parselnt()、parseFloat()。
Number()可以用于任何數據類型(此函數平時很少使用)。
parselnt()、parseFloat()專門用于把字符串轉換成數值(比較常用的)。
Number()轉換規則:
- 1、 如果是Boolean值,true和false將分別被轉換為1和0。
- 2 、如果是數字值,只是簡單的傳入和返回。
- 3、 如果是null值,返回0。
- 4 、如果是underfined,返回NaN。
- 5 、如果是字符串,遵循下列規則:
- 1 、 如果字符串中只包含數字(包括前面帶正號或負號的情況),則將其轉化為十進制數值,既“1”變成1,“123”變成123,但是“012”會變成12(前導的零被忽略了);
- 2 、 如果字符串中包含有效的浮點格式,如“1.1”,將其轉換為對應的浮點數值(同樣也會忽略前導零);
- 3 、 如果字符串中包含有效的十六進制格式,如“0xf”則將其轉換為相同大小的十進制整數值;
- 4 、如果字符串是空的(不包含任何字符),則將其轉換為0;
- 5 、如果字符串中包含除上述格式之外的字符,則將其轉換為NaN;
- 6 、如果是對象,則調用對象的valueOf方法,然后依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然后再次依照前面的規則轉換返回的字符串值。
例:
由于Number()函數在轉換字符串時比較復雜而且不夠合理,因此在處理函數的時候更常用parselnt()函數。
- 1 、 parselnt():從字符串中提取整數,遇到非數字,就停止,不在看后面的。
- 2 、 parselnt()函數能夠識別各種整數格式(2、8、10、 16進制度),默認是10進制。如果要轉換其他進制,要帶上第二個參數:轉換時使用的基數(即多少進制),默認10進制可以不帶第二個參數。
- 3 、 parselnt()函數在下面情況會提示NaN:
- 1 、 第一個字符不是數字字符或者負號;
- 2 、 轉換空字符串
示例
* 6 、 ==與===有什么區別
==:等于運算,但是不比較值的類型,兩邊值類型不同的時候,要先進行類型轉換,再比較。
===:完全等于運算,不僅比較值,而且還比較值的類型,當兩邊類型不一致時,不做類型轉換,類型不同的一定不等,只有兩者一致才為真。
* 7 、 break與continue
break語句在循環體語句(for,while,do while,switch)等具有迭代選擇特征的語句中使用,而且是終止最近的封閉代碼塊(即多重循環時,它只終止自己所在的循環),整體代碼接在break語句后繼續執行(如果break語句不是最后一行代碼的話)。
continue語句與break語句使用場合類似,含有continue的迭代語句(或者叫循環語句),在遇到continue語句后,代碼先不按照常規的從上往下的代碼執行順序執行,而是馬上回到循環入口轉入下一次循環。
要注意的是,continue語句是不可以在單獨的switch語句中使用,但可以在一個循環內的switch語句中使用,這時將導致進入下一次循環。
* 8 、void 0 和undefined在使用場景上有什么區別。
一般都是用來對某個值做if判斷,判斷是否等于undefined。
但是一般用void 0來代替undefined,undefined是windows的一個屬性,每次使用都要調用,比較費時,而且它還是一個可以重新定義的變量,容易出錯。
不管void后的運算數是什么,只管返回undefined,用void 0只是比較省事,也可用void1;void100;
擴展
undefined
一直以來, undefined 都不是 JavaScript 的關鍵字或保留字,這意味著我們可以修改 window.undefined 的值。
由于 undefined 會被頻繁調用作為比較運算的操作數等原因,修改 undefined 的值是有弊端的,所以在 ES5 規范之后, window.undefined 被定義為不可寫、不可配置的屬性。
常見的 undefined :
變量明后未賦值,則變量會被自動賦值為 undefined
函數中定義了一些形參,如果傳入的實參少于預定義的形參,那么有一些形參就會匹配不到實參,繼而會被自動賦值為 undefined
沒有返回值的函數,默認返回 undefined
void 運算符
void 運算符后面接一個表達式,無論表達式的內容是什么,只要跟在 void 之后都會被調用執行,執行完畢后 void 操作符返回 undefined :
void (expression)
簡而言之,使用 void 運算符有三種用處:
生成 undefined
讓函數立即執行
充當 javascript: 協議的 URI
生成 undefined
使用 void 0 生成 undefined 的做法由來已久,既減少了在原形鏈上查找 window.undefined 的時間,也避免了誤用被修改過的 undefined 。
function checkLogin (loginName) {
if (loginName === void 0) {
console.log('Wrong!');
}
}
checkLogin();
// => 'Wrong!'
立即執行函數
運算符和函數組合使用,可以讓函數立即執行。實際上,有許多運算符可以讓函數立即執行,比如 + 、 - 、 ! 、 ~ 以及本文提到的 void 等運算符。此外,還有最常見的小括號(不是運算符,會改變優先級):
(function(){
console.log('立即執行');
})();
// => '立即執行'
充當 javascript: 協議的 URI
對于網頁中的 點贊 、 收藏 等按鈕,如果使用 a 標簽來實現的話,往往會用到 href="javascript:void(0)" 等類似的代碼,這段代碼的作用點擊鏈接時讓頁面不跳轉。
在 href="javascript:void(0)" 中,使用了一個以 javascript: 協議開頭的 URI,瀏覽器默認會對冒號后面的代碼求值,然后將結果顯示在新的頁面,但有一種情況例外,如果結果是 undefined ,瀏覽器就不會刷新頁面渲染新值了。
實際上,我們有很多方式實現 點贊 、 收藏 的效果,無需使用這么 Hack 的方式——雖然這確實很方便。
javascript: 協議聲明了 URL 的主體是任意的 javascript 代碼,由 javascript 解釋器編譯執行,通常使用 javascript:URL 執行某些不改變當前頁面文檔的代碼,要做到這一點,必須確保 URL 的最后一條語句沒有返回值,比如使用 void 0 。
* 9 、以下代碼的輸出結果是?為什么?
console.log(1+1); //2
console.log("2"+"4"); //"24"
console.log(2+"4"); //"24"
console.log(+"4"); //4 只有一個字符串參數的時候會嘗試將其轉換為數字
![Uploading QQ截圖20170815150838_940722.png . . .]
* 10 、以下代碼的輸出結果是?
var a = 1;
a+++a; //3
typeof a+2; //"number2" typeof 的優先級比+運算符高
* 11 、 以下代碼的輸出結果是?為什么
var a = 1;
var b = 3;
console.log( a+++b ); //4 a++ 為 1 ,再加b等于4;