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

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

JavaScript語言的每一個值,都屬于某一種數據類型。JavaScript的數據類型,共有六種。

  • 數值(number):整數和小數(比如1和3.14)

  • 字符串(string):字符組成的文本(比如"Hello World")

  • 布爾值(boolean):true(真)和false(假)兩個特定值

  • undefined:表示“未定義”或不存在,即此處目前沒有任何值

  • null:表示空缺,即此處應該有一個值,但目前為空

  • 對象(object):各種值組成的集合

    對象又可以分成三個子類型。
    狹義的對象(object)
    數組(array)
    函數(function)
    正則表達式 (regexp)

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

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

JavaScript有三種方法,可以確定一個值到底是什么類型。

  • typeof運算符
  • instanceof運算符
  • Object.prototype.toString方法

typeof 是一個一元運算,放在一個運算數之前,運算數可以是任意類型。
它返回值是一個字符串,該字符串說明運算數的類型。
數值、字符串、布爾值分別返回number、string、boolean。
函數返回function。
undefined返回undefined。

利用這一點,typeof可以用來檢查一個沒有聲明的變量,而不報錯。

v  // ReferenceError: v is not defined
typeof v // "undefined"

實際編程中,這個特點通常用在判斷語句。

// 錯誤的寫法
if (v) { }  // ReferenceError: v is not defined

// 正確的寫法
if (typeof v === "undefined") { }

除此以外,其他情況都返回object。

在使用 typeof 運算符時采用引用類型存儲值會出現一個問題,無論引用的是什么類型的對象,它都返回 "object"。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。

instanceof是一個二元操作符(運算符),和==,>,<是同一類東西。由于它是由字母組成的,它的作用是判斷其左邊對象是否為其右邊類的實例,返回boolean類型的數據。

 expression  instanceof  class

如var a=new Array();alert(a instanceof Array);會返回true,同時alert(a instanceof Object)也會返回true;這是因為Array是object的子類。

instanceof 運算符與 typeof 運算符相似,用于識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象為某特定類型。例如:

var oStringObject = new String("hello world");
alert(oStringObject instanceof String); //輸出 "true"

這段代碼問的是“變量 oStringObject 是否為 String 對象的實例?”oStringObject 的確是 String 對象的實例,因此結果是 "true"。盡管不像 typeof 方法那樣靈活,但是在 typeof 方法返回 "object" 的情況下,instanceof 方法還是很有用的。

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

typeof運算符
instanceof 運算符
Object.prototype.toString方法


Paste_Image.png

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

NaN含義是Not a Number,表示非數字,NaN和任何值都不相等,包括自己.

        NaN===NaN;//false

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

有三個函數可以把非數值轉換為數值

  1. Number()
  2. parseInt()
  3. parseFloat()

Number()

Number() 函數把對象的值轉換為數字。

如果是Boolean值,true和false值將分別被轉換為1和0。

如果是數字值,只是簡單的傳入和返回。

如果是null值,返回0。

如果是undefined,返回NaN。

如果是字符串:

a. 如果字符串中只包含數字時,將其轉換為十進制數值,忽略前導0

b. 如果字符串中包含有效浮點格式,如“1.1”,將其轉換為對應的浮點數字,忽略前導0

c. 如果字符串中包含有效的十六進制格式,如“0xf”,將其轉換為相同大小的十進制數值

d. 如果字符串為空,將其轉換為0

e. 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN

如果是對象,則調用對象的valueOf()方法,然后依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然后再依照前面的規則轉換返回的字符串值。

f.如果參數是 Date 對象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數。
g.如果對象的值無法轉換為數字,那么 Number() 函數返回 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

忽略字符串前面的空白字符,找到第一個非空白字符
如果第一個字符不是-或者數字返回NaN
如果是繼續解析,直到非數值模式為止
0開頭會當做八進制,0x開頭會當做十六進制,但是可以指定第二個參數指定基數

parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5

與parseInt() 函數類似,parseFloat() 也是從第一個字符(位置0)開始解析每一個字符。也是一直解析到字符串末尾,或者解析到遇見一個無效的浮點數字字符為止。
也就是說,字符串中第一個小數點是有效的,而第二個小數點就是無效的了,它后面的字符串將被忽略。
parseFloat() 只解析十進制,因此它沒有第二個參數指定基數的用法
如果字符串中包含的是一個可解析為正數的數(沒有小數點,或者小數點后都是零),parseFloat() 會返回整數。
例:

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

==相等
===嚴格相等
===是嚴格意義的相等,只需注意NaN和NaN不等就行
使用==的時候,javascript會幫我們做類型轉換,

  • 1.如果兩個值類型相同,則執行嚴格相等的運算

  • 2.如果兩個值的類型不同

  • 3.如果一個是null,一個是undefined,那么相等

  • 4.如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較

  • 5.如果一個值是true/false則將其轉為1/0比較

  • 6.如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較

  • 7.其它就不相等了

    null==undefined;
    NaN==NaN
    "1"==true

7.break與continue有什么區別

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

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

undefined 在 ES5 中已經是全局對象的一個只讀(read-only)屬性了,它不能被重寫。但是在局部作用域中,還是可以被重寫的。
所以undefined現常用于全局環境

void (expression)只計算表達式,而無返回值

void 運算符通常只用于獲取 undefined 的原始值,一般使用 void(0)(等同于 void 0)。在上述情況中,也可以使用全局變量undefined 來代替(假定其仍是默認值)。
而 void 可以給任何給定的表達式求值,并返回 undefined,并且 void 不可被重寫,因此void 0是在局部作用域中替代undefined的最佳選擇

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;  //因為++的優先級比+高所以相當于(a++)+a; 1+2=3
typeof a+2;"http://number2" typeof優先級相當高此時就相當于先typeof a再加上2,"number"+2="number2"。一般要對typeof后的表達式加上括號。

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

 var a = 1;
 var b = 3;
 console.log( a+++b );//(a++)+b 結果為4(a先用再自加)

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

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

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容