Javascript怪异的比较结果

时间:2018-12-26 13:23:13

标签: javascript

我有两个用Javascript声明的字符串,如下所示:

var str1 = new String('Hello');
var str2 = 'Hello';

比较结果:

str1 == str2 // true
str1 === str2 // false

我的问题是,当两个字符串的值相等且具有相同的===类型时,为什么string产生 false

3 个答案:

答案 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