有人可以解释为什么文件[“写”]有效吗?

时间:2014-03-20 19:58:30

标签: javascript

我今天正在帮助对一个javascript片段进行去混淆,并且很惊讶地发现了这个:

document["write"]('obfuscated code here');

"写"也被混淆了,使得理解代码的意图稍微困难一些。

我之前从未见过将文档视为数组,我很好奇这是如何/为什么这样做的。还有其他可以以类似方式调用的函数吗?

4 个答案:

答案 0 :(得分:3)

document是一个Javascript对象(不是数组)。可以通过点(parent.child)或下标(parent['child'])语法访问对象字段。

您可以自己尝试一下:

var myObject = {
  field: 'hello!'
}

console.log(myObject['field']);
console.log(myObject.field);

当您的字段名称不是有效的Javascript标识符时,下标语法很有用:

var myObject = {
  'my-field': 'hello!'
}

console.log(myObject['my-field']);     // Works as expected
console.log(myObject.my-field);        // ReferenceError
console.log(myObject.'my-field');      // SyntaxError

请参阅MDN docs on property accessors

答案 1 :(得分:2)

因为您可以将对象键作为['key']以及.key来访问。 "类"在javascript中只是对象。

请考虑以下事项:

var foo = {
    bar: function() {
        alert('We are here!');
    }
};

foo.bar(); //The bar key of the object accessed using .key
foo['bar'](); //The bar key of the object accessed using ['key']

答案 2 :(得分:2)

因为document是javascript中的一个对象,一个DOM对象。 在javascript中,可以使用object.property或object [' property']

来访问属性。

所以你可以把它写成

document.write(...);

OR

document['write'](...);

答案 3 :(得分:2)

在处理对象时,有两种表示法:dot(.)和array([])。两者都将访问以点或命名

命名的属性

所以,如果你有像

这样的东西
var obj = {
  someproperty:"something",
  somefunction:function(){}
};

obj.somepropertyobj["someproperty"]都会使用该名称引用对象的属性。

这当然也适用于数组,除非您不能使用点表示法来访问元素,因为数组只是对象。

var arr = [2,1,3];
console.log(arr[1])
arr["sort"]();
console.log(arr)

但是,您无法通过点表示法访问数组的元素

arr.1

会抛出错误