文章出處

const的可變性

const用于聲明常量。
什么是常量,聲明后的值不可更改。
對于值類型,比如string,number等等。const聲明確實有效。

const str = "string";
str = 1; // Uncaught TypeError: Assignment to constant variable.

對于引用類型,比如array,object。const聲明只保證了引用不可更改,但保證不了其內容。

const arr = [];
arr.push(1); // 不報錯
arr; // [1]
const obj = {};
obj.test = 1; // 不報錯
obj; // Object {test: 1}

arr = 1; // Uncaught TypeError: Assignment to constant variable.
obj = 1; // Uncaught TypeError: Assignment to constant variable.

為了保證array和object的內容也不可更改。我可以使用Object.freeze方法。

const arr = [1];
Object.freeze(arr);
arr.push(1); // Uncaught TypeError: Can't add property 1, object is not extensible
arr[0] = 9; // arr[0]的值仍是1,但這條語句不會報錯。
arr[0]; // 1

const obj = {};
Object.freeze(obj);
obj.a = 3; // obj的值仍是{},但這條語句不會報錯。
obj; // {}

應該報錯的地方,不去報錯,有隱患。
隱患在于排查bug困難。

并且,Object.freeze只能鎖定對象的一級值屬性。

const obj = {a: {}};
Object.freeze(obj);
obj.a.b = 1;
obj; // {a: {b: 1}}

這樣看來原生,并沒有提供一個好的const解決方案。
直的不行,我們彎的來。
參考Facebook的immutable-js
以及這篇文章也可一看。

沒有return語句的函數

JS里面的函數允許沒有return語句,它會默認返回undefined。

var a = 1;
var fn = function(){};
a = fn();
a; // undefined

如果你的return是寫在分支中,沒有被執行到,便會有隱患。

箭頭函數可讀性不高

ES6還允許使用箭頭函數。情況更加糟糕。

const isEven = n => n % 2 == 0;
// 等同于
const isEven = function(n){
  return (n % 2) == 0;
};

箭頭函數寫起來更加簡潔,閱讀起來則更加費腦。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()