Ну, нет никакой потребности звонить .Name.ToString()
, но широко который является об этом, да. Единственное соображение, в котором Вы, возможно, нуждались бы, состоит в том, должен ли x.Foo.Bar
возвратить "Нечто", "Панель" или исключение - т.е. сделать необходимо выполнить итерации вообще.
(комментарий ре) для больше на гибкой сортировке, см. здесь .
Для 100 точек
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
var getEscUnicode = function(str) {
var ret = "";
for(var j = 0; j < str.length; j++) {
var temp = parseInt(str.charCodeAt(j)).toString(16).toUpperCase();
for(var i=0; i < 5 - temp.length; i++) {
temp = "0" + temp;
}
ret = ret + "\\u" + temp;
}
return ret;
}
for(var i = 0; i < args.length; i++) {
results[args[i]] = eval(getEscUnicode(args[i]));
}
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
Я могу придумать только один способ достичь этого, и даже этот способ полагается на оба - устаревший вызываемый . вызывающий
и уже фиксированная особенность FF eval
, которая может выполнять код в контексте указанной функции.
Что интересно, я думаю, что eval
был "исправлен" до того, как было введено расширение function ({...}) {}
, но я не совсем уверен.
Я немного сократил тестовый пример, но, конечно, сохранил реальную идею.
Сначала я попытался получить доступ к аргументам
у самого вызывающего, но это похоже на
ссылается на тот же объект, что и аргументы
в контексте функции; null
объект аргументов по существу уничтожил объект, на который также ссылается свойство arguments
.
Я также думал об исключении строки стека из объекта ошибки (чтобы получить тестовые
значения), но это ничего не решило бы, поскольку тестовые значения являются объектами, а не примитивами.
(function () {
function mySolution () {
var test = arguments = null;
return eval('test', (function(){ return arguments.callee.caller; })());
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL");
})();
Протестировано: ПРОЙДЕН в FireFox 3.0.13! Я "обманул", изменив прототип объекта:
<html>
<head>
<title></title>
<script>
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
Object.prototype._hasOwnProperty = Object.prototype.hasOwnProperty;
Object.prototype.hasOwnProperty =
function(prop) {
results[prop] = this[prop];
return this._hasOwnProperty(prop);
}
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
</script>
</head>
<body>
<!-- Put the body of your page below this line -->
<!-- Put the body of your page above this line -->
</body>
</html>
Это считается? Я думаю, что это не так. = p
Ага! На этот раз я нашел ответ получше. (Я должен признать, что я получил общую идею из ответа kangax). Протестировано PASS в FF 3.0.13:
<html>
<head>
<title></title>
<script>
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
var o = eval('arguments', mySolution)[0];
for(var prop in o) {
results[prop] = o[prop];
}
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
</script>
</head>
<body>
<!-- Put the body of your page below this line -->
<!-- Put the body of your page above this line -->
</body>
</html>
Попытка №3; снова протестировал PASS в FF 3.0.13
<html>
<head>
<title></title>
<script>
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
var o = mySolution[0];
for (var prop in o) {
results[prop] = o[prop];
}
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
</script>
</head>
<body>
<!-- Put the body of your page below this line -->
<!-- Put the body of your page above this line -->
</body>
</html>
Пробовал много способов. Вид сдался. Но если вы не можете сломать систему, измените систему. МОЕ решение:
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
/********** MY SOLUTION STARTS ******************/
return null;
}
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// new function does not prohbit reference to arguments and the test object
//var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
for(var i =0; i < args.length; i++) {
results[args[i]] = arguments[0][args[i]];
}
/********** MY SOLUTION ENDS ******************/
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
(function () {
function mySolution ({ var, this, function, if, return, true }) {
// prohbit reference to arguments and the test object
var test = arguments = null, args = ['var', 'this', 'function', 'if', 'return','true'], results = {};
//LAME...
};
mySolution=function(a){var results=a;
//LAME...
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {} }, results = mySolution(test), pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop]) pass = false;
alert(pass ? "PASS" : "FAIL") }());