JavaScript:猜测密码

时间:2016-12-08 03:29:34

标签: javascript regex node.js

我在互联网上找到的另一个JavaScript问题,但我无法弄清楚它是如何工作的。问题基本上是问什么是密码。密码不依赖于外部资源,并且不会随时间变化(不取决于当前日期或时间)。此外,问题是只有一个正确的密码。我是JavaScript begginer,所以如果这是一个简单的标准面试问题,我道歉。这是功能:

Function

起初,这对我来说并不难,因为一切都是开放的,所以我可以一行一行地跟踪代码并弄清楚它是如何工作的。好的,据我所知,在检查功能的第一行,他们检查密码是否是一个字符串(为什么?它可以是其他的吗?)。然后,如果我理解正则表达式,他们检查脚本是否只包含小字母(或者我错了?)。所以,现在我知道我知道它必须只包含字母。之后,他们执行一些我无法完全理解的奇怪的正则表达式。在我看来,这个正则表达式将匹配整个字符串,为什么他们加入它?

然后他们反向字符串并通过一个空数组连接(它与正常的反转字符串相同或者是什么?)。在try block之后,我无法理解发生了什么? ++1..a构造函数实际上在这里做了什么? $(document).ready(function() { var object1 = { a: 1, b: 2, c: 3 }; var object2 = { a: 'a', b: 2, c: 'c'}; var r = $.extend(object1 , object2 ); var r2 = $.extend(true, object1 , object2 ); console.log(r); console.log(r2); }); 是什么意思?我只是想知道如何处理这样的问题?

1 个答案:

答案 0 :(得分:2)

我会直接跳到关键线:

Function('\'' + a + '\';++1..a')();

它创建然后立即执行一个新函数,其函数体设置从那个奇怪的字符串中设置。如果变量a'abcde',那么新函数的主体将是:

'\'' + 'abcde' + '\';++1..a'

就像有这个功能:

function() {
  'abcde';++1..a
}

或者有一些空白:

function() {
  'abcde';
  ++1..a
}

请注意,第一行的字符串是根据a变量中的内容动态设置的,但++1..a部分是硬编码的。

现在,注意到该函数在try/catch()块内,如果新函数运行没有错误,那么checkPassword()将返回false,但如果新函数崩溃checkPassword() }返回true。换句话说,根据a变量的字符串中的内容,预计该动态函数的行为将变为崩溃。

那么,在函数的第一行,什么字符串本身可以改变函数的行为?只有一种可能性,那就是(悬停以显示扰流板):

  

'use strict' ...必须输入密码'tcirtsesu',因为该功能的前几行是.match().reverse()

考虑到这一点,++1..a部分的作用并不重要,但它基本上采用.a的{​​{1}}属性,即1 ,并尝试增加它,... ...

  

是严格模式下的错误,但不是非严格模式。

为了完整起见,对这些内容作了非常简短的解释:

undefined

a = (a.match(/^.{6}|.+/g) || []).join(({} + {})[7]); a = [...a].reverse().join([] + []); 函数返回一个数组。 .match()匹配前六个字符或任意数量的字符,这意味着/^.{6}|.+/g返回"abcdefghijkl".match(/^.{6}|.+/g)。然后["abcdef", "ghijkl"]基本上只是一个空格字符,因为({} + {})[7]是字符串{} + {}。所以该行基本上在第六个字符后插入一个空格。

"[object Object][object Object]"行然后反转结果。