javascript - 字符串化数组是一个好习惯吗?

标签 javascript arrays switch-statement boolean

假设我有一个由 boolean 值组成的数组。

myArray = [false,false,false]

而且我需要根据每个状态做不同的事情。

例如:

[false,true,false], [false,false,true], [true,true,false], ...

等等。

通常这种操作是通过检查每个单独的元素是否合适来完成的。

例如:

if(!myArray[0] && myArray[1] && !myArray[2]) do A
if(!myArray[0] && !myArray[1] && myArray[2]) do B
if(myArray[0] && myArray[1] && !myArray[2]) do C
...

而不是那样做。我将数组转换为字符串:

switch(JSON.stringify(myArray))
    case : "[false,true,false]"
        do A
        break
    case : "[false,false,true]"
        do B
        break
    case : "[true,true,false]"
        do C
        break
    ......

这被认为是好的做法吗?使用此方法我可能会遇到任何隐藏的错误吗? 这种方法会增加可读性吗?

最佳答案

关于使用 JSON.stringify

JSON.stringify 的使用对于(JSON 兼容的)原语(即 boolean 值、字符串、数字、null)的数组(或数组(或数组...))可以正常工作。没有歧义。 ECMAScript 规范也清楚地说明了在不同值之间产生的“差距”:它应该是空字符串,除非通过可选参数明确定义不同。参见 ECMAScript Language Specification on the topic .

需要注意的是 undefined 不是 JSON 中的内容,因此 [null][undefined] 都将被字符串化为“[无效的]”。但由于您只使用了 falsetrue,所以这不是问题。

现在回答您的问题:

Is this considered good practice?

这是一个见仁见智的问题。我的第一直觉说“不”,主要是因为类型转换,但由于您的特定用例(即 boolean 数组)没有任何警告,我们真的没有太多可批评的地方。

Is there any hidden error I might face with this method?

没有

Will this method increase readability ?

然而,至少有一种替代方案具有所有相同的优点,但不依赖于某些数据类型转换:

替代方案:位集

如果您的数组是 boolean 数组,您可以选择使用数字数据类型,其中数字的每个二进制位对应数组版本中的一个 boolean 值。

预计此方法将比 strinfigication 选项更有效,因为数据类型转换显然需要一些时间。

这是原始数组模式的运行:

let arr = [false, false, true];

if (!arr[0] && arr[1] && !arr[2]) console.log("do A");
if (!arr[0] && !arr[1] && arr[2]) console.log("do B");
if (arr[0] && arr[1] && !arr[2]) console.log("do C");

下面是使用位集实现的相同逻辑:

let bitset = 0b001;

if (bitset === 0b010) console.log("do A");
if (bitset === 0b001) console.log("do B");
if (bitset === 0b110) console.log("do C");

如果您需要比数字数据类型(53 位)更多的位,那么您可以选择 BigInt。例如:

let bitset = 0b1010101010101010101010101010101010101010101010101010101n;

// A partial comparison
if ((bitset & 0b100010001n) === 0b100010001n) console.log("do A");

当然,0b字面量不是必须的;这只是为了突出与数组版本的对应关系。您可以通过以十六进制表示法 (0x) 或什至是纯十进制表示法来保存一些字符,尽管后者对于您的代码的读者来说更加晦涩难懂。

关于javascript - 字符串化数组是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63480324/

相关文章:

javascript - 如何兼顾 appcache.manifest、manifest.json 和 serviceworkers?

javascript - 如何在 redux 中使用 axios 库将数据发布到 API 服务器

arrays - 数组排序不正确

java - 如何覆盖字节数组中的特定 block

javascript - (如何)我可以在 switch 语句中使用 'or' 吗?

c# - 如何在其他类的 lightswitch 中访问数据库?

javascript - js obj -> json 文件(ajax、php)

javascript - JQuery Cookie 1 分钟后过期

javascript - 另一个 JavaScript 数组挑战

c# - 为什么我不能在范围内的 switch 语句中使用 "constant"?