整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          解密權限管理:使用位運算在JavaScript中權限控制(面試題)

          使用位運算進行權限控制時,我們首先將權限定義為2的冪次方,然后通過將這些權限的二進制表示進行位運算來表示用戶的權限組合。以下是權限和對應的二進制表示:

          讀取權限(1):二進制 0001

          寫入權限(2):二進制 0010

          刪除權限(4):二進制 0100

          執行權限(8):二進制 1000

          現在我們定義不同角色的權限組合:

          普通用戶:權限組合為 0001

          編輯員:權限組合為 0011

          管理員:權限組合為 0111

          執行者:權限組合為 1001

          當用戶登錄并且角色確定后,我們可以使用位運算來檢查用戶是否具有特定權限。例如,如果用戶是管理員(權限組合為 0111),權限檢查的結果如下:

          檢查讀取權限:0111 & 0001 = 0001(有讀取權限)

          檢查寫入權限:0111 & 0010 = 0010(有寫入權限)

          檢查刪除權限:0111 & 0100 = 0100(有刪除權限)

          檢查執行權限:0111 & 1000 = 0000(沒有執行權限)

          通過這種方式,我們可以通過進行位運算來快速地判斷用戶是否具有特定權限,而不需要存儲大量的權限信息。

          以下是整體的權限控制方法,包括權限定義、角色權限組合以及權限檢查的示例:

          // 權限定義
          
          const READ_PERMISSION = 1; // 二進制 0001
          
          const WRITE_PERMISSION = 2; // 二進制 0010
          
          const DELETE_PERMISSION = 4; // 二進制 0100
          
          const EXECUTE_PERMISSION = 8;// 二進制 1000
          
          // 角色權限組合
          
          const ROLE_USER = READ_PERMISSION; // 0001
          
          const ROLE_EDITOR = READ_PERMISSION | WRITE_PERMISSION; // 0011
          
          const ROLE_ADMIN = READ_PERMISSION | WRITE_PERMISSION | DELETE_PERMISSION; // 0111
          
          const ROLE_EXECUTOR = READ_PERMISSION | EXECUTE_PERMISSION; // 1001
          
          // 用戶角色
          
          const userRole = ROLE_ADMIN;
          
          // 權限檢查
          
          function hasPermission(role, permission) {
          
          return (role & permission) !== 0;
          
          }
          
          // 檢查權限
          
          console.log("Has read permission:", hasPermission(userRole, READ_PERMISSION));
          
          console.log("Has write permission:", hasPermission(userRole, WRITE_PERMISSION));
          
          console.log("Has delete permission:", hasPermission(userRole, DELETE_PERMISSION));
          
          console.log("Has execute permission:", hasPermission(userRole, EXECUTE_PERMISSION));

          上述代碼演示了如何使用位運算來進行權限控制,以及如何檢查用戶是否具有特定的權限。

          . 基本概念

          Math.exp()方法返回e的x次冪(也叫e的x次方,e是底數而x是指數),其中x是傳遞給Math.exp()的參數,而e是自然常數,它的值約等于2.718281828459045。exp是單詞"exponential"的前三個字母構成的縮寫形式,而"exponential"的含義就是“指數”。因此Math.exp()方法的名字就暗含了它的參數就是指數,同時它固定了底數為e。

          調用Math.exp()方法的語法如下所示:

          Math.exp(x);

          根據對Math.exp()方法的作用的描述,我們就知道它的參數x應該是Number類型的(即x要是一個數字)。如果你傳遞了一個非Number類型的參數,那么該參數會先被自動轉換為Number類型。

          JavaScript的Number類型除了包含普通數字外,還包含幾個特殊的數字,即NaN、+0、-0、正無窮(+Infinity)和負無窮(-Infinity)。當Math.exp()方法的參數和結果為這些特殊數字時我們需要額外注意,具體就是以下幾點:

          1. 如果x是NaN,那么結果是NaN;

          2. 如果x是+0,那么結果是1;

          3. 如果x是-0,那么結果是1;

          4. 如果x是正無窮(+Infinity),那么結果是正無窮;

          5. 如果x是負無窮(-Infinity),那么結果是+0;

          6. 其余情況下,x是一個普通數字,那么就直接按照e的x次方計算結果。

          如果最開始x不是一個數字的話,那么以上這些規則中所說的x的值指的是它被轉換為數字后的值。其實這些規則都很簡單,它們的本質都是一樣的,都是對e的x次方這一計算過程的運用,只是需要對參數x和結果為特殊數字的情形稍加注意而已。

          2. 示例

          既然Math.exp()方法的參數可以是普通數字、特殊數字以及不是數字,那么我們就根據這三種情況分別給出示例代碼,以便清楚地看到Math.exp()方法的結果。

          2.1 參數是普通數字

          <script>
              var value1 = Math.exp(1);
              console.log("Math.exp(1):");
              console.log(value1);
          
              var value2 = Math.exp(-5);
              console.log("\nMath.exp(-5):");
              console.log(value2);
          
              var value3 = Math.exp(10.3);
              console.log("\nMath.exp(10.3):");
              console.log(value3);
          
              var value4 = Math.exp(-8.6);
              console.log("\nMath.exp(-8.6):");
              console.log(value4);
          </script>

          上面這段代碼的執行結果如圖1所示:

          圖1 參數為普通數字時的結果

          2.2 參數是特殊數字

          <script>
              var value1 = Math.exp(NaN);
              console.log("Math.exp(NaN):");
              console.log(value1);
          
              var value2 = Math.exp(+0);
              console.log("\nMath.exp(+0):");
              console.log(value2);
          
              var value3 = Math.exp(-0);
              console.log("\nMath.exp(-0):");
              console.log(value3);
          
              var value4 = Math.exp(+Infinity);
              console.log("\nMath.exp(+Infinity):");
              console.log(value4);
          
              var value5 = Math.exp(-Infinity);
              console.log("\nMath.exp(-Infinity):");
              console.log(value5);
          </script>

          圖2展示了該示例的執行結果:

          圖2 參數為特殊數字時的結果

          2.3 參數不是數字

          <script>
              /* 字符串"1.000"轉換成數字為1.000 */
              var value1 = Math.exp("1.000");
              console.log('Math.exp("1.000"):');
              console.log(value1);
          
              /* 布爾值false轉換成數字為+0 */
              var value2 = Math.exp(false);
              console.log("\nMath.exp(false):");
              console.log(value2);
          
              /* window對象轉換成數字為NaN */
              var value3 = Math.exp(window);
              console.log("\nMath.exp(window):");
              console.log(value3);
          
              /* null轉換成數字為+0 */
              var value4 = Math.exp(null);
              console.log("\nMath.exp(null):");
              console.log(value4);
          </script>

          該示例代碼的執行結果如圖3所示,需要注意的是當參數不是數字的時候,Math.exp()方法會先將參數轉換為數字再計算結果。

          圖3 參數需要轉換時的結果

          (完)

          . 基本概念

          Math.expm1()方法返回e^x - 1,其中e^x是e的x次方。x是傳遞給Math.expm1()方法的參數;而e是自然常數,它的值約等于2.718281828459045。

          調用Math.expm1()方法的語法形式如下所示:

          Math.expm1(x);

          既然Math.expm1()方法的參數x代表指數,那么它就應該是一個數字,即它屬于Number類型。如果不是,那么它會先被自動轉換為數字。

          為了更好地記憶Math.expm1()方法的作用,我們將它的名稱分為三部分,分別是:exp、m和1。首先exp是單詞“exponent”的縮寫,而“exponent”的含義就是“指數”,這暗示Math.expm1()首先要進行冪運算,其中底數為e而指數x就是該方法的參數。m是單詞“minus”的首字母,表示減法;1就是數字1。

          因此Math.expm1()方法的名字就說明了它的作用,那就是先進行冪運算再將該中間結果減去1;即Math.expm1(x)等于Math.exp(x) - 1。

          2. 返回值規則

          JavaScript的Number類型的一個特殊之處就在于它包含幾個特殊數字,分別是:NaN、+0、-0、正無窮(+Infinity)和負無窮(-Infinity)。當Math.expm1()方法的參數x是這些特殊數字時,可能需要額外引起注意。概括起來,JavaScript按照如下這些規則來決定Math.expm1()方法的返回值。

          1. 如果x是NaN,那么返回值是NaN;

          2. 如果x是+0,那么返回值是+0;

          3. 如果x是-0,那么返回值是-0;

          4. 如果x是正無窮(+Infinity),那么返回值是正無窮;

          5. 如果x是負無窮(-Infinity),那么返回值是-1;

          6. 其余情況下,x是一普通數字,那么返回值就是e^x - 1。

          結合Math.expm1()等于e^x - 1,可以很好地理解以上這些規則。如果你傳遞的x不是數字的話,那么這些規則中提到的x的值指的是x被轉換為數字后的值。

          3. 示例

          總的來說,Math.expm1()方法很好理解;因此我們只舉幾個簡單的例子就行了。以下示例代碼的執行結果如圖1所示。

          <script>
              /* 下面兩個方法調用中,參數都是普通數字 */
              var value1 = Math.expm1(1);
              console.log("Math.expm1(1):");
              console.log(value1);
          
              var value2 = Math.expm1(-8);
              console.log("\nMath.expm1(-8):");
              console.log(value2);
          
              /* 下面3個方法調用中的參數都是特殊數字 */
              var value3 = Math.expm1(NaN);
              console.log("\nMath.expm1(NaN):");
              console.log(value3);
          
              var value4 = Math.expm1(-0);
              console.log("\nMath.expm1(-0):");
              console.log(value4);
          
              var value5 = Math.expm1(+Infinity);
              console.log("\nMath.expm1(+Infinity):");
              console.log(value5);
          
              /*
               * 布爾值true轉換成數字為1,因此
               * Math.expm1(true)等價于Math.expm1(1)
               */
              var value6 = Math.expm1(true);
              console.log("\nMath.expm1(true):");
              console.log(value6);
          </script>

          圖1 示例代碼的執行結果

          (完)


          主站蜘蛛池模板: 精品一区二区三区免费毛片| 精品国产AV一区二区三区| 99精品国产高清一区二区三区| 亚洲爽爽一区二区三区| 精品人伦一区二区三区潘金莲| 日本一区二区三区免费高清在线| 无码人妻精品一区二区三18禁| 国产在线观看精品一区二区三区91| 亚洲综合无码AV一区二区 | 国产精品亚洲午夜一区二区三区| 亚洲熟妇无码一区二区三区 | 成人无码一区二区三区| 亚洲色大成网站www永久一区| 亚洲视频一区网站| 精品国产一区二区三区香蕉事| 一区二区高清在线观看| 乱码精品一区二区三区| 天天视频一区二区三区| 精品日韩在线视频一区二区三区| 色欲AV蜜臀一区二区三区| 国产精品亚洲一区二区三区久久| 国产亚洲欧洲Aⅴ综合一区| 国产高清在线精品一区| 久久免费视频一区| 亚洲爆乳精品无码一区二区| 少妇人妻偷人精品一区二区| 无码中文字幕乱码一区 | 国产一区二区影院| 人妻久久久一区二区三区 | 国产日韩一区二区三区在线观看| 美女视频一区三区网站在线观看| 精品国产不卡一区二区三区| 亚洲色精品VR一区区三区| 中文字幕一区二区三区乱码| 无码aⅴ精品一区二区三区| 亚洲国产精品自在线一区二区 | 色妞色视频一区二区三区四区| 成人免费视频一区二区| bt7086福利一区国产| 人妻无码第一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 |