为甚么要加上;{quot;};是否从数组中删除括号?(JavaScript)
例如:为甚么要加上;{quot;};是否从数组中删除括号?(JavaScript),javascript,arrays,string,object,Javascript,Arrays,String,Object,例如: var test = []; test.push( 'string', 'test'); //[ 'string', 'test' ] console.log('{' + test + '}'); // {string,test} console.log(typeof('{' + test + '}')); //string 为什么添加{和}会从测试中删除括号?我本来希望第三行的结果是{[string,test]}原因是在创建Javascript时做出了许多错误的选择,现在由于向后兼容
var test = [];
test.push( 'string', 'test'); //[ 'string', 'test' ]
console.log('{' + test + '}'); // {string,test}
console.log(typeof('{' + test + '}')); //string
为什么添加
{
和}
会从测试中删除括号?我本来希望第三行的结果是{[string,test]}
原因是在创建Javascript时做出了许多错误的选择,现在由于向后兼容而修复已经太晚了
转换为字符串的数组成为转换为字符串的元素的串联,由逗号分隔,无需包装[
]
标记
例如,这就是
(1 == [1])
在Javascript中是否为true
(两者具有不同的类型,并且它们到字符串的转换是相同的),以及定义
var a = [1], b = 1, c = [[1]];
表情
(a == b && b == c && a != c)
也是
正确的
这是因为,当您这样做时:''+test
;您将获得字符串:string,test
对于数组
对象,如果它与任何字符串组合,它将被转换为以下格式的字符串:element1、element2、element3
或
,这意味着当一个表达式中同时使用两种不同的数据类型时,我们将得到一种“等效”类型
例子
我们知道true
和false
是布尔值,而不是数字。
但我们仍然可以将它们用作数字,因为由于类型强制,true==1
和false==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}"
Javascript非常灵活,不幸的是,在这种情况下,我们可以理解它非常灵活。那么在下面的代码中会发生什么呢
console.log('{' + test + '}');
test是一个数组
对象,但当您尝试将它与另一个字符串组合时,JavaScript将看到所有内容都是字符串,在这种情况下,test
将转换为string,test
。
转换方式类似于。
弱比较也是一样(
==
)。因此,我们可以使用技巧比较(=
)来避免这样的情况只尝试console.log(''+test)
-数组的字符串表示形式没有括号。+
标点符号重载。它可能意味着,也可能意味着。哪个是基于上下文的。'+test
将test
强制为字符串:test.toString()
给出相同的结果。JS是一种类型非常松散的语言。在涉及不同类型的操作中,将自动执行从对象到基本体(如字符串或布尔)的类型强制。在这种特殊情况下,Array.prototype.toString()
函数忽略了外括号,而与String.prototype.split(“,”)
相反。为什么在创建JavaScript时,数组的字符串表示形式是由逗号分隔的元素值是一个错误的选择?在将数组转换为字符串时,是否有更好的默认选项可以实现?@nnnnnn:[1,2,3]
被翻译成“[1,2,3]”
会更好(Python就是这么做的)。当然,==
的大多数疯狂之处都来自隐式转换(如果将==
作为“默认”比较,Javascript会更好),但是数组->字符串规则增加了一些额外的怪异之处。