5

我知道 jslint/jshint 不喜欢它,但我想知道做类似的事情是否有任何真正的问题。

var err = function(msg) { throw new Error(msg); };

示例 1:分配

var foo = bar.foo || baz.foo || err('missing foo property');

示例 2:验证

typeof foo['bar'] !== 'string' && err('bar has to be a string');

有什么我应该注意的问题吗?

4

5 回答 5

3

据我所知,这并没有比or die()PHP 更错误。运算符的短路性是明确定义的,因此只有在达到最后一种情况时才会抛出错误。

于 2012-11-01T16:47:43.667 回答
2

正如评论中所涵盖的那样,由于 JavaScript 对真实性的松散解释,很有可能出现意外行为,而真实性是上述逻辑运算符的驱动力。因此,短路方法在其中有用的条件子集是有限的,因此它不能提供一致的解决方案。

在给出的 2 个示例中,示例 2 是一个很好的应用程序,因为它是具有非常明确的输出的测试的可读应用程序。但是,如果任何尝试的值评估为在程序逻辑中可能有效的任何值,但从false语言的角度来看,示例 1 将导致问题。对这些类型的问题应用解决方案将有效地抵消语法可能提供的任何好处。针对这些类型问题的变化的解决方案可能不一致,因此这会增加在初始创建或任何后续修改时引入错误的风险。

于 2012-11-01T18:18:29.710 回答
1

要考虑的重要事项之一是与其他一些运算符的优先级和交互。放置不正确,或括号会以微妙且不易阅读的方式改变流程。否则,只要您确保预期的逻辑与快捷方式规则匹配,它就应该是安全的。当然,对于什么语言认为真正适用的常见问题也是如此。

于 2012-11-01T16:49:49.810 回答
1

好吧,如果您特别检查类型是否为string,那么您就错过了一个重点。原始类型字符串没有方法。

var s = 'something';
console.log(typeof s);// outputs string

var s = new String('something');// same text as above
console.log(typeof s);//outputs object

JavaScript 有一个称为自动装箱的功能。当您对以第一种方式声明的变量调用字符串方法时,它会自动从字符串切换到对象字符串,因此检查字符串的正确方法是:

isString = function (obj) { return toString.call(obj) === '[object String]';};

Triple equal(===) 用于快速避免未定义/空情况和常见的比较陷阱。

除此之外,你很好。在生产中,您还应该相应地记录错误并在调用 throw 函数时使用 try catch 块。

于 2012-11-01T16:55:01.697 回答
1

短路您在问题中显示的方式应该绝对没问题,并且 imo 优先于复杂的 if-else 语句(当然,您检查的主要条件首先应该是正确的,但这不是这里的主题)。除了看起来更优雅的代码之外,您实际上是从客户端必须下载的总数据中减少字节数,这总是好的。

于 2012-11-01T16:59:30.167 回答