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

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

JavaScript 的數據類型,共有七種:

  • 數值(number)
  • 字符串(string)
  • 布爾值(boolean)
  • undefined
  • null
  • 對象(object)
  • Symbol

對象又可以分成三個子類型:

  • 狹義的對象(object)
  • 數組(array)
  • 函數(function)

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

typeof和instanceof的作用和區別?

作用:

  • typeof操作符返回一個字符串,指示未經計算的操作數的類型。
  • instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。

區別:

  • typeof 運算符可以返回一個值的數據類型, 無法區分數組和對象
  • instanceof 運算符可以做到區分數組和對象

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

var count = 123;   
typeof number  ===  "number"  //判斷是否為數字

var username = "我是用戶名";
typeof username === "string";  //判斷是否為字符串

var isBoolean = true;
typeof isBoolean === "boolean";  //判斷是否為布爾

function isFunction () {}
typeof isFunction === "function"; //判斷是否為函數

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

  • NaN是一個特殊的數值,用于表示一個本來要返回數值的操作數未返回數值的情況.任何數字除以非數值就會返回NaN,因此不會影響其他代碼的執行
  • 任何涉及NaN的操作都會返回NaN,NaN與任何值都不相等,包括它自己

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

Number();
parseInt();
parseFloat();

==與===有什么區別

一個是判斷值是否相等,一個是判斷值及類型是否完全相等。
其中 == 在比較的時候,會進行類型轉換,而 === 則不會

break與continue有什么區別

  • break是結束一個循環,跳出循環體往下執行循環后面的語句
  • continue是結束本次循環,繼續執行下一次循環

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

void 0因為執行一個表達式,始終返回undefined。而某些時候undefined被賦值后,在比較時他又不等于自己,而這時候用void(0)就可以返回undefined的值,來進行判斷。

立即執行函數表達式是什么?有什么作用

立即執行函數表達式(Immediately-Invoked Function Expression),簡稱IIFE。主要有下面兩種表達式:

(function(a,b){
   console.log(a + b);
}(1,2)); //在函數最前和最后加括號,推薦這種寫法。
(function(a,b){
   console.log(a + b);
})(1,2); // 在函數外加括號

錯誤的寫法:

function(a,b){
   console.log(a + b);
}(1,2);

因為JavaScript解釋器,遇見function時會將該語句當做函數聲明語句來處理,而正常的函數聲明寫法后面顯然是沒有最后那一對括號的。function() {statement} 的本質是一個函數,所以只需要用新的括號將它包裝起來,就可以“騙過”解釋器,從而將函數立即生效。

作用:

  • 立即執行函數可以將寫在函數體內的語句直接執行,形成一個類似區塊的空間。
  • 不必為函數命名,避免了污染全局變量。
  • IIFE內部形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變量。

求n!,用遞歸來實現

function factorial(n){
    if(n === 1){
        return 1
    }
    return n * factorial(n-1)
}
factorial(3)  // 此時輸出的結果為:3*2*1=6

代碼部分

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


console.log(1+1);// 2;兩個參數都是number,所以直接加法運算
console.log("2"+"4");// 24;兩個參數都是string,所以進行字符串拼接
console.log(2+"4"); // 24;一個參數為number另一個為string,會把number轉化為string進行字符串拼接
console.log(+"4");// 4;在只有一個字符串并且都是數字時,轉成數字之后輸出

以下代碼的輸出結果是?

var a = 1;  
a+++a; //值為3;可以表示為(a++)+a
typeof a+2; //結果為"number2";typeof優先級高于運算符,可以理解為(typeof a)+2。

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

 var a = 1;
 var b = 3;
 console.log( a+++b ); //4  a++是先執行表達式后再自增,執行表達式時使用的是a的原值,也就是1所以結果是4

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

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

遍歷 JSON, 打印里面的值

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

for(property in obj){
  console.log(property+':'+obj[property]);
}

以下代碼輸出結果是? 為什么 (選做題目)

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
console.log(val) 
/* 'number2'  typeof的優先級比較高,b||c>0就是 2||true,結果為2,相加等于number2 */

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//undefined  d==5結果是ture,&&運算左邊為true要看右邊,console.log()的返回值是undefined,所以data的值為undefined

var data2 = d = 0 || console.log('haha')
console.log(data2)
 //undefined  data2的值為0,console.log的返回值為undefined,0||undefined的值為undefined


var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//2   字符串前加!強制轉換成布爾值,并轉換成false 即值為0,!!代表雙重否定 結果為true,即值為1。!!"hello" 和 !!"from here!!"轉換為true ,值都為1,!"world"轉換為false ,即值為0,當布爾值相加時,會根據轉換后的數值1或0,分別相加得到結果2

寫一個深拷貝函數

function deepCopy(oldObj) {
        var newObj = {};
        for(var key in oldObj) {
            if(typeof oldObj[key] === 'object') {
                newObj[key] = deepCopy(oldObj[key]);
            }else{
                newObj[key] = oldObj[key];
            }
        }
        return newObj;
    }
    var myHome = {
        provience: {
            name:"湖北",
            city: {
                name:"荊門"
            }
        }
    }
    var yourHome = deepCopy(myHome);
    console.log(myHome.provience.city.name);// 荊門
    yourHome.provience.city = {
        name:"武漢"
    }
    console.log(yourHome.provience.city.name);// 武漢
    console.log(myHome.provience.city.name);// 荊門
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、立即執行函數表達式是什么?有什么作用 我們都知道,一般定義一個函數有函數聲明和函數表達式兩種方法:functi...
    zh_yang閱讀 880評論 0 6
  • 1.函數聲明和函數表達式有什么區別 (*) 函數聲明 函數表達式 函數聲明:函數調用可以發生在函數聲明之前,例如下...
    TimeLesser閱讀 407評論 4 4
  • 函數聲明和函數表達式有什么區別? 函數聲明和函數表達式是EMACScript規定的兩種不同的聲明函數的方法。1.函...
    LeeoZz閱讀 355評論 0 1
  • 1,函數聲明和函數表達式有什么區別 1、背景介紹 定義函數的方法主要有三種: 1:函數聲明(Function De...
    進擊的前端_風笑影閱讀 453評論 0 0
  • 1.函數聲明和函數表達式有什么區別 函數聲明 代碼執行時函數聲明會被提升到最前執行,所以函數的調用與函數聲明的順序...
    Feiyu_有貓病閱讀 407評論 0 0