评估 "true && {}"是否涉及类型强制?

下面的代码是否涉及类型强制?

true && {}

我问这个问题,是因为为了使操作成功,对象实例被隐含地处理为不同的类型(布尔型)。而这似乎符合这个强制的定义 此处:

每个操作(函数、运算符等)都希望其参数具有一定的类型。如果一个值的参数没有正确的类型,调用者最常见的两个选项是:。

  1. 他们可以显式转换该值,使其具有正确的类型。 例如,在下面的交互中,我们想把两个用字符串写出来的数字相乘。

Number('3') * Number('2') // 6

  1. 他们可以让操作为他们进行转换。

'3' * '2' // 6

这种隐式转换被称为强制。

解决方案:

不,没有发生类型强制,因为你的表达式的左边已经是一个布尔值,而右边的AND只是返回。

输入你的 true && {} 表达式进入浏览器的控制台,你会看到它的值是由 Object. 这是因为只要前面的所有值都计算为 true,而OR运算符则 “短路”。如果左手边的运算结果是 false,返回右手边。

其他的例子有。

1 && 'Greets'
[] && Boolean && 'Again'

0 || 'Greets also'
NaN || null || 'Same here'

所有这些都返回最后一个值即表达式的最右边的值,在这个例子中,它的类型是: String.

人们经常使用(d)OR运算符的行为来定义ES2015之前的代码的 “默认参数”。

function incrementBy(value, by) {
  var _by = by || 1;
  return value + _by;
}

incrementBy(1); // -> 2
incrementBy(1, 1); // -> 2

如果只传递第一个参数,”默认” 1 而不是第二个参数。然而,它包含一个微妙的错误。如果调用者传递了错误的类型作为第二个参数, 结果就会被搞乱:

incrementBy(1, 'BOOM'); // -> '1BOOM'

如果两个操作符同时使用,就可以解决这个问题。

function incrementBy(value, by) {
  var _by = typeof by === 'number' && !isNaN(by) && by || 1;
  return value + _by;
}

前面提到的错误现在已经消失了。

incrementBy(1); // -> 2
incrementBy(1, 1); // -> 2
incrementBy(1, 'Boom'); // -> 2

给TA打赏
共{{data.count}}人
人已打赏
解决方案

从表中添加和删除多条记录

2022-5-13 14:00:20

解决方案

Python - 将数组浮动音频数据转换为wav文件。

2022-5-13 14:00:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索