1.JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
JavaScript語言的每一個值,都屬于某一種數據類型。JavaScript的數據類型,共有六種。
數值(number):整數和小數(比如1和3.14)
字符串(string):字符組成的文本(比如"Hello World")
布爾值(boolean):true(真)和false(假)兩個特定值
undefined:表示“未定義”或不存在,即此處目前沒有任何值
null:表示空缺,即此處應該有一個值,但目前為空
-
對象(object):各種值組成的集合
對象又可以分成三個子類型。
狹義的對象(object)
數組(array)
函數(function)
正則表達式 (regexp)
數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值。
2.typeof和instanceof的作用和區別?
JavaScript有三種方法,可以確定一個值到底是什么類型。
- typeof運算符
- instanceof運算符
- Object.prototype.toString方法
typeof 是一個一元運算,放在一個運算數之前,運算數可以是任意類型。
它返回值是一個字符串,該字符串說明運算數的類型。
數值、字符串、布爾值分別返回number、string、boolean。
函數返回function。
undefined返回undefined。
利用這一點,typeof可以用來檢查一個沒有聲明的變量,而不報錯。
v // ReferenceError: v is not defined
typeof v // "undefined"
實際編程中,這個特點通常用在判斷語句。
// 錯誤的寫法
if (v) { } // ReferenceError: v is not defined
// 正確的寫法
if (typeof v === "undefined") { }
除此以外,其他情況都返回object。
在使用 typeof 運算符時采用引用類型存儲值會出現一個問題,無論引用的是什么類型的對象,它都返回 "object"。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。
instanceof是一個二元操作符(運算符),和==,>,<是同一類東西。由于它是由字母組成的,它的作用是判斷其左邊對象是否為其右邊類的實例,返回boolean類型的數據。
expression instanceof class
如var a=new Array();alert(a instanceof Array);會返回true,同時alert(a instanceof Object)也會返回true;這是因為Array是object的子類。
instanceof 運算符與 typeof 運算符相似,用于識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象為某特定類型。例如:
var oStringObject = new String("hello world");
alert(oStringObject instanceof String); //輸出 "true"
這段代碼問的是“變量 oStringObject 是否為 String 對象的實例?”oStringObject 的確是 String 對象的實例,因此結果是 "true"。盡管不像 typeof 方法那樣靈活,但是在 typeof 方法返回 "object" 的情況下,instanceof 方法還是很有用的。
3.如何判斷一個變量是否是數字、字符串、布爾、函數
typeof運算符
instanceof 運算符
Object.prototype.toString方法
4.NaN是什么? 有什么特別之處?
NaN含義是Not a Number,表示非數字,NaN和任何值都不相等,包括自己.
NaN===NaN;//false
5.如何把非數值轉化為數值?
有三個函數可以把非數值轉換為數值
- Number()
- parseInt()
- parseFloat()
Number()
Number() 函數把對象的值轉換為數字。
如果是Boolean值,true和false值將分別被轉換為1和0。
如果是數字值,只是簡單的傳入和返回。
如果是null值,返回0。
如果是undefined,返回NaN。
如果是字符串:
a. 如果字符串中只包含數字時,將其轉換為十進制數值,忽略前導0
b. 如果字符串中包含有效浮點格式,如“1.1”,將其轉換為對應的浮點數字,忽略前導0
c. 如果字符串中包含有效的十六進制格式,如“0xf”,將其轉換為相同大小的十進制數值
d. 如果字符串為空,將其轉換為0
e. 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN
如果是對象,則調用對象的valueOf()方法,然后依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然后再依照前面的規則轉換返回的字符串值。
f.如果參數是 Date 對象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數。
g.如果對象的值無法轉換為數字,那么 Number() 函數返回 NaN。
<script type="text/javascript">
var test1= new Boolean(true);
var test2= new Boolean(false);
var test3= new Date();
var test4= new String("999");
var test5= new String("999 888");
document.write(Number(test1)+ "<br />");/*1*/
document.write(Number(test2)+ "<br />");/*0*/
document.write(Number(test3)+ "<br />");/*1501466061880*/
document.write(Number(test4)+ "<br />");/*999*/
document.write(Number(test5)+ "<br />");/*NaN*/
parseInt parseFloat
忽略字符串前面的空白字符,找到第一個非空白字符
如果第一個字符不是-或者數字返回NaN
如果是繼續解析,直到非數值模式為止
0開頭會當做八進制,0x開頭會當做十六進制,但是可以指定第二個參數指定基數
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
與parseInt() 函數類似,parseFloat() 也是從第一個字符(位置0)開始解析每一個字符。也是一直解析到字符串末尾,或者解析到遇見一個無效的浮點數字字符為止。
也就是說,字符串中第一個小數點是有效的,而第二個小數點就是無效的了,它后面的字符串將被忽略。
parseFloat() 只解析十進制,因此它沒有第二個參數指定基數的用法
如果字符串中包含的是一個可解析為正數的數(沒有小數點,或者小數點后都是零),parseFloat() 會返回整數。
例:
var num1 = parseFloat("123AF"); //123
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.3.56"); //22.3
var num5 = parseFloat("0908.5"); //908.5
6.==與===有什么區別
==相等
===嚴格相等
===是嚴格意義的相等,只需注意NaN和NaN不等就行
使用==的時候,javascript會幫我們做類型轉換,
1.如果兩個值類型相同,則執行嚴格相等的運算
2.如果兩個值的類型不同
3.如果一個是null,一個是undefined,那么相等
4.如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
5.如果一個值是true/false則將其轉為1/0比較
6.如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
-
7.其它就不相等了
null==undefined;
NaN==NaN
"1"==true
7.break與continue有什么區別
- break 用于強制退出循環體,執行循環后面的語句
- continue 用于退出本次循環,執行下次循環
8.void 0 和 undefined在使用場景上有什么區別
undefined 在 ES5 中已經是全局對象的一個只讀(read-only)屬性了,它不能被重寫。但是在局部作用域中,還是可以被重寫的。
所以undefined現常用于全局環境
void (expression)只計算表達式,而無返回值
void 運算符通常只用于獲取 undefined 的原始值,一般使用 void(0)(等同于 void 0)。在上述情況中,也可以使用全局變量undefined 來代替(假定其仍是默認值)。
而 void 可以給任何給定的表達式求值,并返回 undefined,并且 void 不可被重寫,因此void 0是在局部作用域中替代undefined的最佳選擇
9.以下代碼的輸出結果是?為什么?
console.log(1+1); //2
console.log("2"+"4"); //字符串“24”
console.log(2+"4"); //“24”數字轉換為字符串拼接,但是如果是減法就是字符串轉換為數字再相減
console.log(+"4");4
10. 以下代碼的輸出結果是?
var a = 1;
a+++a; //因為++的優先級比+高所以相當于(a++)+a; 1+2=3
typeof a+2;"http://number2" typeof優先級相當高此時就相當于先typeof a再加上2,"number"+2="number2"。一般要對typeof后的表達式加上括號。
11. 以下代碼的輸出結果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );//(a++)+b 結果為4(a先用再自加)
12. 遍歷數組,把數組里的打印數組每一項的平方
var arr = [3,4,5]
代碼
var arr = [3,4,5]
for (var i=0; i<arr.length; i++) {
console.log(arr[i]*arr[i]);
}
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
代碼
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (key in obj) {
console.log(obj[key]);
}
14. 以下代碼輸出結果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) ;
number2
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
bb
undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
haha
undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
2