我有两个用Javascript声明的字符串,如下所示:
var str1 = new String('Hello');
var str2 = 'Hello';
比较结果:
str1 == str2 // true
str1 === str2 // false
我的问题是,当两个字符串的值相等且具有相同的===
类型时,为什么string
产生 false ?
答案 0 :(得分:3)
您正在将字符串对象与原始字符串进行比较。那是两种不同的类型。
为清楚起见,这里是all JS types:
- 六种原始数据类型:
- 布尔值
- 空
- 未定义
- 号码
- 字符串
- 符号(ECMAScript 6中的新功能)
- 和对象
使用# vector of file names
my.files <- paste0(c(outer(LETTERS, 1:12, FUN = "paste0")),
".csv")
# for loop
for (i in seq_along(my.files)) {
df <- read.csv(my.files[i], sep= ",") # open
new_df <- wrap_frame(df, nr = 61, rownames = "", unique_names = FALSE) # mutate
write.csv(new_df, paste0("C:/users/Desktop/Data/", my.files[i]),
row.names = FALSE) # save
}
进行比较时,一个对象仅等于其自身(因此不等于原始值,也不等于另一个相同的对象)
使用===
进行比较时,EcmaScript遵循this procedure,它在String对象上调用==
方法。
通常没有理由显式地使用String对象(每次您的代码需要一个对象并传递一个字符串时,您都隐式使用它们,但是JS引擎会为您处理升级)。您应该几乎始终坚持使用原始字符串。
答案 1 :(得分:2)
因为
typeof new String('Hello') === 'object'
和
typeof 'Hello' === 'string'
前者是一个对象,后者是一个原始对象。
==
检查之所以有效,是因为String
对象也具有toString
方法,并且在这种情况下(以及与其他字符串连接时),JS会调用该方法。
答案 2 :(得分:0)
字符串对象不是原始字符串,因此使用if (@available(iOS 10, *)) {
passwordTextField.textContentType = UITextContentTypeStreetAddressLine2;
}
if (@available(iOS 12, *)) {
passwordTextField.textContentType = UITextContentTypeOneTimeCode;
}
将不会完全相等。
相反,如果您坚持使用===
,则可以使用===
函数,例如:
valueOf