1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
JavaScript語言的每一個(gè)值芒澜,都屬于某一種數(shù)據(jù)類型。JavaScript的數(shù)據(jù)類型创淡,共有六種痴晦。
數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
字符串(string):字符組成的文本(比如"Hello World")
布爾值(boolean):true(真)和false(假)兩個(gè)特定值
undefined:表示“未定義”或不存在,即此處目前沒有任何值
null:表示空缺琳彩,即此處應(yīng)該有一個(gè)值誊酌,但目前為空
-
對(duì)象(object):各種值組成的集合
對(duì)象又可以分成三個(gè)子類型。
狹義的對(duì)象(object)
數(shù)組(array)
函數(shù)(function)
正則表達(dá)式 (regexp)
數(shù)值露乏、字符串碧浊、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型瘟仿,不能再細(xì)分了箱锐。
將對(duì)象稱為復(fù)雜類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成猾骡,可以看作是一個(gè)存放各種值的容器瑞躺。
至于undefined和null敷搪,一般將它們看成兩個(gè)特殊值。
2.typeof和instanceof的作用和區(qū)別?
JavaScript有三種方法幢哨,可以確定一個(gè)值到底是什么類型赡勘。
- typeof運(yùn)算符
- instanceof運(yùn)算符
- Object.prototype.toString方法
typeof 是一個(gè)一元運(yùn)算,放在一個(gè)運(yùn)算數(shù)之前捞镰,運(yùn)算數(shù)可以是任意類型闸与。
它返回值是一個(gè)字符串,該字符串說明運(yùn)算數(shù)的類型岸售。
數(shù)值践樱、字符串、布爾值分別返回number凸丸、string拷邢、boolean。
函數(shù)返回function屎慢。
undefined返回undefined瞭稼。
利用這一點(diǎn),typeof可以用來檢查一個(gè)沒有聲明的變量腻惠,而不報(bào)錯(cuò)环肘。
v // ReferenceError: v is not defined
typeof v // "undefined"
實(shí)際編程中,這個(gè)特點(diǎn)通常用在判斷語句集灌。
// 錯(cuò)誤的寫法
if (v) { } // ReferenceError: v is not defined
// 正確的寫法
if (typeof v === "undefined") { }
除此以外悔雹,其他情況都返回object。
在使用 typeof 運(yùn)算符時(shí)采用引用類型存儲(chǔ)值會(huì)出現(xiàn)一個(gè)問題欣喧,無論引用的是什么類型的對(duì)象腌零,它都返回 "object"。ECMAScript 引入了另一個(gè) Java 運(yùn)算符 instanceof 來解決這個(gè)問題续誉。
instanceof是一個(gè)二元操作符(運(yùn)算符)莱没,和==初肉,>酷鸦,<是同一類東西。由于它是由字母組成的牙咏,它的作用是判斷其左邊對(duì)象是否為其右邊類的實(shí)例臼隔,返回boolean類型的數(shù)據(jù)。
expression instanceof class
如var a=new Array();alert(a instanceof Array);會(huì)返回true妄壶,同時(shí)alert(a instanceof Object)也會(huì)返回true;這是因?yàn)锳rray是object的子類摔握。
instanceof 運(yùn)算符與 typeof 運(yùn)算符相似,用于識(shí)別正在處理的對(duì)象的類型丁寄。與 typeof 方法不同的是氨淌,instanceof 方法要求開發(fā)者明確地確認(rèn)對(duì)象為某特定類型泊愧。例如:
var oStringObject = new String("hello world");
alert(oStringObject instanceof String); //輸出 "true"
這段代碼問的是“變量 oStringObject 是否為 String 對(duì)象的實(shí)例?”oStringObject 的確是 String 對(duì)象的實(shí)例盛正,因此結(jié)果是 "true"删咱。盡管不像 typeof 方法那樣靈活,但是在 typeof 方法返回 "object" 的情況下豪筝,instanceof 方法還是很有用的痰滋。
3.如何判斷一個(gè)變量是否是數(shù)字、字符串续崖、布爾敲街、函數(shù)
typeof運(yùn)算符
instanceof 運(yùn)算符
Object.prototype.toString方法
4.NaN是什么? 有什么特別之處?
NaN含義是Not a Number,表示非數(shù)字严望,NaN和任何值都不相等多艇,包括自己.
NaN===NaN;//false
5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值
- Number()
- parseInt()
- parseFloat()
Number()
Number() 函數(shù)把對(duì)象的值轉(zhuǎn)換為數(shù)字。
如果是Boolean值像吻,true和false值將分別被轉(zhuǎn)換為1和0墩蔓。
如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回萧豆。
如果是null值奸披,返回0。
如果是undefined涮雷,返回NaN阵面。
如果是字符串:
a. 如果字符串中只包含數(shù)字時(shí),將其轉(zhuǎn)換為十進(jìn)制數(shù)值洪鸭,忽略前導(dǎo)0
b. 如果字符串中包含有效浮點(diǎn)格式样刷,如“1.1”,將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)字览爵,忽略前導(dǎo)0
c. 如果字符串中包含有效的十六進(jìn)制格式置鼻,如“0xf”,將其轉(zhuǎn)換為相同大小的十進(jìn)制數(shù)值
d. 如果字符串為空蜓竹,將其轉(zhuǎn)換為0
e. 如果字符串中包含除上述格式之外的字符箕母,則將其轉(zhuǎn)換為NaN
如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法俱济,然后依照前面的規(guī)則轉(zhuǎn)換返回的值嘶是。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法蛛碌,然后再依照前面的規(guī)則轉(zhuǎn)換返回的字符串值聂喇。
f.如果參數(shù)是 Date 對(duì)象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數(shù)蔚携。
g.如果對(duì)象的值無法轉(zhuǎn)換為數(shù)字希太,那么 Number() 函數(shù)返回 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
忽略字符串前面的空白字符,找到第一個(gè)非空白字符
如果第一個(gè)字符不是-或者數(shù)字返回NaN
如果是繼續(xù)解析誊辉,直到非數(shù)值模式為止
0開頭會(huì)當(dāng)做八進(jìn)制彤路,0x開頭會(huì)當(dāng)做十六進(jìn)制,但是可以指定第二個(gè)參數(shù)指定基數(shù)
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
與parseInt() 函數(shù)類似芥映,parseFloat() 也是從第一個(gè)字符(位置0)開始解析每一個(gè)字符洲尊。也是一直解析到字符串末尾,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止奈偏。
也就是說坞嘀,字符串中第一個(gè)小數(shù)點(diǎn)是有效的,而第二個(gè)小數(shù)點(diǎn)就是無效的了惊来,它后面的字符串將被忽略丽涩。
parseFloat() 只解析十進(jìn)制,因此它沒有第二個(gè)參數(shù)指定基數(shù)的用法
如果字符串中包含的是一個(gè)可解析為正數(shù)的數(shù)(沒有小數(shù)點(diǎn)裁蚁,或者小數(shù)點(diǎn)后都是零)矢渊,parseFloat() 會(huì)返回整數(shù)。
例:
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.==與===有什么區(qū)別
==相等
===嚴(yán)格相等
===是嚴(yán)格意義的相等枉证,只需注意NaN和NaN不等就行
使用==的時(shí)候矮男,javascript會(huì)幫我們做類型轉(zhuǎn)換,
1.如果兩個(gè)值類型相同室谚,則執(zhí)行嚴(yán)格相等的運(yùn)算
2.如果兩個(gè)值的類型不同
3.如果一個(gè)是null毡鉴,一個(gè)是undefined,那么相等
4.如果一個(gè)是數(shù)字秒赤,一個(gè)是字符串猪瞬,先將字符串轉(zhuǎn)為數(shù)字,然后比較
5.如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
6.如果一個(gè)值是對(duì)象入篮,一個(gè)是數(shù)字或字符串陈瘦,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
-
7.其它就不相等了
null==undefined;
NaN==NaN
"1"==true
7.break與continue有什么區(qū)別
- break 用于強(qiáng)制退出循環(huán)體,執(zhí)行循環(huán)后面的語句
- continue 用于退出本次循環(huán)潮售,執(zhí)行下次循環(huán)
8.void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
undefined 在 ES5 中已經(jīng)是全局對(duì)象的一個(gè)只讀(read-only)屬性了痊项,它不能被重寫。但是在局部作用域中饲做,還是可以被重寫的线婚。
所以u(píng)ndefined現(xiàn)常用于全局環(huán)境
void (expression)只計(jì)算表達(dá)式遏弱,而無返回值
void 運(yùn)算符通常只用于獲取 undefined 的原始值盆均,一般使用 void(0)(等同于 void 0)。在上述情況中漱逸,也可以使用全局變量undefined 來代替(假定其仍是默認(rèn)值)泪姨。
而 void 可以給任何給定的表達(dá)式求值,并返回 undefined,并且 void 不可被重寫,因此void 0是在局部作用域中替代undefined的最佳選擇
9.以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //2
console.log("2"+"4"); //字符串“24”
console.log(2+"4"); //“24”數(shù)字轉(zhuǎn)換為字符串拼接奢啥,但是如果是減法就是字符串轉(zhuǎn)換為數(shù)字再相減
console.log(+"4");4
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; //因?yàn)?+的優(yōu)先級(jí)比+高所以相當(dāng)于(a++)+a; 1+2=3
typeof a+2;"http://number2" typeof優(yōu)先級(jí)相當(dāng)高此時(shí)就相當(dāng)于先typeof a再加上2髓抑,"number"+2="number2"。一般要對(duì)typeof后的表達(dá)式加上括號(hào)仗处。
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );//(a++)+b 結(jié)果為4(a先用再自加)
12. 遍歷數(shù)組眯勾,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
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. 以下代碼輸出結(jié)果是? 為什么 (選做題目)
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