1. 程式人生 > 其它 >JavaScript 知識總結(一)

JavaScript 知識總結(一)

1.基本型別

  • Number(數值型別)
  • Null(Null型別)
  • Boolean(布林)
  • Undefined(未定義)
  • String(字串型別)
  • Symbol(Symbol型別)
    注:Symbol是ES6引入了一種新的原始資料型別,表示獨一無二的值。

2.引用型別

  • Object(物件)
  • Array(陣列)
  • Function(函式)

3.splice、split、slice、substring

  • splice()向陣列新增或者刪除
    比如:刪除splice(i,1) 在某迴圈中刪除一個數值;在陣列第幾個新增splice(i,0,'新增老婆')
  • split()把字串切割成陣列,如果是數值型別需要將轉成字串型別
  • slice()在陣列中讀取元素,擷取字串,不改變原陣列
    let arr = ["帥", "很帥", "太帥了", "帥到生活不用自理", "來個老婆"];
    let get = arr.slice(1,3);
    console.log(get) //['很帥', '太帥了']
  • substring()擷取字串
    let str = '啊!!!你好帥啊,能加個好友?';
    let get = str.substring(4,8)
    console.log(get) //你好帥啊

4.Math是一個內建物件,擁有一些數學常數屬性和教學函式方法,用於Number型別

  • Math.abs(x) 返回一個數的絕對值
    Math.abs('-1'); // 1
    Math.abs(-2); // 2
    Math.abs(null); // 0
    Math.abs("string"); // NaN
    Math.abs(); // NaN
  • Math.ceil(x) 返回大於一個數的最小整數,向上取整
  • Math.floor(x) 返回小於一個數的最大整數,向下取整
  • Math.random() 返回隨機數
  • Math.round(x) 返回四捨五入的整數

5.try...catch語句標記要嘗試的語句塊,並指定一個出現異常是丟擲的響應

  try {
    nonExistentFunction();
  } catch (error) {
    console.error(error);
    // expected output: ReferenceError: nonExistentFunction is not defined
    // Note - error messages will vary depending on browser
  }

6.filter(),過濾一個數組篩選出符合元素組成一個新陣列,不改變原陣列,不對空數進行檢測;

  let arr = [12,20,'',16,88,'']
  let val = arr.filter((item) => item)
  console.log(val) //[12,20,16,88]

7.map(),陣列中的元素為原始陣列元素呼叫函式處理後的值,不改變原陣列,不對空數進行檢測;

  let arr = [12,20,'',16,88,'']
  let val = arr.map((item) => Number(item + 1))
  console.log(val) //[13, 21, 1, 17, 89, 1]

8.call()、apply()、bind()

  • call()方法使用一個指定this值和單獨給出的一個或多個引數來呼叫一個函式;
  function fuc(name,food){
    this.name = name || 'Tom';
    this.food = food;
  }
  function real(name,food){
    fuc.call(this,name,food)
    console.log(`${name}正在吃${food}`)
    this.yes = 'jia'
  }
  new real('Jamy','西瓜')
  • apply()呼叫一個具有給定this值的函式,以及以一個數組(或類陣列物件)的形式提供的引數;
    注:apply和call的方法類似;區別一個是引數列表一個是陣列形式
  • bind()建立一個新的函式,在bind()被呼叫時,新函式的this被指定為bind()的第一個引數,其餘引數將作為新函式的引數,供呼叫時使用;
  let obj = {
    x: 99,
    getX: function (){
      return this.x
    }
  }
  let isX= obj.getX;
  console.log(isX()) //undefined
  let isY = isX.bind(obj);
  console.log(isY()) //99

9.繼承方法
注:當談到繼承時,javascript只有一種結構:物件。
每個例項物件都有一個私有屬性(稱為__proto__ )指向他的建構函式的原型物件(prototype)。
該原型物件也有一個自己的原型物件,層層向上直到一個物件的原型物件為null。
根據定義,null沒有原型,並作為原型鏈的最後一個環節。
父類共用:

 function func(){
  this.a = 1;
  this.b = 2;
  this.add = function(){
     return this.a + this.b
  }
}
  • 原型鏈繼承
let pro = new func();
func.prototype.b = 3;
func.prototype.c = 5;
console.log(pro.add()) //3
console.log(pro.d) //undefined

繼承單一,子類無法向父類傳值
新例項共享父類例項

  • 構造繼承
function cat(){
  func.call(this)
  this.yes = 'yes'
}
let pro = new cat();

可以實現多繼承,沒有繼承父類原型屬性
無法實現函式的複用,call多了會臃腫,影響效能問題

  • 例項繼承
function pro(name){
  let Obj = new func();
  Obj.c = 13;
  return pro;
}
let obj = new pro();

不支援多類繼承,繼承父類例項,不是子類例項

  • 拷貝繼承
function deepCopy (target = {}) { //深拷貝繼承
    let anyVal = new func();
    if (typeof anyVal !== 'object' || anyVal === null) return anyVal;
    for (let i in anyVal) {
        const val = anyVal[i];
        if (isType('array', val)) {
            target[i] = deepCopy(val, [])
        } else if (typeof val === 'object') {
            target[i] = deepCopy(val);
        } else {
            target[i] = val;
        }
    }
    return target;
}
function isType (type, anyVal) {
    let newType = type.substring(0, 1).toUpperCase() + type.substring(1);
    return Object.prototype.toString.call(anyVal) === `[object ${newType}]`;
}
let obj = new deepCopy()

效率低,記憶體佔用高

  • 組合繼承
function pro(){
  func.call(this)
  this.a = 10
}
pro.prototype = new func();
let obj = new pro();

呼叫了兩次父類函式構造,子類建構函式會代替父類建構函式

  • 寄生組合繼承
function pro(){
  func.call(this)
  this.a = 10
}
let Obj = function() {}; //建立一個空沒有例項的函式
Obj.prototype = func.prototype;
pro.prototype = new Obj();
let obj = new pro()

該繼承為常用,解決了很多繼承的缺點;