1. 程式人生 > >【前端面試】變數和型別計算

【前端面試】變數和型別計算

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

來源:https://segmentfault.com/a/1190000017750251