Skip to content

Commit 8b454a8

Browse files
committed
更新js-lab
1 parent 72757fe commit 8b454a8

28 files changed

+13719
-0
lines changed

array.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// const people = [
2+
// {
3+
// name: "Matt",
4+
// age: 27
5+
// },
6+
// {
7+
// name: "Nicholas",
8+
// age: 29
9+
// }
10+
// ];
11+
// console.log(people.find((element, index, array) => element.age < 28));
12+
// // {name: "Matt", age: 27}
13+
// console.log(people.findIndex((element, index, array) => element.age < 28));
14+
// // 0
15+
16+
// console.log(people.find((element, index, array) => element.age == 28));
17+
// // undefined
18+
// console.log(people.findIndex((element, index, array) => element.age == 28));
19+
// // -1
20+
let arr = new Array(10);
21+
console.log("arr:",arr);
22+
arr = new Array({
23+
id:1
24+
},{
25+
my_id:2
26+
})
27+
console.log("arr:",arr);

arraybuffer.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// 创建长度为 8 的 int16 数组
2+
const container = new Int16Array(8);
3+
// 把定型数组复制为前 4 个值
4+
// 偏移量默认为索引 0
5+
container.set(Int8Array.of(1, 2, 3, 4));
6+
console.log(container); // [1,2,3,4,0,0,0,0]
7+
// 把普通数组复制为后 4 个值
8+
// 偏移量 4 表示从索引 4 开始插入
9+
container.set([5,6,7,8], 4);
10+
console.log(container); // [1,2,3,4,5,6,7,8]
11+
// 溢出会抛出错误
12+
container.set([5,6,7,8], 7);
13+
// RangeError

class_test/base.js

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const private_map = new WeakMap();
2+
const Observer = require("./observer");
3+
class Base {
4+
initInternalObj(type,configs){
5+
let me = this;
6+
const interalObj = Object.assign({
7+
"type":type
8+
},configs);
9+
const proxy = new Proxy(interalObj,{
10+
get(obj_self,key,self){
11+
me.getObserver().fireEvent("read","reading event testing");
12+
console.log(`Getting ${key}'s value`);
13+
return Reflect.get(obj_self,key,self);
14+
},
15+
set(obj_self,key,newValue,self){
16+
me.getObserver().fireEvent("write","writing event testing");
17+
console.log(`Setting ${key}'s value to ${newValue}`);
18+
return Reflect.set(obj_self,key,newValue,self);
19+
}
20+
});
21+
return proxy;
22+
}
23+
on(eventName,fn){
24+
this.getObserver().addListener(eventName,fn);
25+
}
26+
constructor(type,configs) {
27+
this.idProperty = {
28+
id:Symbol("id")
29+
};
30+
this.initObserver();
31+
this.init(this.initInternalObj(type,configs));
32+
}
33+
initObserver(){
34+
let observer ={
35+
"observer":Symbol("observer")
36+
};
37+
private_map.set(observer,new Observer(this));
38+
this.getObserver = function(){
39+
return private_map.get(observer);
40+
};
41+
}
42+
initProperty(configs){
43+
private_map.set(this.idProperty,configs);
44+
}
45+
set(key,val){
46+
let property = private_map.get(this.idProperty);
47+
property[key] = val;
48+
}
49+
get(key){
50+
return private_map.get(this.idProperty)[key];
51+
}
52+
init(configs){
53+
this.initProperty(configs);
54+
}
55+
56+
}
57+
module.exports = Base;

class_test/observer.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Observer{
2+
events = new Map();
3+
target = null;
4+
constructor(belong){
5+
this.id = Symbol(belong);
6+
this.target = belong;
7+
}
8+
//事件添加函数
9+
addListener(eventName,fn){
10+
let same_events = this.events.get(eventName)?this.events.get(eventName):[],
11+
setFlag = same_events.length === 0;
12+
same_events.push(fn);
13+
setFlag&&this.events.set(eventName,same_events);
14+
}
15+
fireEvent(eventName,...args){
16+
let same_events = this.events.get(eventName)?this.events.get(eventName):[],
17+
argsArray = [eventName].concat(args);
18+
if(!this.target){
19+
throw new Error("Oberviser can not be using while property target is null.");
20+
}
21+
if(same_events.length !== 0){
22+
this.doFireEvent(same_events,argsArray);
23+
}
24+
}
25+
doFireEvent(events,args){
26+
let eventFns = events.values();
27+
for(let fn of eventFns){
28+
fn.apply(this.target,args);
29+
}
30+
}
31+
}
32+
module.exports = Observer;
33+
// console.log(new Oberviser().target);

class_test/test.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const Base = require('./base');
2+
let t = new Base("test",{
3+
test:"测试ing"
4+
});
5+
6+
t.on("read",function(arg1,arg2){
7+
console.log("测试读监听器:",arguments,arg1,arg2);
8+
});
9+
t.on("write",function(arg1,arg2){
10+
console.log("测试写监听器:",arguments,arg1,arg2);
11+
});
12+
console.log(t.get("test"));
13+
t.set("demo","heihei");
14+
console.log(t.get("demo"));
15+
// let d = function(){
16+
// console.log(this,arguments);
17+
// };
18+
// // d(1,Array.prototype.slice.call(["t","a"], 0));
19+
// d.apply({
20+
// "ceshi":"测试"
21+
// },[1,"2",'t'])
22+

generator.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
function* test() {
2+
let i = 0;
3+
while (true) {
4+
yield i = i + 1;
5+
return 3;
6+
}
7+
}
8+
9+
const generator = test();
10+
11+
// console.log(generator.next()); // 输出 1
12+
// console.log(generator.next()); // 输出 2
13+
// console.log(generator.next()); // 输出 3
14+
15+
function* generatorFn(){}
16+
17+
let foo = {
18+
*generate() {
19+
yield;
20+
console.log("1");
21+
}
22+
}
23+
// console.log(foo.generate());
24+
foo.generate();
25+
console.log(foo.generate().next().done);

map.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
let m = new Map();
2+
// m = 1;
3+
let arr = [1,4,5,6];
4+
let m1 = new Map([
5+
['a',1],
6+
['b',2]
7+
]);
8+
let m2 = new Map(arr.entries());
9+
console.log(m);
10+
console.log(m1);
11+
console.log(m2);
12+
console.log(m.has(undefined),m.get(undefined));
13+
console.log(m1.has(undefined),m1.get(undefined));
14+
console.log(m2.has(undefined),m2.get(undefined));
15+
16+
17+
m.set(m1,m2);
18+
let a = function(){
19+
console.log(1)
20+
};
21+
m.set(function(){
22+
console.log(1)
23+
},arr);
24+
m.set(a,arr);
25+
console.log(m);
26+
console.log(m.get(m1));
27+
console.log(m.get(function(){
28+
console.log(1)
29+
}));
30+
console.log(m.get(a));
31+
arr = [7,8,9];
32+
console.log(m.get(a));
33+
m1.delete('a');
34+
console.log(m1,m.get(m1))
35+
m.clear();

my_poxy.js

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// // 构建一个新的对象类型Object的构造器,以达到proxy的效果,无需递归拦截
2+
class MyProxy {
3+
constructor(obj) {
4+
let map = new Map();
5+
this._map = map;
6+
this.init(obj, map);
7+
// let proxy = this.createProxy(map, obj);
8+
// return proxy;
9+
}
10+
init(obj, map) {
11+
for (let prop in obj) {
12+
// console.log(prop)
13+
this.def(obj,'_obj_',this);
14+
// if (typeof obj[prop] === 'object') {
15+
// map.set(prop, Object.assign({}, obj[prop]));
16+
// this.init(obj[prop], map);
17+
// } else {
18+
// map.set(prop, obj[prop]);
19+
// }
20+
}
21+
}
22+
def(obj, key, val, enumerable) {
23+
Object.defineProperty(obj, key, {
24+
value: val,
25+
enumerable: !!enumerable,
26+
writable: true,
27+
configurable: true
28+
});
29+
}
30+
createProxy(map, obj) {
31+
for (let prop in obj) {
32+
33+
// if (typeof obj[prop] === 'object') {
34+
// obj[prop] = this.createProxy(map,obj[prop]);
35+
// // console.log(map.get(prop));
36+
// }
37+
Object.defineProperty(obj, prop, {
38+
get() {
39+
console.log(`obj${obj.toString()}/prop:${prop} => ${map.get(prop)}`)
40+
return map.get(prop);
41+
}
42+
});
43+
}
44+
return obj;
45+
}
46+
}
47+
let temp = new MyProxy({
48+
a: {
49+
b: {
50+
c: 1
51+
}
52+
}
53+
});
54+
// let obj = {
55+
// 'a': {
56+
// 'b': {
57+
// 'c' : 1
58+
// }
59+
// }
60+
// };
61+
// function observe(obj) {
62+
// if (obj !== null && typeof obj === 'object') {
63+
// Object.keys(obj).forEach(key => {
64+
// let internalValue = obj[key];
65+
// observe(internalValue); // 递归调用observe,处理内部对象
66+
// Object.defineProperty(obj, key, {
67+
// get() {
68+
// console.log(`Getting property: ${key}`);
69+
// return internalValue;
70+
// },
71+
// set(newValue) {
72+
// console.log(`Setting property: ${key} with value: ${newValue}`);
73+
// internalValue = newValue;
74+
// }
75+
// });
76+
// });
77+
// }
78+
// return obj;
79+
// }
80+
81+
// obj = observe(obj);
82+
83+
// // console.log(obj.a.b); // 输出: Getting property: a, Getting property: b,然后输出: 1
84+
// // obj.a.b = 2; // 输出: Setting property: b with value: 2
85+
// console.log(obj.a.b.c); // 输出: Getting property: a, Getting property: b,然后输出: 2
86+
87+
// function def(obj, key, val, enumerable) {
88+
// Object.defineProperty(obj, key, {
89+
// value: val,
90+
// enumerable: !!enumerable,
91+
// writable: true,
92+
// configurable: true
93+
// });
94+
// }
95+
// def(obj,'_obj_',"a");
96+
// console.log(obj)

object.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// var obj = {
2+
// "name": "test"
3+
// };
4+
// console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
5+
// Object.defineProperty(obj,"name",{
6+
// writable:false,
7+
// value:"can't write"
8+
// });
9+
// console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
10+
// console.log("1:",obj.name);
11+
// obj.name = "test";
12+
// console.log("2:",obj.name);
13+
// Object.defineProperty(obj,"name",{
14+
// configurable:false,
15+
// value:"can't delete"
16+
// });
17+
// console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
18+
// delete obj.name;
19+
// console.log("3:",obj.name);
20+
console.log(1+true)
21+
console.log("1"+0.1);
22+
let str = "hello";
23+
let str_num = "2";
24+
let num = 40;
25+
let bol = true;
26+
console.log(str+num);
27+
console.log(str_num+num);
28+
console.log(str_num+bol);
29+
console.log(str+bol);
30+
console.log(num+bol);
31+
console.log(str>bol,str_num>bol);
32+
console.log(str>num,str_num>num);

object_lab/create_obj.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// function createPerson(name, age, job) {
2+
// let o = new Object();
3+
// o.name = name;
4+
// o.age = age;
5+
// o.job = job;
6+
// o.sayName = function() {
7+
// console.log(this.name);
8+
// };
9+
// return o;
10+
// }
11+
// let person1 = createPerson("Nicholas", 29, "Software Engineer");
12+
// let person2 = createPerson("Greg", 27, "Doctor");
13+
// person1.sayName();
14+
// person2.sayName();
15+
function Person(name, age, job){
16+
this.name = name;
17+
this.age = age;
18+
this.job = job;
19+
this.sayName = function() {
20+
console.log(this.name);
21+
};
22+
}
23+
// let person1 = new Person("Nicholas", 29, "Software Engineer");
24+
// let person2 = new Person("Greg", 27, "Doctor");
25+
// person1.sayName(); // Nicholas
26+
// person2.sayName(); // Greg
27+
// window.sayName();
28+
let o = new Object();
29+
Person.call(o, "Kristen", 25, "Nurse");
30+
// o.sayName(); // "Kristen"
31+
let test = function(){
32+
this.sayName();
33+
console.log(arguments);
34+
}
35+
test.call(o,"s");

0 commit comments

Comments
 (0)