js中new 一个对象发生了啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中new 一个对象发生了啥?相关的知识,希望对你有一定的参考价值。
参考技术A 最近在面试的时候,都会被问到在js中,new 一个实例的过程,比如 :
定义了一个函数Person,里面有三个属性:name,age,sex;当var lisi = new Person() 的时候发生了以下4件事:
1. var obj= ,创建了一个空对象 obj, 也就是开辟了一块内存地址,新建了一个对象实例(我是这样认为的,如果有不对的欢迎指出);
2. obj.__proto__ = Person.prototype ; 将 lisi 这个空对象的 __proto__ 指向 Person 的 prototype ,也就是设置原型链;
3. var result = Person.call(obj) ,改变this的指向,让this指向 obj 对象 ;
4。判断Person的返回值类型,如果是引用类型,则返回这个引用类型的对象,如果是普通值类型,就返回obj;
现在来看看打印出的内容:
可以看出lisi这个实例对象的构造函数是Person。
对于每个未发送到后续函数的循环值。这里发生了啥?节点.js
【中文标题】对于每个未发送到后续函数的循环值。这里发生了啥?节点.js【英文标题】:For each loop value not being sent to subsequent function. What is happening here? Node.js对于每个未发送到后续函数的循环值。这里发生了什么?节点.js 【发布时间】:2021-03-25 11:15:22 【问题描述】:我已经在这个项目上工作了三天,我几乎可以理解我所做的一切以及为什么一个值会引发错误,但是在这段代码中:
function updateStats()
const users = readFile('users','txt','UTF-8');
users.forEach((v) =>
console.log(v);
var user = v.toString();
const statFile = readFile(user,'txt','UTF-8');
readHTTP(v,currentChannel,statFile[0]);
);
抛出错误:
I am doing my 15 minutes update
610636905440215071
677257430249242655
539899963568553986
525819952708583427
373982165307752460
Error: ENOENT: no such file or directory, open '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'
at Object.openSync (fs.js:476:3)
at Object.readFileSync (fs.js:377:35)
at readFile (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:98:25)
at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:214:26
at Array.forEach (<anonymous>)
at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'
C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215
readHTTP(v,currentChannel,statFile[0]);
^
TypeError: Cannot read property '0' of undefined
at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215:43
at Array.forEach (<anonymous>)
at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)
我假设它与函数结构有关,但我的其他 foreach 循环在这种语法中运行得很好。有人可以帮忙调试一下吗?
编辑: 读取文件:
function readFile(fileName,fileType,fileFormat)
try
const data = fs.readFileSync('/Users/codel/OneDrive/Documents/BattlEye/files/'+fileName+'.'+fileType, fileFormat);
const lines = data.split(/\r?\n/);
return lines;
catch (err)
console.error(err);
读取HTTP:
function readHTTP(user,cc,userID)
const puppeteer = require('puppeteer');
var url= 'https://r6.tracker.network/profile/pc/' + userID;
(async() =>
const browser = await puppeteer.launch();
const page = await browser.newPage();
try
await page.goto(url);
catch(error)
cc.send('You did not enter a valid Ubisoft UserID');
const data = await page.evaluate(() =>
return Array.from(document.querySelectorAll('.trn-defstat__value'))
.map(item => item.innerText);
);
writeStatFile(user,userID,data);
console.log("Personal stats file was written");
)();
前两天刚学了这门语言,但是值并没有通过for each循环传递给后面的函数。
【问题讨论】:
它似乎无法读取文件users
,因此您无法在users
上运行forEach()。检查您尝试读取的文件名。
@Ozgur Sar 我添加了带有完整日志的编辑。它读取 users.txt,但在搜索 user.txt 文件时,未发送该值。完整的日志显示 console.log(v) 正在输出我需要的值。
请贴出readFile
(也可能是readHTTP
)的代码,否则我们无能为力。
使用调试器检查v
/user
的值是多少。我敢打赌:你的 users.txt
以换行符结尾,最后一个 v
是空字符串。
@Bergi 我认为你是对的。我阅读文件的方式与分割每一行有关。你是对的。这只是一个未被捕获的空白。
【参考方案1】:
错误号:-4058, 系统调用:'打开', 代码:'ENOENT', 路径:'/Users/codel/OneDrive/Documents/BattlEye/files/.txt'
寻找异步问题的一个很好的理由。
试试这个:
const promises = require('fs').promises
const updateStats = async () =>
try
const users = await promises.readFile('users.txt', encoding: 'utf8');
for (let user of users.split("\n"))
const statFile = await promises.readFile(user.toString() + '.txt', encoding: 'utf8');
if(statFile && statFile[0])
readHTTP(user,currentChannel,statFile[0]);
catch(err)
console.error(err.toString())
不确定这是否可行,因为我没有时间测试它。
真的希望这会有所帮助:)
【讨论】:
【参考方案2】:几乎可以肯定,users.txt
中有一个空换行符
我会做以下事情:
function updateStats()
const users = readFile('users','txt','UTF-8');
users.forEach((v) =>
if (v === '') return
console.log(v);
var user = v.toString();
const statFile = readFile(user,'txt','UTF-8');
readHTTP(v,currentChannel,statFile[0]);
);
【讨论】:
以上是关于js中new 一个对象发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章
在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?