javaScript关于call的基础问题

cocotsau 2016-06-10 09:46:23
是这样的,我想给json对象扩展一个forEach方法,于是有了下面这段代码,功能是实现了,但是最后有个问题比较诡异,我想应该是出在call上面(代码第11行),在控制台打印,把函数体给输出来了。请大神帮忙看看,谢谢!

if (!Object.prototype.forEach) {
Object.prototype.forEach = function(fn) {
if ({}.toString.call(this) != "[object Object]") {
throw new TypeError();
}
if (typeof fn != "function") {
throw new TypeError();
}
for (var key in this) {
if(key in this){
fn.call(this, this[key], key, this);
//执行回调函数,并传入参数:值、索引、对象
}
}
}
}

var obj = {"a": 1,"b": 2};

obj.forEach(function(a,b,c){
console.log(a,b,c);
/*
1 "a" Object {a: 1, b: 2}
2 "b" Object {a: 1, b: 2}
-----------------------------------------------------------
//为什么会打印出函数体来?
function (fn) {
if ({}.toString.call(this) != "[object Object]") {
throw new TypeError();
}
if (typeof fn != "function") {
throw new TypeError();
}
for (var key in this) {
if(key in… "forEach" Object {a: 1, b: 2}
*/
})
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cocotsau 2016-06-10
  • 打赏
  • 举报
回复
引用 5楼天际的海浪 的回复:
更好的办法是把这个自定义的forEach属性设置为不可枚举的。不过要IE9才支持 Object.defineProperty(Object.prototype, "forEach", {enumerable:false});
嗯嗯好的,我再去试试,这应该是ECMA5的新方法吧?
天际的海浪 2016-06-10
  • 打赏
  • 举报
回复
更好的办法是把这个自定义的forEach属性设置为不可枚举的。不过要IE9才支持 Object.defineProperty(Object.prototype, "forEach", {enumerable:false});
cocotsau 2016-06-10
  • 打赏
  • 举报
回复
引用 3 楼 jslang 的回复:
for...in 循环除了遍历对象本身的所有可枚举属性。还会遍历从它的构造函数的 prototype 继承而来的所有可枚举属性。 你在Object.prototype对象上自定义了forEach属性,这个自定义的forEach属性是可枚举的,所有 Object 的实例对象用for...in 循环都会枚举出这个属性。这等于是对js系统的一种污染。 如果你只要考虑对象本身的属性,而不是它的原型,那么使用 hasOwnProperty() 来确定某属性是否是对象本身的属性
		for (var key in this) {
			if(this.hasOwnProperty(key)){
				fn.call(this, this[key], key, this);
				//执行回调函数,并传入参数:值、索引、对象
			}
		}
非常感谢,明白了。改成这个hasOwnProperty()就好使了,可以支持到IE6
天际的海浪 2016-06-10
  • 打赏
  • 举报
回复
for...in 循环除了遍历对象本身的所有可枚举属性。还会遍历从它的构造函数的 prototype 继承而来的所有可枚举属性。 你在Object.prototype对象上自定义了forEach属性,这个自定义的forEach属性是可枚举的,所有 Object 的实例对象用for...in 循环都会枚举出这个属性。这等于是对js系统的一种污染。 如果你只要考虑对象本身的属性,而不是它的原型,那么使用 hasOwnProperty() 来确定某属性是否是对象本身的属性
		for (var key in this) {
			if(this.hasOwnProperty(key)){
				fn.call(this, this[key], key, this);
				//执行回调函数,并传入参数:值、索引、对象
			}
		}
0拓0 2016-06-10
  • 打赏
  • 举报
回复
第9行,遍历对象属性的时候,会将添加的forEach函数也遍历出来。 所以会打印函数体
cocotsau 2016-06-10
  • 打赏
  • 举报
回复
@天际的海浪 大神请指点
这个是完整源码 python FastAPI实现 vue 深度学习 大模型 【深度学习毕业设计】基于BERT的电商商品评论情感分析系统(PyTorch+FastAPI+Vue3) 模型微调训练 深度学习毕业设计 python课程设计 完整版 源码+sql脚本+论文 完整版 数据库是mysql 随着电子商务规模持续扩大,商品评论已成为消费者决策与商家改进产品的重要依据。海量评论文本具有口语化、领域词汇密集、正负情感交织等特点,传统基于词典或浅层机器学习的情感分析方法难以充分刻画上下文语义,分类精度受到限制。针对上述问题,本文设计并实现了一套基于 BERT 的电商商品评论情感分析系统,完成从评论采集、模型推理、结果存储到可视化分析的闭环。 系统采用前后端分离架构。后端以 Python 语言和 FastAPI 框架构建 RESTful 接口,使用 SQLAlchemy 访问 MySQL 8 数据库 db_bert_sentiment,核心推理模块基于 PyTorch 与 Transformers 加载中文 BERT 微调模型 BertForSequenceClassification,对评论进行 1 至 5 星五分类,并映射为正面、中性、负面三类情感;当微调模型文件缺失时自动回退到电商情感词典规则引擎,保证系统可用性。前端采用 Vue3、Vite、Element Plus、Pinia 与 ECharts 实现管理端界面,支持单条实时分析、CSV 批量导入、评论维护、统计分析、模型管理、个人中心和操作日志等功能。 在数据库设计方面,系统围绕管理员、评论、分析任务、模型信息、情感关键词和操作日志六类实体建立概念模型,给出独立的实体属性图与实体间关系图,并以表格形式详细列出各表字段名称、类型、长度、是否为空及备注。测试表明,系统能够稳定完成登录鉴权、情感推理、批量任务与多维图表展示,B
内容概要:本文提出了一种基于角蜥蜴优化算法(Harris Hawks Optimization-inspired Lizard Search Algorithm, HLOA)优化BP神经网络的风电功率预测模型,旨在解决传统BP神经网络在风电功率预测中易陷入局部最优、收敛速度慢、预测精度不高等问题。通过HLOA算法对BP网络的初始权重和阈值进行全局优化,提升了模型的泛化能力与训练效率。研究在Matlab平台上完成算法实现,并采用真实风电场数据进行实验验证,结果表明,相较于标准BP及其他优化算法(如GA、PSO)优化的模型,HLOA-BP模型在均方根误差(RMSE)、平均绝对误差(MAE)等关键评价指标上表现更优,具有更强的预测稳定性和准确性。该方法为可再生能源领域的时间序列预测提供了有效的技术路径与实践参考。; 适合人群:具备机器学习、智能优化算法及电力系统基础知识的研究生、科研人员以及从事新能源预测、电力调度等相关工作的工程技术人员。; 使用场景及目标:①提升风电功率预测精度,支撑电网安全稳定运行与能源调度决策;②学习并掌握智能优化算法与神经网络融合建模的方法论;③开展基于Matlab的仿真实验、算法对比与性能评估;④拓展应用于光伏发电、负荷预测等其他非线性时间序列预测任务。; 阅读建议:建议结合提供的Matlab代码深入实践,重点理解HLOA算法的搜索机制及其对BP网络参数的优化过程,通过更换数据集、调整参数配置等方式进行消融实验与对比分析,全面掌握模型构建与调优技巧,进而将其迁移至实际工程项目中应用。

87,986

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧