進(jìn)階2

1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?

JavaScript的數(shù)據(jù)類型,共有六種。

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

數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。
將對(duì)象稱為復(fù)雜類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器

兩者區(qū)別:

  • 基本類型變量存的是值,復(fù)雜類型的變量存的是內(nèi)存地址。
  • 基本類型在賦值的時(shí)copy值,復(fù)雜類型在賦值的時(shí)候只copy地址,不copy值。

2.typeof和instanceof的作用和區(qū)別?

typeof 是一個(gè)操作符,主要的目的是檢測(cè)一個(gè)變量是不是基本數(shù)據(jù)類型的變量,同時(shí)也可以說(shuō)是確定一個(gè)變量是字符串,數(shù)值,布爾值,還是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主要的目的是檢測(cè)引用類型,判斷對(duì)象是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 的區(qū)別和聯(lián)系 --by raisezhang

3.如何判斷一個(gè)變量是否是數(shù)字、字符串、布爾、函數(shù)

通過(guò)typeof獲取變量類型,然后用If語(yǔ)句判斷

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

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

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

Paste_Image.png

5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?

把字符串轉(zhuǎn)換為數(shù)值有三種方法:

1. Number()

如果參數(shù)是 Date 對(duì)象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數(shù)。
如果對(duì)象的值無(wú)法轉(zhuǎn)換為數(shù)字,那么 Number() 函數(shù)返回 NaN,即如果字符串截去開(kāi)頭和結(jié)尾的空白字符后,不是純數(shù)字字符串,那么最終返回結(jié)果為NaN;
可識(shí)別0xff的十六進(jìn)制表示,轉(zhuǎn)換為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方法用于將字符串轉(zhuǎn)為整數(shù)
parseInt('123') // 123 

如果字符串頭部有空格,空格會(huì)被自動(dòng)去除

parseInt('   81') // 81

如果parseInt的參數(shù)不是字符串,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換。

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

遇到不能轉(zhuǎn)換為數(shù)字的字符停止
字符串轉(zhuǎn)為整數(shù)的時(shí)候,是一個(gè)個(gè)字符依次轉(zhuǎn)換,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去,返回已經(jīng)轉(zhuǎn)好的部分。

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

上面代碼中,parseInt的參數(shù)都是字符串,結(jié)果只返回字符串頭部可以轉(zhuǎn)為數(shù)字的部分。如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號(hào)除外),返回NaN。

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

parseInt的返回值只有兩種可能,不是一個(gè)十進(jìn)制整數(shù),就是NaN。

如果字符串以0x或0X開(kāi)頭,parseInt會(huì)將其按照十六進(jìn)制數(shù)解析。

parseInt('0x10') // 16

如果字符串以0開(kāi)頭,將其按照10進(jìn)制解析。

parseInt('011') // 11

對(duì)于那些會(huì)自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法的數(shù)字,parseInt會(huì)將科學(xué)計(jì)數(shù)法的表示方法視為字符串,因此導(dǎo)致一些奇怪的結(jié)果。

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

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

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

如果第二個(gè)參數(shù)不是數(shù)值,會(huì)被自動(dòng)轉(zhuǎn)為一個(gè)整數(shù)。這個(gè)整數(shù)只有在2到36之間,才能得到有意義的結(jié)果,超出這個(gè)范圍,則返回NaN。如果第二個(gè)參數(shù)是0、undefined和null,則直接忽略。

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

如果字符串包含對(duì)于指定進(jìn)制無(wú)意義的字符,則從最高位開(kāi)始,只返回可以轉(zhuǎn)換的數(shù)值。如果最高位無(wú)法轉(zhuǎn)換,則直接返回NaN。對(duì)于二進(jìn)制來(lái)說(shuō),1是有意義的字符,5、4、6都是無(wú)意義的字符,所以第一行返回1,第二行返回NaN。

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

如果parseInt的第一個(gè)參數(shù)不是字符串,會(huì)被先轉(zhuǎn)為字符串。這會(huì)導(dǎo)致一些令人意外的結(jié)果。

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

上面代碼中,十六進(jìn)制的0x11會(huì)被先轉(zhuǎn)為十進(jìn)制的17,再轉(zhuǎn)為字符串。然后,再用36進(jìn)制解讀字符串17,最后返回結(jié)果43。

這種處理方式,對(duì)于八進(jìn)制的前綴0,尤其需要注意。

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

parseInt('011', 2) // 3

上面代碼中,第一行的011會(huì)被先轉(zhuǎn)為字符串9,因?yàn)?不是二進(jìn)制的有效字符,所以返回NaN。第二行的字符串011,會(huì)被當(dāng)作二進(jìn)制處理,返回3。

ES5不再允許將帶有前綴0的數(shù)字視為八進(jìn)制數(shù),而是要求忽略這個(gè)0。但是,為了保證兼容性,大部分瀏覽器并沒(méi)有部署這一條規(guī)定。

3.parseFloat()

parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)。

parseFloat('3.14') // 3.14

如果字符串符合科學(xué)計(jì)數(shù)法,則會(huì)進(jìn)行相應(yīng)的轉(zhuǎn)換。

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

如果字符串包含不能轉(zhuǎn)為浮點(diǎn)數(shù)的字符,則不再進(jìn)行往后轉(zhuǎn)換,返回已經(jīng)轉(zhuǎn)好的部分。

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

parseFloat方法會(huì)自動(dòng)過(guò)濾字符串前導(dǎo)的空格。

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

如果參數(shù)不是字符串,或者字符串的第一個(gè)字符不能轉(zhuǎn)化為浮點(diǎn)數(shù),則返回NaN。

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

上面代碼中,尤其值得注意,parseFloat會(huì)將空字符串轉(zhuǎn)為NaN。

這些特點(diǎn)使得parseFloat的轉(zhuǎn)換結(jié)果不同于Number函數(shù)。

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.==與===有什么區(qū)別

===是嚴(yán)格意義的相等,如果兩個(gè)值類型相同,用===進(jìn)行比較;
使用==的時(shí)候,如果兩個(gè)值的類型不同,javascript會(huì)先進(jìn)行類型轉(zhuǎn)換
如果兩個(gè)值的類型不同:

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

7.break與continue有什么區(qū)別

break 用于強(qiáng)制退出循環(huán)體,執(zhí)行循環(huán)后面的語(yǔ)句
continue 用于退出本次循環(huán),執(zhí)行下次循環(huán)

8.void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別

void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式,然后返回undefined。
Undefined是可以作為一個(gè)變量賦值的

Paste_Image.png

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

9.以下代碼輸出結(jié)果,為什么?

console.log(1+1);    //2 兩個(gè)操作數(shù)都是數(shù)字的時(shí)候,會(huì)做加法運(yùn)算
console.log("2"+"4");  //24 兩個(gè)參數(shù)都是字符串,會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log(2+"4");    //24 兩個(gè)參數(shù)有一個(gè)參數(shù)是字符串的情況下 會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log(+"4");  //4 只有一個(gè)字符串參數(shù)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字

10.以下代碼的輸出結(jié)果是?

var a = 1;  
a+++a;  
typeof a+2;

number2,
++優(yōu)先級(jí)高,限制性++,a變?yōu)?,先執(zhí)行typeof a,得到number,然后拼接字符串;

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

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

a+++b,相當(dāng)于(a++)+b,因?yàn)閍++后生效,所以相當(dāng)于1+3,得4

12.遍歷數(shù)組,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方

 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.以下代碼輸出結(jié)果是? 為什么

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

number2
typeof a + b || c >0按優(yōu)先級(jí)為:((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
根據(jù)短路邏輯,0為false,d等于||后面的,consoloe.log('haha')是先輸出haha,然后返回undefined,所以data為undefined

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

2
!!強(qiáng)制轉(zhuǎn)換字符串為true,“,”返回最后一個(gè)操作數(shù)運(yùn)算值,true+true=2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容