進階2

1.JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?

JavaScript的數據類型,共有六種。

  • 數值(number):整數和小數(比如1和3.14)
  • 字符串(string):字符組成的文本(比如"Hello World")
  • 布爾值(boolean):true(真)和false(假)兩個特定值
  • undefined:表示“未定義”或不存在,即此處目前沒有任何值
  • null:表示空缺,即此處應該有一個值,但目前為空
  • 對象(object):各種值組成的集合

數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器

兩者區別:

  • 基本類型變量存的是值,復雜類型的變量存的是內存地址。
  • 基本類型在賦值的時copy值,復雜類型在賦值的時候只copy地址,不copy值。

2.typeof和instanceof的作用和區別?

typeof 是一個操作符,主要的目的是檢測一個變量是不是基本數據類型的變量,同時也可以說是確定一個變量是字符串,數值,布爾值,還是undefined;

var a="zhangqian";
var b=true;
var c=10;
var d;
var e=null;
var f=new Object();

alert(typeof a); //string
alert(typeof b); //number
alert(typeof c); //boolean
alert(typeof d); //undefined
alert(typeof e); //object
alert(typeof f); //object

instanceof主要的目的是檢測引用類型,判斷對象是Array,還是RegExp!

var array=new Array();
var object=new Object();
var regexp=new RegExp();
function func(){};
var func1=new func();

alert(array instanceof Array);  //true
alert(object instanceof Object);  //true
alert(regexp instanceof RegExp);  //true
alert(func1 instanceof func);  //true

參考:
javascript typeof 和 instanceof 的區別和聯系 --by raisezhang

3.如何判斷一個變量是否是數字、字符串、布爾、函數

通過typeof獲取變量類型,然后用If語句判斷

if ("undefined" === typeof v) { }

4.NaN是什么? 有什么特別之處?

NaN含義是Not a Number,表示非數字;
NaN是一個數字類型,但不是有效數字;
NaN和任何值都不相等,包括自己

Paste_Image.png

5.如何把非數值轉化為數值?

把字符串轉換為數值有三種方法:

1. Number()

如果參數是 Date 對象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數。
如果對象的值無法轉換為數字,那么 Number() 函數返回 NaN,即如果字符串截去開頭和結尾的空白字符后,不是純數字字符串,那么最終返回結果為NaN;
可識別0xff的十六進制表示,轉換為255
例子:

<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("123abc");
var test6= new String("0xff");

document.write(Number(test1)+ "<br />");
document.write(Number(test2)+ "<br />");
document.write(Number(test3)+ "<br />");
document.write(Number(test4)+ "<br />");
document.write(Number(test5)+ "<br />");
document.write(Number(test6)+ "<br />");
</script>

輸出:
1
0
1502829821918
999
NaN
255

2.parseInt()

  • 基本用法
    parseInt方法用于將字符串轉為整數
parseInt('123') // 123 

如果字符串頭部有空格,空格會被自動去除

parseInt('   81') // 81

如果parseInt的參數不是字符串,則會先轉為字符串再轉換。

parseInt(1.23) // 1    
// 等同于
parseInt('1.23') // 1

遇到不能轉換為數字的字符停止
字符串轉為整數的時候,是一個個字符依次轉換,如果遇到不能轉為數字的字符,就不再進行下去,返回已經轉好的部分。

parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15

上面代碼中,parseInt的參數都是字符串,結果只返回字符串頭部可以轉為數字的部分。如果字符串的第一個字符不能轉化為數字(后面跟著數字的正負號除外),返回NaN。

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1

parseInt的返回值只有兩種可能,不是一個十進制整數,就是NaN。

如果字符串以0x或0X開頭,parseInt會將其按照十六進制數解析。

parseInt('0x10') // 16

如果字符串以0開頭,將其按照10進制解析。

parseInt('011') // 11

對于那些會自動轉為科學計數法的數字,parseInt會將科學計數法的表示方法視為字符串,因此導致一些奇怪的結果。

parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1

parseInt(0.0000008) // 8
// 等同于
parseInt('8e-7') // 8
  • 進制轉換
    parseInt方法還可以接受第二個參數(2到36之間),表示被解析的值的進制,返回該值對應的十進制數。默認情況下,parseInt的第二個參數為10,即默認是十進制轉十進制。
parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

上面代碼中,二進制、六進制、八進制的1000,分別等于十進制的8、216和512。這意味著,可以用parseInt方法進行進制的轉換。

如果第二個參數不是數值,會被自動轉為一個整數。這個整數只有在2到36之間,才能得到有意義的結果,超出這個范圍,則返回NaN。如果第二個參數是0、undefined和null,則直接忽略。

parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10

如果字符串包含對于指定進制無意義的字符,則從最高位開始,只返回可以轉換的數值。如果最高位無法轉換,則直接返回NaN。對于二進制來說,1是有意義的字符,5、4、6都是無意義的字符,所以第一行返回1,第二行返回NaN。

parseInt('1546', 2) // 1
parseInt('546', 2) // NaN

如果parseInt的第一個參數不是字符串,會被先轉為字符串。這會導致一些令人意外的結果。

parseInt(0x11, 36) // 43
// 等同于
parseInt(String(0x11), 36)
parseInt('17', 36)

上面代碼中,十六進制的0x11會被先轉為十進制的17,再轉為字符串。然后,再用36進制解讀字符串17,最后返回結果43。

這種處理方式,對于八進制的前綴0,尤其需要注意。

parseInt(011, 2) // NaN
// 等同于
parseInt(String(011), 2)

parseInt('011', 2) // 3

上面代碼中,第一行的011會被先轉為字符串9,因為9不是二進制的有效字符,所以返回NaN。第二行的字符串011,會被當作二進制處理,返回3。

ES5不再允許將帶有前綴0的數字視為八進制數,而是要求忽略這個0。但是,為了保證兼容性,大部分瀏覽器并沒有部署這一條規定。

3.parseFloat()

parseFloat方法用于將一個字符串轉為浮點數。

parseFloat('3.14') // 3.14

如果字符串符合科學計數法,則會進行相應的轉換。

parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.

如果字符串包含不能轉為浮點數的字符,則不再進行往后轉換,返回已經轉好的部分。

parseFloat('3.14more non-digit characters') // 3.14

parseFloat方法會自動過濾字符串前導的空格。

parseFloat('\t\v\r12.34\n ') // 12.34

如果參數不是字符串,或者字符串的第一個字符不能轉化為浮點數,則返回NaN。

parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN

上面代碼中,尤其值得注意,parseFloat會將空字符串轉為NaN。

這些特點使得parseFloat的轉換結果不同于Number函數。

parseFloat(true)  // NaN
Number(true) // 1

parseFloat(null) // NaN
Number(null) // 0

parseFloat('') // NaN
Number('') // 0

parseFloat('123.45#') // 123.45
Number('123.45#') // NaN

6.==與===有什么區別

===是嚴格意義的相等,如果兩個值類型相同,用===進行比較;
使用==的時候,如果兩個值的類型不同,javascript會先進行類型轉換
如果兩個值的類型不同:

  • 如果一個是null,一個是undefined,那么相等
  • 如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
  • 如果一個值是true/false則將其轉為1/0比較
  • 如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
  • 其它就不相等了

7.break與continue有什么區別

break 用于強制退出循環體,執行循環后面的語句
continue 用于退出本次循環,執行下次循環

8.void 0 和 undefined在使用場景上有什么區別

void運算符的作用是執行一個表達式,然后返回undefined。
Undefined是可以作為一個變量賦值的

Paste_Image.png

上面代碼執行后,輸出===,void 0的執行結果為undefined,變量a聲明未賦值,相等

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;  
typeof a+2;

number2,
++優先級高,限制性++,a變為2,先執行typeof a,得到number,然后拼接字符串;

11.以下代碼的輸出結果是? 為什么

 var a = 1;
 var b = 3;
 console.log( a+++b );
4

a+++b,相當于(a++)+b,因為a++后生效,所以相當于1+3,得4

12.遍歷數組,把數組里的打印數組每一項的平方

 var arr = [3,4,5];
var i;
for(i=0;i<arr.length;i++){
     console.log(arr[i]**2);
}

13.遍歷 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}

var i;
for(i in obj){
console.log(i+":"+obj[i]);
}

14.以下代碼輸出結果是? 為什么

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) 

number2
typeof a + b || c >0按優先級為:((typeof a) + b) ||(c >0)
即得到number2 || 1,得到number2

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)

undefined
d==5為true,短路邏輯,data等于&&后面的,consoloe.log('bb')是先輸出bb,然后返回undefined,所以data為undefined

var data2 = d = 0 || console.log('haha')
console.log(data2)

undefined
根據短路邏輯,0為false,d等于||后面的,consoloe.log('haha')是先輸出haha,然后返回undefined,所以data為undefined

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)

2
!!強制轉換字符串為true,“,”返回最后一個操作數運算值,true+true=2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容