码迷,mamicode.com
首页 > 编程语言 > 详细

那些短小精悍的&奇葩的&令人感到惊讶的JavaScript代码----更新中

时间:2018-01-28 22:01:07      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:logs   log   java   自己   with   javascrip   body   possible   js代码   

自学习前端以来,陆陆续续遇见很多短小令人惊讶的js代码,固有了专门开一片日记来记录这些神奇的代码的想法,目的还是以学习,观赏为主。

1.JavaScript中 (a ==1 && a== 2 && a==3) 可能为 true 吗?

来自Stack Overflow的一个问题:链接

国外面试题,Nothing is impossible.

解决方案1:
自定义 toString(或者 valueOf)方法,每次调用改变一次返回值,从而满足判断条件。

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

tostring()属于Object对象,当使用 == 时,如果两个参数的类型不一样,那么 JS 会尝试将其中一个的类型转换为和另一个相同。在这里左边对象,右边数字的情况下,会首先尝试调用 valueOf(如果可以调用的话)来将对象转换为数字,如果失败,再调用 toString。

第二个方法,有点像障眼法,=-=:

var a? = 1;
var a = 2;
var ?a = 3;
if(a?==1 && a== 2 &&?a==3) {
    console.log("Why hello there!")
}

注意在if语句(我从你的问题中复制)怪异的间距。 这是半角Hangul(即那些不熟悉的韩语),它是一个Unicode空格字符,不被ECMA脚本解释为空格字符 - 这意味着它是一个标识符的有效字符。 因此,有三个完全不同的变量,一个是在一个之后的Hangul,另一个是前一个,最后一个只有一个。 为了便于阅读,用_替换空格,相同的代码如下所示:

var a_ = 1;
var a = 2;
var _a = 3;
if(a_==1 && a== 2 &&_a==3) {
    console.log("Why hello there!")
}

哈哈哈,我一般还通过切换半角全角符号方便在Markdown里做段落的空格处理。

还有一种解决方法就是js的with语句,把对象的作用域的范围明确出来(听说with语句缓慢)

var i = 0;

with({
  get a() {
    return ++i;
  }
}) {
  if (a == 1 && a == 2 && a == 3)
    console.log("wohoo");
}

还有很多办法来解决这个,感兴趣自己可探究。

那些短小精悍的&奇葩的&令人感到惊讶的JavaScript代码----更新中

标签:logs   log   java   自己   with   javascrip   body   possible   js代码   

原文地址:https://www.cnblogs.com/zhangmingzhao/p/8372392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!