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);// 荊門