假设我有一个由 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]
都将被字符串化为“[无效的]”。但由于您只使用了 false
和 true
,所以这不是问题。
现在回答您的问题:
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/