【问题标题】:Why does adding "{" "}" remove brackets from an array? (JavaScript)为什么添加“{”“}”会从数组中删除括号? (JavaScript)
【发布时间】:2017-08-03 03:16:22
【问题描述】:

例子:

var test = [];
test.push( 'string', 'test'); //[ 'string', 'test' ]
console.log('{' + test + '}'); // {string,test}
console.log(typeof('{' + test + '}')); //string

为什么添加{} 会从测试中删除括号?我本来希望第三行的结果是{ [string, test] }

【问题讨论】:

  • 试试console.log(''+test) - 数组的字符串表示没有括号。
  • + 标点符号过载。它可以表示arithmetic addition, string concatenationunary + operator。哪一个是基于上下文的。
  • '' + testtest 强制转换为字符串:test.toString() 给出相同的结果。
  • JS 是一种非常松散类型的语言。在涉及不同类型的操作中,从对象到基本类型(如 String 或 Boolean)的类型强制是自动执行的。在这种特殊情况下,Array.prototype.toString() 函数只是忽略了外括号,并与String.prototype.split(",") 相反。

标签: javascript arrays string object


【解决方案1】:

原因是创建 Javascript 时做出的许多错误选择之一,现在由于向后兼容性而修复为时已晚。

转换为字符串的数组变成了转换为字符串的元素的串联,用逗号分隔不包含[]标记

例如这就是原因

(1 == [1])

在Javascript中是true(两者的类型不同,转成字符串是一样的),以及定义的原因

var a = [1], b = 1, c = [[1]];

表达式

(a == b && b == c && a != c)

也是true

【讨论】:

  • 为什么在创建 JavaScript 时将数组的字符串表示为用逗号分隔的元素值是一个糟糕的选择?将数组转换为字符串时,是否有更好的默认选项可以实现?
  • @nnnnnn: [1, 2, 3] 被翻译成 "[1, 2, 3]" 会更好(这就是 Python 所做的)。当然,== 的大部分疯狂都来自隐式转换(如果 === 作为“默认”比较,Javascript 会更好),但是 array->string 规则增加了一些额外的怪异。
【解决方案2】:

JS 执行 type coercion 要么 type conversion ,这意味着当在一个表达式中同时使用两种不同的数据类型时,我们会得到一个“等价”类型。

示例

我们知道truefalse 是布尔值,而不是数字。 但是我们仍然可以将它们用作数字,因为由于类型强制,true == 1false == 0

并不是说我使用的是==,而不是===

同样,我们可以这样做:

var a = 123;
var b = a + 1;     // 124
var c = a + true;  // 124
var d = a + '1';   // 1231

在你的情况下,你正在强制一个 aray 和一个字符串。并且 JS 引擎将数组强制转换为字符串类型:

var a = [1,2,3]
console.log(a)              // [1, 2, 3]
console.log(a + '')         // "1,2,3"
console.log('{' + a + '}')  // "{1,2,3}"

【讨论】:

    【解决方案3】:

    Javascript 非常灵活,不幸的是,在这种情况下,我们理解它非常灵活。那么下面的代码发生了什么

    console.log('{' + test + '}');
    

    test 是一个Array 对象,但是当您尝试将它与另一个字符串组合时,JavaScript 会看到所有内容都是字符串,在这种情况下,test 将被转换为string,test。 转换方式如Array.prototype.toString()。 弱比较也是一样的(==)。所以我们可以使用技巧比较(===)来避免这种情况

    【讨论】:

      【解决方案4】:

      那是因为,当你这样做时:'' + test;你会得到字符串:string,test

      对于Array对象,如果与任意字符串结合,将转换为格式为:element1,element2,element3的字符串

      【讨论】:

        猜你喜欢
        • 2022-12-23
        • 2016-02-15
        • 2018-01-13
        • 2014-01-28
        • 1970-01-01
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多