【前端面試】變數和型別計算
1.題目
- 1.JS使用typeof能得到哪些型別
- === 和 == 的選擇
- JS中有哪些內建函式
- JS變數按儲存方式分為哪些型別,並描述其特點
- 如何理解JSON
2.知識點
2.1 值型別和引用型別
值型別(boolean,string,number,null,undefined)
var a = 10;
var b = a;
a = 20;
console.log(b); //10
引用型別(物件,陣列,函式)
var a = {x:10}
var b = a;
a.x = 20;
console.log(b); //20
值型別直接把值儲存在堆中,把a賦值給b在記憶體中是又給b開闢了一塊新的空間,儲存了同樣的值。
引用型別分兩塊儲存,先在堆中儲存一個實際的值,再在棧中儲存一個堆中值的引用地址,指向堆中的物件。把a賦值給b是在棧中重新開闢一塊空間儲存的還是相同物件的引用地址,a和b儲存的地址相同,指向的物件也相同。當物件值發生改變時,兩者會同時改變。
引用型別的值一般都比較大,採用此種儲存方式可以節省記憶體空間。
2.2 typeof運算子
typeof 'abc' //string typeof 123 //number typeof true //boolean typeof undefined //undefined typeof null //object typeof {a:10} //object typeof [1,2,3] //object typeof console.log() //function
2.3 型別轉換
強型別轉換:通過String(),Number(),Boolean(),parseInt()函式強制轉換
可能發生隱式型別轉換的場景
- 字串拼接
- 使用==
- if語句
- 邏輯迴圈
一、首先看雙等號前後有沒有NaN,如果存在NaN,一律返回false。
二、再看雙等號前後有沒有布林,有布林就將布林轉換為數字。(false是0,true是1)
三、接著看雙等號前後有沒有字串, 有三種情況:
1、對方是物件,物件使用toString()或者valueOf()進行轉換;
2、對方是數字,字串轉數字;(前面已經舉例)
3、對方是字串,直接比較;
4、其他返回false
四、如果是數字,對方是物件,物件取valueOf()或者toString()進行比較, 其他一律返回false
五、null, undefined不會進行型別轉換, 但它們倆相等
上面的轉換順序一定要牢記,面試的時候,經常會出現型別的問題。
'100'==100 //轉換成字串
''==0 //轉換成false
undefined == null; // true
1 == true; // true
2 == true; // false
0 == false; // true
0 == ' '; // true
NaN == NaN; // false
[] == false; // true
[] == ![]; // true
//在if中轉換成false的:
null
undefined
''
NaN
0
false
10 && 0 //0 10轉換成true
'' || 'abc' //abc ''轉換成false
!window.abc //true
2.4 null和undefined的區別
null:是被賦值過的物件,刻意把一個物件賦值為null,故意表示其為空,不應有值,所以物件為null是正常的,typeof null 返回 'object' ,null可以轉換為0
undefined 表示“缺少值”,即此處應有一個值,但還沒有定義;轉為數值時為NaN(非數字值的特殊值) typeof undefined 返回 'undefined'
3.題目解答
3.1 JS使用typeof能得到哪些型別
typeof 'abc' //string
typeof 123 //number
typeof true //boolean
typeof undefined //undefined
typeof null //object
typeof {a:10} //object
typeof [1,2,3] //object
typeof console.log() //function
3.2 === 和 == 的選擇
jquery原始碼中的寫法:
除了以下方式其他全部使用 ===
if(obj.a == null){
//相當於 obj.a === undefined || obj.a === null
}
3.3 JS中有哪些內建函式
單純作為語言來說,不考慮node和瀏覽器web
- Object
- Array
- Boolean
- Number
- String
- Function
- Date
- RegExp
- Error
內建物件:Math,JSON
3.4 JS變數按儲存方式分為哪些型別,並描述其特點
值型別何引用型別
3.5 如何理解JSON
JSON是JS中的一個內建物件
區別
- JS物件 {x:10}
- JSON物件 {'x':10}
- JSON串 "{'x':10}"
//將JS物件轉換成json串
JSON.stringify({x:10});
//將json字串轉換成json物件
JSON.parse("{'x':10}");
3.6 嚴格模式
目的
消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
消除程式碼執行的一些不安全之處,保證程式碼執行的安全;
提高編譯器效率,增加執行速度;
為未來新版本的Javascript做好鋪墊。
特性
"use strict";
可以選擇放在一個函式中或自定義作用域中。
禁止this指向全域性物件
function f(){
return !this;
}
// 返回false,因為"this"指向全域性物件,"!this"就是false
function f(){
"use strict";
return !this;
}
// 返回true,因為嚴格模式下,this的值為undefined,所以"!this"為true。
創設eval作用域
正常模式下,Javascript語言有兩種變數作用域(scope):全域性作用域和函式作用域。嚴格模式創設了第三種作用域:eval作用域。
正常模式下,eval語句的作用域,取決於它處於全域性作用域,還是處於函式作用域。嚴格模式下,eval語句本身就是一個作用域,不再能夠生成全域性變量了,它所生成的變數只能用於eval內部。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
全域性變數顯式宣告
v = 1; // 報錯,v未宣告
for(i = 0; i < 2; i++) { // 報錯,i未宣告
}
禁止刪除變數
嚴格模式下無法刪除變數。只有configurable設定為true的物件屬性,才能被刪除。
"use strict";
var x;
delete x; // 語法錯誤
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 刪除成功
函式不能有重名的引數
保留字
為了向將來Javascript的新版本過渡,嚴格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
使用這些詞作為變數名將會報錯。
function package(protected) { // 語法錯誤
"use strict";
var implements; // 語法錯誤
}
3.7 eval
1.沒有必須使用的應用場景
2.不容易除錯,可讀性不好
3.在舊的瀏覽器中如果你使用了eval,效能會下降10倍。
4.容易xss