【问题标题】:How can an object be equal to an empty string?一个对象怎么可能等于一个空字符串?
【发布时间】:2023-03-06 04:33:01
【问题描述】:

当我注意到这个有趣的细节时,我正在使用 Google Apps Script API,如下面的代码所述

function testEmptyRange() {
  var range = SpreadsheetApp.getActive().getSheetByName("Sheet1").getDataRange();
  var values = range.getValues();
  Logger.log(values.length + " " + values[0].length);
  Logger.log((values[0][0] == "") + " " + typeof values[0][0]);
  Logger.log((values[0] == "") + " " + typeof values[0]);
  Logger.log((values == "") + " " + typeof values);
}

如果Sheet1 没有任何内容,则values1-by-1 2D array of Objects,实际上是一个包含空字符串的单元格。真正让我吃惊的是,both values values[0],类型为object,也等于空字符串。上述函数产生的日志是

[17-03-05 00:43:46:807 EST] 1 1
[17-03-05 00:43:46:807 EST] true string
[17-03-05 00:43:46:808 EST] true object
[17-03-05 00:43:46:808 EST] true object

我想解释一下为什么会这样。一个对象怎么可能等于空字符串?我意识到运算符== 与运算符=== 不同,如果我用后者替换前者,那么日志显示valuesvalues[0]false,这是更多我想,按照预期的行为。但这并不能解释为什么或如何在第一种情况下对象可以等于空字符串,我想了解这里发生了什么。

【问题讨论】:

  • Javascript 有automatic type conversion。这是一个可爱的功能,它允许一些聪明的行为,但这也意味着当你不知道会发生什么时,你可能会遇到麻烦。这对于相等比较来说尤其令人困惑,这就是为什么不鼓励 == 比较而支持严格的 === 比较,这不允许任何自动类型转换。至于你的场景,即使有类型转换 {} == '' 也应该是 false;你确定不是[] == ''

标签: javascript google-apps-script


【解决方案1】:

问题是,正如您所提到的,== 并不代表最严格的比较。 == 在经常失败的尝试中使用其参数的类型强制来为我们的程序员提供更多帮助。

== 的一个参数是字符串类型时,在比较两个值之前,另一个总是转换为字符串。因此,对于一个对象,JavaScript 引擎最终会做这样的事情:

  1. object == ""

  2. String(object) === ""

  3. object.toString() === ""

由于一个对象可以有任何你给它的toString 方法,这个比较的输出可能是true

编辑:查看上面anied 的评论并重新阅读您的示例代码,我发现valuesvalues[0] 实际上是数组 ,这是对象类型的一个特例。他们有一个toString 方法,用逗号将所有数组元素连接在一起,这意味着一个空数组[] 将被字符串化为""

示例:

var object = {
  toString: function () { return '' }
}

console.log(typeof object) //=> 'object'
console.log(object == "") //=> true


var array = []

console.log(typeof array) //=> 'object'
console.log(array == "") //=> true


var matrix = [
  ['']
]

console.log(typeof matrix) //=> 'object'
console.log(matrix == "") //=> true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2016-09-15
    • 2012-02-09
    相关资源
    最近更新 更多