【前端面試】變量和類型計算

1.題目

  • 1.JS使用typeof能獲得哪些類型
  • === 和 == 的選擇
  • JS中有哪些內置函數
  • JS變量按存儲方式分爲哪些類型,並描述其特色
  • 如何理解JSON

2.知識點

2.1 值類型和引用類型

值類型(boolean,string,number,null,undefined)node

var a = 10;
var b = a;
a = 20;
console.log(b); //10

引用類型(對象,數組,函數)jquery

var a = {x:10}
var b = a;
a.x = 20;
console.log(b); //20

值類型直接把值存儲在堆中,把a賦值給b在內存中是又給b開闢了一塊新的空間,存儲了一樣的值。web

引用類型分兩塊存儲,先在堆中存儲一個實際的值,再在棧中存儲一個堆中值的引用地址,指向堆中的對象。把a賦值給b是在棧中從新開闢一塊空間存儲的仍是相同對象的引用地址,a和b存儲的地址相同,指向的對象也相同。當對象值發生改變時,二者會同時改變。面試

引用類型的值通常都比較大,採用此種存儲方式能夠節省內存空間。json

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語句
  • 邏輯循環

1、首先看雙等號先後有沒有NaN,若是存在NaN,一概返回false。安全

2、再看雙等號先後有沒有布爾,有布爾就將布爾轉換爲數字。(false是0,true是1)xss

3、接着看雙等號先後有沒有字符串, 有三種狀況:函數

一、對方是對象,對象使用toString()或者valueOf()進行轉換;
二、對方是數字,字符串轉數字;(前面已經舉例)
三、對方是字符串,直接比較;
四、其餘返回false
4、若是是數字,對方是對象,對象取valueOf()或者toString()進行比較, 其餘一概返回false

5、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

bVboR1i?w=476&h=222

相關文章
相關標籤/搜索