题目链接:请点击

抓取到发布日热度的值,计算所有值的加和

1.分析网页

由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中【Preserve log】

我们点击页码进行翻页,发现数据来源于。

对其进行分析,又发现熟悉的参数 m.

这次我们使用fiddler抓包工具。

我们可以看到第一次请求中返回了一段混淆过的js代码,我们对其进行处理。

将其复制到 ob混淆专解测试版V0.1

需要注意不要

得到结果:

2.分析js代码:

我们发现关键函数:

   function W(Y, Z) {
document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
location["reload"]();
} function X(Y, Z) {
return Date["parse"](new Date());
} W(X());

w()函数定义了两个形参,而执行的函数w(x());是传一个参数的 ,这个参数就是x的返回值。

【 document["cookie"] 】,我想大家已经明白了,Cookie是如何被设置的了

而后面的【 location"reload"; 】,非常关键

这行代码的意思就是:刷新当前文档,也就是按了一下浏览器上的刷新页面按钮

现在我们重新理一下思路

  1. 发送请求返回了两个响应
  2. 第一个没有Cookie,而第二个有Cookie
  3. 第一个虽然没有Cookie,但是却执行了一段JS代码
  4. 这段JS代码给网页中的Cookie赋了值,接着刷新了整个页面
  5. 最后,呈现在我们眼前的网页,也就是reload的结果。

3.分析cookie如何生成

document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";

可以看到这里使用了m函数

    function M(Y, Z) {
var a2 = B(this, function () {
var a5 = function () {
var a6 = a5["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
return !a6["test"](a2);
}; return a5();
});
a2();
K();
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
}

首先,我们可以看到函数里面还包含着两个函数分别是【 a4() 】和【 K() 】

而这个【 a4() 】函数,也定义在M()内,但是执行【 a4() 】函数的时候,并没有传入参数,所以说,这段代码是没用的

在分析K函数:

    function K(Y, Z) {
if (Z) {
return J(Y);
} return H(Y);
}

需要传入参数,而执行的时候,又没有传入,所有这段代码也是是没用的

我们简化一下M()函数

function M(Y, Z) {
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
}

我们可以看到又出现了eval函数,做这第一道题的时候,我们知道eval可以间接的改变一些值。

L函数:

function L(Y, Z) {
let a0 = ""; for (let a1 = 0; a1 < Y["length"]; a1++) {
a0 += String["fromCharCode"](Y[a1]);
} return a0;
}

这个函数实际上并没什么用,挖坑操作。

继续往下看

        try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}

这段也是忽悠的东西global没有直接进入catch环节, return navigator["vendorSub"];

我们发现依旧是空值。

4.结果

var navigator = {};
var B = function () {
var Y = true;
return function (Z, a0) {
var a1 = Y ?
function () {
if (a0) {
var a2 = a0["apply"](Z, arguments);
a0 = null;
return a2;
}
}
: function () {};
Y = false;
return a1;
};
}
(); function C(Y, Z) {
var a0 = (65535 & Y) + (65535 & Z);
return (Y >> 16) + (Z >> 16) + (a0 >> 16) << 16 | 65535 & a0;
} function D(Y, Z) {
return Y << Z | Y >>> 32 - Z;
} function E(Y, Z, a0, a1, a2, a3) {
return C(D(C(C(Z, Y), C(a1, a3)), a2), a0);
} function F(Y, Z, a0, a1, a2, a3, a4) {
return E(Z & a0 | ~Z & a1, Y, Z, a2, a3, a4);
} function G(Y, Z, a0, a1, a2, a3, a4) {
return E(Z & a1 | a0 & ~a1, Y, Z, a2, a3, a4);
} function H(Y, Z) {
let a0 = [99, 111, 110, 115, 111, 108, 101];
let a1 = ""; for (let a2 = 0; a2 < a0["length"]; a2++) {
a1 += String["fromCharCode"](a0[a2]);
} return a1;
} function I(Y, Z, a0, a1, a2, a3, a4) {
return E(Z ^ a0 ^ a1, Y, Z, a2, a3, a4);
} function J(Y, Z, a0, a1, a2, a3, a4) {
return E(a0 ^ (Z | ~a1), Y, Z, a2, a3, a4);
} function K(Y, Z) {
if (Z) {
return J(Y);
} return H(Y);
} function L(Y, Z) {
let a0 = ""; for (let a1 = 0; a1 < Y["length"]; a1++) {
a0 += String["fromCharCode"](Y[a1]);
} return a0;
} function M(Y, Z) {
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
} function N(Y, Z) {
Y[Z >> 5] |= 128 << Z % 32,
Y[14 + (Z + 64 >>> 9 << 4)] = Z; if (qz) {
var a0,
a1,
a2,
a3,
a4,
a5 = 1732584193,
a6 = -271733879,
a7 = -1732584194,
a8 = 271733878;
} else {
var a0,
a1,
a2,
a3,
a4,
a5 = 0,
a6 = -0,
a7 = -0,
a8 = 0;
} for (a0 = 0; a0 < Y["length"]; a0 += 16)
a1 = a5,
a2 = a6,
a3 = a7,
a4 = a8,
a5 = F(a5, a6, a7, a8, Y[a0], 7, -680876936),
a8 = F(a8, a5, a6, a7, Y[a0 + 1], 12, -389564586),
a7 = F(a7, a8, a5, a6, Y[a0 + 2], 17, 606105819),
a6 = F(a6, a7, a8, a5, Y[a0 + 3], 22, -1044525330),
a5 = F(a5, a6, a7, a8, Y[a0 + 4], 7, -176418897),
a8 = F(a8, a5, a6, a7, Y[a0 + 5], 12, 1200080426),
a7 = F(a7, a8, a5, a6, Y[a0 + 6], 17, -1473231341),
a6 = F(a6, a7, a8, a5, Y[a0 + 7], 22, -45705983),
a5 = F(a5, a6, a7, a8, Y[a0 + 8], 7, 1770010416),
a8 = F(a8, a5, a6, a7, Y[a0 + 9], 12, -1958414417),
a7 = F(a7, a8, a5, a6, Y[a0 + 10], 17, -42063),
a6 = F(a6, a7, a8, a5, Y[a0 + 11], 22, -1990404162),
a5 = F(a5, a6, a7, a8, Y[a0 + 12], 7, 1804603682),
a8 = F(a8, a5, a6, a7, Y[a0 + 13], 12, -40341101),
a7 = F(a7, a8, a5, a6, Y[a0 + 14], 17, -1502882290),
a6 = F(a6, a7, a8, a5, Y[a0 + 15], 22, 1236535329),
a5 = G(a5, a6, a7, a8, Y[a0 + 1], 5, -165796510),
a8 = G(a8, a5, a6, a7, Y[a0 + 6], 9, -1069501632),
a7 = G(a7, a8, a5, a6, Y[a0 + 11], 14, 643717713),
a6 = G(a6, a7, a8, a5, Y[a0], 20, -373897302),
a5 = G(a5, a6, a7, a8, Y[a0 + 5], 5, -701558691),
a8 = G(a8, a5, a6, a7, Y[a0 + 10], 9, 38016083),
a7 = G(a7, a8, a5, a6, Y[a0 + 15], 14, -660478335),
a6 = G(a6, a7, a8, a5, Y[a0 + 4], 20, -405537848),
a5 = G(a5, a6, a7, a8, Y[a0 + 9], 5, 568446438),
a8 = G(a8, a5, a6, a7, Y[a0 + 14], 9, -1019803690),
a7 = G(a7, a8, a5, a6, Y[a0 + 3], 14, -187363961),
a6 = G(a6, a7, a8, a5, Y[a0 + 8], 20, 1163531501),
a5 = G(a5, a6, a7, a8, Y[a0 + 13], 5, -1444681467),
a8 = G(a8, a5, a6, a7, Y[a0 + 2], 9, -51403784),
a7 = G(a7, a8, a5, a6, Y[a0 + 7], 14, 1735328473),
a6 = G(a6, a7, a8, a5, Y[a0 + 12], 20, -1926607734),
a5 = I(a5, a6, a7, a8, Y[a0 + 5], 4, -378558),
a8 = I(a8, a5, a6, a7, Y[a0 + 8], 11, -2022574463),
a7 = I(a7, a8, a5, a6, Y[a0 + 11], 16, 1839030562),
a6 = I(a6, a7, a8, a5, Y[a0 + 14], 23, -35309556),
a5 = I(a5, a6, a7, a8, Y[a0 + 1], 4, -1530992060),
a8 = I(a8, a5, a6, a7, Y[a0 + 4], 11, 1272893353),
a7 = I(a7, a8, a5, a6, Y[a0 + 7], 16, -155497632),
a6 = I(a6, a7, a8, a5, Y[a0 + 10], 23, -1094730640),
a5 = I(a5, a6, a7, a8, Y[a0 + 13], 4, 681279174),
a8 = I(a8, a5, a6, a7, Y[a0], 11, -358537222),
a7 = I(a7, a8, a5, a6, Y[a0 + 3], 16, -722521979),
a6 = I(a6, a7, a8, a5, Y[a0 + 6], 23, 76029189),
a5 = I(a5, a6, a7, a8, Y[a0 + 9], 4, -640364487),
a8 = I(a8, a5, a6, a7, Y[a0 + 12], 11, -421815835),
a7 = I(a7, a8, a5, a6, Y[a0 + 15], 16, 530742520),
a6 = I(a6, a7, a8, a5, Y[a0 + 2], 23, -995338651),
a5 = J(a5, a6, a7, a8, Y[a0], 6, -198630844),
a8 = J(a8, a5, a6, a7, Y[a0 + 7], 10, 1126891415),
a7 = J(a7, a8, a5, a6, Y[a0 + 14], 15, -1416354905),
a6 = J(a6, a7, a8, a5, Y[a0 + 5], 21, -57434055),
a5 = J(a5, a6, a7, a8, Y[a0 + 12], 6, 1700485571),
a8 = J(a8, a5, a6, a7, Y[a0 + 3], 10, -1894986606),
a7 = J(a7, a8, a5, a6, Y[a0 + 10], 15, -1051523),
a6 = J(a6, a7, a8, a5, Y[a0 + 1], 21, -2054922799),
a5 = J(a5, a6, a7, a8, Y[a0 + 8], 6, 1873313359),
a8 = J(a8, a5, a6, a7, Y[a0 + 15], 10, -30611744),
a7 = J(a7, a8, a5, a6, Y[a0 + 6], 15, -1560198380),
a6 = J(a6, a7, a8, a5, Y[a0 + 13], 21, 1309151649),
a5 = J(a5, a6, a7, a8, Y[a0 + 4], 6, -145523070),
a8 = J(a8, a5, a6, a7, Y[a0 + 11], 10, -1120210379),
a7 = J(a7, a8, a5, a6, Y[a0 + 2], 15, 718787259),
a6 = J(a6, a7, a8, a5, Y[a0 + 9], 21, -343485441),
a5 = C(a5, a1),
a6 = C(a6, a2),
a7 = C(a7, a3),
a8 = C(a8, a4); return [a5, a6, a7, a8];
} function O(Y) {
var Z,
a0 = "",
a1 = 32 * Y["length"]; for (Z = 0; Z < a1; Z += 8)
a0 += String["fromCharCode"](Y[Z >> 5] >>> Z % 32 & 255); return a0;
} function P(Y) {
var a2,
a3 = []; for (a3[(Y["length"] >> 2) - 1] = undefined, a2 = 0; a2 < a3["length"]; a2 += 1)
a3[a2] = 0; var a1 = 8 * Y["length"]; for (a2 = 0; a2 < a1; a2 += 8)
a3[a2 >> 5] |= (255 & Y["charCodeAt"](a2 / 8)) << a2 % 32; return a3;
} function Q(Y) {
return O(N(P(Y), 8 * Y["length"]));
} function R(Y) {
var Z,
a0,
a1 = "0123456789abcdef",
a2 = ""; for (a0 = 0; a0 < Y["length"]; a0 += 1)
Z = Y["charCodeAt"](a0),
a2 += a1["charAt"](Z >>> 4 & 15) + a1["charAt"](15 & Z); return a2;
} function S(Y) {
return unescape(encodeURIComponent(Y));
} function T(Y) {
return Q(S(Y));
} function U(Y) {
return R(T(Y));
} function V(Y, Z, a0) {
M();
return Z ? a0 ? H(Z, Y) : y(Z, Y) : a0 ? T(Y) : U(Y);
} function W(Y, Z) {
var cookie = "m" + "=" + V(Y) + "|" + Y;
return cookie;
} function X(Y, Z) {
return Date["parse"](new Date());
} function get_cipher() {
return W(X());
}
# -*- coding: utf-8 -*-
'''
@Time : 2021/2/1 20:57
@Author : 水一RAR
''' import requests
import execjs
import time def get_cipher_value():
# 导入JS,读取需要的js文件
with open(r'js代码/02.js',encoding='utf-8',mode='r') as f:
JsData = f.read()
# 加载js文件,使用call()函数执行,传入需要执行函数即可获取返回值
psd = execjs.compile(JsData).call('get_cipher')
return psd def get_data(page_num,cipher):
url = f'http://match.yuanrenxue.com/api/match/2?page={page_num}'
headers = {
'Host': 'match.yuanrenxue.com',
'User-Agent':'yuanrenxue.project',
'Cookie':cipher
}
print(f'加密密文--->{cipher}')
response = requests.get(url,headers = headers)
return response.json() if __name__ == '__main__': sum_num = 0 for page_num in range(1, 6):
info = get_data(page_num, get_cipher_value())
price_list = [i['value'] for i in info['data']]
print(f'第{page_num}页发布日热度的值:{price_list}')
sum_num += sum(price_list)
time.sleep(1) print(f'发布日热度值总和:{sum_num}')

2.猿人学爬虫攻防第二题 JS 混淆 动态cookie的更多相关文章

  1. hook 无限debugger(猿人学第十四题)

    猿人学第十四题 检测太多了,debugger  fiddler替换无法实现.置空也不行.推荐使用hook  Function原生的构造 var func_ = Function.prototype.c ...

  2. python爬虫之快速对js内容进行破解

    python爬虫之快速对js内容进行破解 今天介绍下数据被js加密后的破解方法.距离上次发文已经过去半个多月了,我写文章的主要目的是把从其它地方学到的东西做个记录顺便分享给大家,我承认自己是个懒猪.不 ...

  3. 常见面试第二题之什么是Context

    今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...

  4. Python爬虫教程-16-破解js加密实例(有道在线翻译)

    python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...

  5. Python爬虫—破解JS加密的Cookie

    前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...

  6. 从0开始学爬虫3之xpath的介绍和使用

    从0开始学爬虫3之xpath的介绍和使用 Xpath:一种HTML和XML的查询语言,它能在XML和HTML的树状结构中寻找节点 安装xpath: pip install lxml HTML 超文本标 ...

  7. 第十四章 web前端开发小白学爬虫

    老猿从事IT开发快三十年了,接触互联网也很久了,但自己没有做过web前端开发,只知道与前端开发相关的一些基本概念,如B/S架构.html标签.js脚本.css样式.xml解析.cookies.http ...

  8. 猿人学web爬虫攻防大战

    这里有1.2.3.4.12.13.15题 1.第一题 import execjs import requests def get_response(): js_code = ""& ...

  9. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  10. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

随机推荐

  1. 第147天:免杀对抗-C2远控篇&C&C++&ShellCode定性分析&生成提取&Loader加载模式&编译执行

    https://blog.csdn.net/qq_29948489/article/details/136180966 #C2远控-ShellCode-认知&环境 1.创建工程时关闭SDL检查 ...

  2. k8s-部署

    目录 1 k8s 组件功能介绍 1.2 K8s 集群API: kube-apiserver 1.3 K8s 调度程序:kube-scheduler 1.4 K8s 控制器:kube-controlle ...

  3. OpenAI 发布适用于 .NET 库的稳定版本

    OpenAI 在 6 月发布测试版后发布了其官方 .NET 库的稳定版本.它以 NuGet 包的形式提供,支持 GPT-4o 和 GPT-4o mini 等最新模型,以及完整的 OpenAI REST ...

  4. 五行八字在线排盘api接口免费版_json数据格式奥顺互联内部接口

    「八字在线排盘」谁都想知道自己一生中的事业.财运.婚姻.功名.健康.性格.流年运程将是怎样,通过八字排盘,四柱八字排盘会有你想知道的答案.一个人出生的年月时天干地支的排列组合(即八字)就是命.不过仅凭 ...

  5. slab分配器正式被弃用,slub成为分配器唯一选择

    在使用slab分配器进行内存分配时,可能会出现以下缺点: 内存碎片化.由于slab分配器需要将内存分成大小相同的块,如果分配不均衡或者对象大小不同,就容易导致内存碎片化. 性能下降.Slab分配器将内 ...

  6. threejs - js库 gui 的使用 调试开发3D效果

    // 导入 threejs import * as THREE from "three"; import { OrbitControls } from "three/ex ...

  7. 什么是 Ajax,Ajax 的原理,Ajax 都有哪些优点和缺点

    ajax是异步的js和xml,是一种创建交互式网页的开发技术,是和服务器进行异步通讯的技术 : 核心就是使用XMLHttpRequest向服务器发送请求获取数据 : 优点: 页面不需要刷新,用户体验良 ...

  8. kotlin更多语言结构——>类型安全的构建器

    通过使用命名得当的函数作为构建器,结合带有接收者的函数字面值,可以在 Kotlin 中创建类型安全.静态类型 的构建器 类型安全的构建器可以创建基于 Kotlin 的适用于采用半声明方式构建复杂层次数 ...

  9. kotlin更多语言结构——>解构声明

    解构声明 有时把一个对象 解构 成很多变量会很方便,例如: val (name, age) = person 这种语法称为 解构声明 .一个解构声明同时创建多个变量.我们已经声明了两个新变量:name ...

  10. Android复习(三)清单文件中的元素

    <action> 向 Intent 过滤器添加操作. <activity> 声明 Activity 组件. <activity-alias> 声明 Activity ...