1. JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
js定義了6種原始數(shù)據(jù)類型和對象這種復(fù)雜數(shù)據(jù)類型:
- 原始數(shù)據(jù)類型
- 數(shù)值(number):整數(shù)和小數(shù)成洗;
- 字符串(string):文本數(shù)據(jù);
- 布爾值(boolean):true和false兩個特定值;
- undefined:表示“未定義”或不存在点额,即此處目前沒有任何值;
- null:表示空缺办铡,即此處應(yīng)該有一個值晒杈,但目前為空污桦,一般用作對象的占位符;
- symbol(ES6)抚笔;
- 復(fù)雜數(shù)據(jù)類型
- 對象(object):各種值組成的集合鸽疾;包括數(shù)組(array)、函數(shù)(function)附帽、對象(object)奔则、正則表達(dá)式(regexp)等写半;
- 區(qū)別
- 復(fù)雜數(shù)據(jù)類型是多個原始數(shù)據(jù)類型的集合犁柜,原始數(shù)據(jù)類型不能再細(xì)分覆履,不是對象也沒有方法赂鲤。
2. typeof和instanceof的作用和區(qū)別?
文獻(xiàn)
1.MDN instaceof
2.MDN typeof
3.JavaScript instanceof 運(yùn)算符深入剖析
作用:
- typeof以字符串形式返回操作數(shù)的數(shù)據(jù)類型
//返回"number"
typeof 123
typeof NaN
//"string"
typeof '123'
typeof (typeof 1)
//"boolean"
typeof true
//"function"
typeof function(){}
//"undefined"
typeof undefined
//"object"
typeof null
typeof {a:1}
typeof [1,2]
typeof /ss/
- instanceof判斷對象是否為特定的類型
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
function C() {}
var o = new C();
//true
o instanceof C;
//true
o instanceof Object;
- 區(qū)別:
typeof:一元運(yùn)算符,返回值為字符串仑鸥,難以判斷object具體類型眼俊;
instanceof:二元運(yùn)算符院塞,返回值為布爾型,主要用來判斷object是否為特定實例搁拙。
3. 如何判斷一個變量是否是數(shù)字窑业、字符串枕屉、布爾常柄、函數(shù)
如2代碼示例
4. NaN是什么? 有什么特別之處?
NaN(Not a Number):非數(shù)字,不等于自己
NaN == NaN //false
5. 如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
parseInt()轉(zhuǎn)換為整數(shù)、parseFloat()轉(zhuǎn)換為浮點數(shù)西潘、Number()都可以卷玉,但轉(zhuǎn)換整個數(shù)據(jù);
//忽略字符串前空格
//忽略第第一個非數(shù)字后的所有字符
//parseInt('',radix) 可以設(shè)置基數(shù)
//parseInt()
parseInt('0ab') //0
parseInt('01a') //1
parseInt(' 0a') //0
parseInt('0xf1', 10) //0
parseInt('-1a') //-1
parseInt('0xf1') //241十六進(jìn)制不用加基數(shù)
//第一個非空非數(shù)字/±(±后無數(shù)字依然NaN)喷市,返回NaN
parseInt('-a')
parseInt(null)
parseInt(true)
parseInt(undefined)
parseInt('a')
----------------------------------------------------
//parseFloat()和parseInt()類似相种,只是會保留小數(shù)部分
parseFloat('-2.1a1a') //-2.1
----------------------------------------------------
//Number()可以整數(shù)或小數(shù),但會轉(zhuǎn)換整個數(shù)據(jù)东抹;并且會轉(zhuǎn)換null,true,false
Number('1.2') //1.2
Number('1.2a') //NaN
Number(true) //1
Number(false) //0
Number(null) //0
Number(undefined) //NaN
Number('a')
//其他
Number('\t\r') //0
6. ==與===有什么區(qū)別?
參考文獻(xiàn)
1.JavaScript標(biāo)準(zhǔn)參考教程-阮一峰
== 類型不同蚂子,會先嘗試轉(zhuǎn)換類型再比較沃测;
=== 類型一致缭黔,值相同。
//==相等
//字符串和布爾型比較會轉(zhuǎn)換為數(shù)值蒂破,類型相同不會轉(zhuǎn)換
true == 1 //true
false == 0 //true
true == 'true' //false,'true'轉(zhuǎn)化為NaN
'' == 0 //true
''==false //true
'' == '0' //false
-----------------
//undefined與null與其他大多數(shù)比較都是false
undefined == null //true
undefined == 0 //false
null == 0 //false
undefined == false //false
null == false //false
-----------------
//其他
' \t\t' == 0 //true
//嚴(yán)格相等
1 === 0x1 // true
+0 === -0 //true
--------
//空對象
{} === {} // false
[] === [] // false
(function (){} === function (){}) // false
//未賦值變量
var a,b
a === b //true
7. break與continue有什么區(qū)別?
break 跳出循環(huán)馏谨,用于循環(huán)和switch;
continue跳出本次循環(huán)附迷,用于循環(huán)惧互。
8. void 0 和 undefined在使用場景上有什么區(qū)別?
void運(yùn)算一個表達(dá)式,返回defined喇伯,所以void 0 返回undefined喊儡;因為undefined在函數(shù)等中可以作為局部變量賦值,這會使判斷值為undefined失效稻据,所以判斷中使用void 0代替它艾猜。
9.以下代碼的輸出結(jié)果是?為什么?
- 當(dāng)JavaScript遇到預(yù)期為數(shù)值的地方,就會將參數(shù)值自動轉(zhuǎn)換為數(shù)值捻悯。系統(tǒng)內(nèi)部會自動調(diào)用Number函數(shù)匆赃。
console.log(1+1); //2 類型相同,都為數(shù)字今缚,直接相加
console.log("2"+"4"); //24 類型相同算柳,都為字符串,直接拼接
console.log(2+"4"); //6 類型不同姓言,一個數(shù)字瞬项,一個字符串,轉(zhuǎn)換為數(shù)字后相加
console.log(+"4"); //4 只有一個字符串運(yùn)算子何荚,也轉(zhuǎn)換為數(shù)字
10.
var a = 1;
a+++a; //++優(yōu)先級高于+囱淋,a++先運(yùn)算,后自增,(a++)+a為2兽泣,a也為2
typeof a+2; //4 typeof優(yōu)先級高绎橘,(type a)+2,type a輸出為"number",數(shù)字和字符串相加称鳞,所以值為“number2”
11.
var a = 1;
var b = 3;
console.log( a+++b ); (a++)+b涮较,a++先運(yùn)算,后自增冈止,為1+3狂票,輸出4
12. 遍歷數(shù)組,打印數(shù)組每一項的平方
var arr = [3,4,5];
for (var i = 0; i <arr.length; i++){
console.log(arr[i]*arr[i]);
}
13. 遍歷對象, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (attr in obj){
console.log(obj[attr])
}
14.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0 //優(yōu)先級typeof , +, >, || , =
//"number"
//"number2"
//"number2" || true
//或運(yùn)算符(||)的運(yùn)算規(guī)則是:如果第一個運(yùn)算子的布爾值為true熙暴,則返回第一個運(yùn)算子的值闺属,且不再對第二個運(yùn)算子求值;如果第一個運(yùn)算子的布爾值為false周霉,則返回第二個運(yùn)算子的值掂器。
//"number2"
console.log(val) //"number2"
var d = 5;
var data = d ==5 && console.log('bb') //優(yōu)先級 == ,&& , =
//true && console.log('bb')
//打印bb
//因為第一個為true俱箱,所以會返回第二個運(yùn)算子的值
console.log(data) //undefined
var data2 = d = 0 || console.log('haha') //優(yōu)先級 || , = 其中=為右結(jié)合
//打印haha
//0 || consloe.log('haha')
//因為0轉(zhuǎn)換為false国瓮,所以返回第二個運(yùn)算子的值,結(jié)果為undefined
console.log(data2) //undefined
var x = !!"Hello" + (!"world", !!"from here!!"); //優(yōu)先級 ()狞谱!+ ,
//true + (false, true)
//true + true轉(zhuǎn)換為數(shù)值1+1
//2
console.log(x) //2