矩阵具有无效字符

qwe*_*ymk 0 javascript canvas

我刚刚在HN上看到这个矩阵少于600字节

这是完整的来源:

<body style=margin:0 onload="for(s=window.screen,w=q.width=s.width,
    h=q.height=s.height,m=Math.random,p=[],i=0;i<256;p[i++]=1);
    setInterval('9Style=\'rgba(0,0,0,.05)\'9Rect(0,0,w,h)9Style=\'#0F0\';
    p.map(function(v,i){9Text(String.fromCharCode(3e4+m()*33),i*10,v);
    p[i]=v>758+m()*1e4?0:v+10})'.split(9).join(';q.getContext(\'2d\').fill'),33)">
    <canvas id=q>
Run Code Online (Sandbox Code Playgroud)

我的问题是变量的赋值如何以数字开头:setInterval('9Style=\'rgba(0,0,0,.05...)我认为js变量不能以数字开头.这不应该是无效的lhs(左手边)任务吗?

Lek*_*eyn 6

你是对的,标识符不能以数字开头.如果你仔细观察,9就会被替换为;q.getContext('2d').fill.

循环在设置变量中分解并创建一个p包含256 1s 的数组:

s = window.screen,
w = q.width = s.width,
h = q.height = s.height,
m = Math.random,
p = [];
for (i = 0; i < 256; p[i++] = 1);
Run Code Online (Sandbox Code Playgroud)

剩余:

setInterval(
    '9Style=\'rgba(0,0,0,.05)\'9Rect(0,0,w,h)9Style=\'#0F0\';p.map(function(v,i){9Text(String.fromCharCode(3e4+m()*33),i*10,v);p[i]=v>758+m()*1e4?0:v+10})'
    .split(9).join(';q.getContext(\'2d\').fill')
, 33)
Run Code Online (Sandbox Code Playgroud)

这变为:

setInterval(";q.getContext('2d').fillStyle='rgba(0,0,0,.05)';q.getContext('2d').fillRect(0,0,w,h);q.getContext('2d').fillStyle='#0F0';p.map(function(v,i){;q.getContext('2d').fillText(String.fromCharCode(3e4+m()*33),i*10,v);p[i]=v>758+m()*1e4?0:v+10})", 33);
Run Code Online (Sandbox Code Playgroud)

将此代码放在http://jsbeautifier.org/中会给出:

;
q.getContext('2d').fillStyle = 'rgba(0,0,0,.05)';
q.getContext('2d').fillRect(0, 0, w, h);
q.getContext('2d').fillStyle = '#0F0';
p.map(function (v, i) {;
    q.getContext('2d').fillText(String.fromCharCode(3e4 + m() * 33), i * 10, v);
    p[i] = v > 758 + m() * 1e4 ? 0 : v + 10
})
Run Code Online (Sandbox Code Playgroud)