數據類型運算符流程控制語句

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

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

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

example:

var str = 'jirengu';
var isOk = true ;
var hello;  //undefined
var empty = null; 
var person = {
  name: '小明',
  age: 100
}
var arr = [1, 2, 3];
var sayName = function(){
  console.log('my name is jirengu')
}
var reg = /hello/;```

原始類型(primitive type):包含數值、字符串、布爾值。
復雜類型(complex type):對象

兩者的區別:
原始類型(primitive type),即它們是最基本的數據類型,不能再細分了。
而復雜類型(complex type)(引用類型)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值。
typeof  null
object

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

- typeof的作用:typeof是一元運算符,返回值為字符串,該字符串用來說明運算數的數據類型。而這個應用卻不是來檢查對象的類型。

- instanceof的作用:instanceof用于判斷某個變量是否是某個對象的實例,返回值為true或false。其語法是object instanceof constructor。

- 區別:因為typeof遇到數組、null都會返回object,所以要判斷某個對象是否是數組或者某個變量是否是對象的實例時就要使用instanceof。

```var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true```

####3.如何判斷一個變量是否是數字、字符串、布爾、函數
三種方法:

方法一:typeof運算符
typeof運算符可以返回一個值的數據類型。返回值為number時是數字;返回值為string時是字符串;返回值為boolean時是布爾;返回值是function時是函數。
原始類型:數值、字符串、布爾值分別返回number、string、boolean。
```typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"```
函數:函數返回function。
```function f() {}
typeof f
// "function"```

undefined:返回undefined。
```typeof undefined
// "undefined"```
除此以外,其他情況都返回object。

方法二:instanceof運算符
方法三:Object.prototype.toString方法
Object.prototype.toString.call()

####4.NaN是什么? 有什么特別之處?
NaN(Not a Number)表示非數字,NaN和任何值都不相等,包括自己。
`parseInt('abc'); //NaN`
0除以0也會得到NaN。`0 / 0 // NaN`
需要注意的是,NaN不是一種獨立的數據類型,而是一種特殊數值,它的數據類型依然屬于Number,使用typeof運算符可以看得很清楚。`typeof NaN // 'number'`
特別之處是:
任何NaN的值進行操作都會返回一個NaN
NaN與任何值都不相等包括它自己
```NaN == NaN; //false
NaN !== NaN; //true```

####5.如何把非數值轉化為數值?
有三個函數可以把非數值轉換為數值:

1. Number()
Number() 函數把對象的值轉換為數字。
語法:Number(object)
如果參數是 Date 對象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數。
如果對象的值無法轉換為數字,那么 Number() 函數返回 NaN。

2. parseInt()
parseInt方法用于將字符串轉為整數。parseInt的返回值只有兩種可能,不是一個十進制整數,就是NaN。
忽略字符串前面的空白字符,找到第一個非空白字符;
如果第一個字符不是-或者數字返回NaN;
如果是繼續解析,直到非數值模式為止;
parseInt方法還可以接受第二個參數(2到36之間),表示被解析的值的進制,返回該值對應的十進制數。默認情況下,parseInt的第二個參數為10,即默認是十進制轉十進制。
```parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000```
0開頭會當做八進制,0x開頭會當做十六進制,但是可以指定第二個參數指定基數;
```parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5```

3. parseFloat()
parseFloat方法用于將一個字符串轉為浮點數。如果字符串符合科學計數法,則會進行相應的轉換。
如果字符串包含不能轉為浮點數的字符,則不再進行往后轉換,返回已經轉好的部分。
如果參數不是字符串,或者字符串的第一個字符不能轉化為浮點數,則返回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.==與===有什么區別
- ==(equality 等同)兩邊值類型不同的時候,要先進行類型轉換,再比較。 
如果兩個值類型相同,則執行嚴格相等的運算。
如果兩個值的類型不同:
如果一個是null,一個是undefined,那么相等;
如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較;
如果一個值是true/false則將其轉為1/0比較;
如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較;
其它就不相等了。
```null==undefined;
NaN==NaN
"1"==true```

- ===(identity 恒等)是嚴格意義的相等,不做類型轉換,類型不同的一定不等。 需注意NaN和NaN不等。

####7.break與continue有什么區別
- break 用于強制退出循環體,執行循環后面的語句。
- continue 用于退出本次循環,執行下次循環。

```for(var i = 1; i< 10; i++){
    if(i % 4 === 0){
        break;
    }
    console.log(i);
}```
輸出結果為1 2 3 ,當i=4時,執行if語句,遇到break會跳出整個循環,結束。

```for(var i = 1; i< 10; i++){
    if(i % 4 === 0){
        continue;
    }
    console.log(i);
}```
輸出結果為1 2 3 5 6 7 8 9,當i=4時,執行if語句,遇到continue會接著循環,當i=10時才結束。

####8.void 0 和 undefined在使用場景上有什么區別
- undefined 不能被重寫。但是在局部作用域中,還是可以被重寫的,所以undefined現常用于全局環境。
- void 運算符通常只用于獲取 undefined 的原始值,一般使用 void(0),在上述情況中,也可以使用全局變量undefined 來代替(假定其仍是默認值)。
而 void 可以給任何給定的表達式求值,并返回 undefined,并且 void 不能被重寫,因此void 0是在局部作用域中替代undefined的最佳選擇。

####9.以下代碼的輸出結果是?為什么?
```console.log(1+1);//2 兩個值都為number故直接計算結果為2
console.log("2"+"4"); //24 "2"與"4"都為字符串,相加的結果也是字符串"24"
console.log(2+"4"); //24 "4"為字符串,2則轉換為字符串才能相加,結果為"24"
console.log(+"4");//4 只有一個字符串會轉換成數字輸出,4```

####10. 以下代碼的輸出結果是?
```var a = 1;  
a+++a;//3 ++的優先級大于+,先執行a++,a++為1,a的值變為2,故a++加上a的值為3  
typeof a+2;//number2```

typeof的優先級高于+,故順序為(typeof a)+2,typeof a的結果為number,number+2的結果為字符串number2

####11. 以下代碼的輸出結果是? 為什么
 ```var a = 1;
 var b = 3;
 console.log( a+++b );//4```
++的優先級高于+,故順序為(a++)+b,a++為1,b為3,故結果為4

####12. 遍歷數組,把數組里的打印數組每一項的平方
 ```var arr = [3,4,5]
    for(i=0;i<arr.length;i++){console.log(arr[i]*arr[i])}```


####13. 遍歷 JSON, 打印里面的值
```var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for(var prop in obj){
    console.log(prop);
}```

####14. 以下代碼輸出結果是? 為什么 (選做題目)
```var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) //number2```

按照優先級,首先是typeof a為number
number+b,b的值為2,故結果為字符串number2
c>0為true,最后number2 || true為number2

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

按照優先級,console.log('bb')為bb,d==5為true
true&&bb為bb,賦值給data

```var data2 = d = 0 || console.log('haha')
console.log(data2)//haha```
按照優先級,console.log('haha')為haha,把0賦值給d
false || haha為haha,賦值給data2
 
```var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)//2```
兩次邏輯非抵消,字符串空為false非空為true,var=true+(false+true),1+1=2
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容