我在互联网上找到的另一个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);
});
是什么意思?我只是想知道如何处理这样的问题?
答案 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]"
行然后反转结果。