你真的懂JavaScript基礎型別嗎

_zhongmeizhi_發表於2019-04-03

夯實Javascript基礎。

基本型別有六種: null,undefined,boolean,number,string,symbol。

基本型別的值是儲存在棧記憶體中的簡單資料段

基礎型別特性

基礎型別最重要的特性

  • 基礎型別是不變的
    • 因此:基礎型別沒有splice,sort之類的直接改變變數的方法
    • 強行改變基礎型別會報錯
      // str 不能呼叫 Array的 sort 和 splice
    
      Array.prototype.sort.call('strxyz');
      // Uncaught TypeError: Cannot assign to read only property '2' of object '[object String]'
    
      Array.prototype.splice.call('strxyz');
      // Uncaught TypeError: Cannot assign to read only property 'length' of object '[object String]'
    
    
      // object 可以使用 Array的sort 和 splice
    
      Array.prototype.sort.call({x: 1, y: 2});
      // {x: 1, y: 2}
    
      Array.prototype.splice.call({x: 1, y: 2});
      // []
    複製程式碼
  • 基礎型別沒有__proto__沒有屬性
      str.x = 1;
      console.log(str.x); // undefined
    複製程式碼
  • 所有對基礎型別屬性的訪問都是訪問的基本包裝型別(String、Number、Boolean)
      當你呼叫 `str.length` 時,實際過程是這樣的:
      - 建立String型別的一個例項
      - 在例項上呼叫指定的方法
      - 銷燬這個例項
    
      var str = 'abc';
      var _str = new String(str);
      var len = _str.length;
      _str = null;
      console.log(len);
    複製程式碼

其他特性

  • typeof null === 'object'
    • (歷史遺留問題,因為000開頭表示物件,而null全是0)
  • 條件判斷時 undefined null false NaN '' 0 -0 為 false,其他都為 true
    • (條件判斷時會隱式轉換為Boolean)
  • JS只有浮點型別(double),沒有整型
    • 1 === 1.0
  • NaN 也屬於 number 型別,並且 NaN 不等於自身。
    • var a = NaN; a !== a;
  • String 型別是類陣列,具有iterator
    • typeof String('x')[Symbol.iterator] === 'function'

基礎型別檢測

檢測基礎型別用 typeof

  // typeof 只適合檢測 基礎型別

  typeof new Date() // 'object'
  typeof [] // 'object'
  typeof {} // 'object'
  typeof console.log // 'function'
複製程式碼

基礎型別轉換

基本型別轉換時,首先會呼叫 valueOf,然後呼叫 toString。並且這兩個方法可以重寫。

  var a = 1;

  var obj = {x: 1};
  obj.toString === '[object Object]';

  var arr = [2, 3];
  arr.toString() === '2,3';

  a + obj === '1[object Object]';
  a + arr === '12,3';
複製程式碼

Symbol.toPrimitive該方法在轉基本型別時呼叫優先順序最高。

  let a = {
    valueOf() {
      return 1;
    },
    toString() {
      return '2';
    },
    [Symbol.toPrimitive]() {
      return 3;
    }
  }

  1 + a // => 4
複製程式碼

四則運算

  • 在四則運算中,除了'+' 其他操作都會以數字進行計算
  • 如果是 + 運算,如果不是所有字面量都是number,那麼會轉換為字串(toString)進行拼接

End

持續更新中,Github資訊更多哦,你的⭐是我最大的支援。檢視詳情

相關文章