当前位置: 首页 > news >正文

媒体查询、事件绑定、对象拷贝等知识点总结

一、媒体查询(CSS3 响应式设计)

1. 基本语法

css

@media 媒体类型 and (媒体特性) { /* CSS 规则 */ }

2. 常用媒体类型

说明
screen电脑屏幕、平板、手机等
print打印机
all所有设备(默认)

3. 常用媒体特性

特性说明
max-width最大宽度(≤ 该值)
min-width最小宽度(≥ 该值)
orientation: portrait竖屏
orientation: landscape横屏

4. 正确使用方式

css

/* 方式一:从小到大(移动优先) */ body { background: white; } @media (min-width: 768px) { body { background: pink; } } @media (min-width: 1024px) { body { background: purple; } } /* 方式二:从大到小(桌面优先) */ body { background: purple; } @media (max-width: 1023px) { body { background: pink; } } @media (max-width: 767px) { body { background: white; } }

5. 关键原则

max-width表示“≤ 该宽度时生效”,多个媒体查询同时满足时,后定义的会覆盖前定义的。


二、事件绑定(DOM 事件处理)

1. 事件三要素

要素说明示例
事件源触发事件的元素btn
事件类型触发条件clickmouseenter
事件处理程序执行的操作function() {...}

2. 事件绑定的三种方式

方式一:HTML 事件处理程序(不推荐)

html

<button οnclick="alert('点击')">按钮</button>
方式二:DOM 0 级事件处理程序

javascript

btn.onclick = function() { ... }; // 解绑 btn.onclick = null;

特点:简单,但同一事件只能绑定一个处理程序

方式三:DOM 2 级事件处理程序(标准推荐)

javascript

// 绑定 btn.addEventListener('click', function() { ... }); // 解绑(需传入相同函数) btn.removeEventListener('click', handler);

特点:可绑定多个处理程序,更灵活

3. 批量绑定与作用域问题

javascript

// ❌ 错误示例:使用 var for (var i = 0; i < imgs.length; i++) { imgs[i].onclick = function() { console.log(i); // 始终输出 imgs.length } } // ✅ 正确示例 1:使用 let(ES6) for (let i = 0; i < imgs.length; i++) { imgs[i].onclick = function() { console.log(i); // 正确输出 0,1,2... } } // ✅ 正确示例 2:使用闭包(ES5 兼容写法) for (var i = 0; i < imgs.length; i++) { imgs[i].onclick = (function(index) { return function() { console.log(index); } })(i); }

4. 原理说明

  • var:函数作用域,循环结束后变量值统一为最终值

  • let:块级作用域,每次循环创建独立变量

  • 闭包:通过立即执行函数创建独立作用域保存当前值


三、对象的拷贝与访问

1. 数据类型分类

类型存储方式示例
基本类型栈内存,存值numberstringbooleannullundefinedsymbol
引用类型栈内存存地址,堆内存存值objectarrayfunction

2. 浅拷贝

定义

只拷贝对象的第一层属性,对于引用类型属性,只拷贝内存地址(新旧对象共享该引用)

实现方式

javascript

// 方式一:for...in 循环 for (let k in obj) { o[k] = obj[k]; } // 方式二:Object.assign() let o = Object.assign({}, obj); // 方式三:扩展运算符 let o = { ...obj };
特点

javascript

let obj = { a: 1, b: { c: 2 } }; let o = { ...obj }; o.b.c = 3; console.log(obj.b.c); // 3(被改变,会联动)

3. 深拷贝

定义

递归拷贝所有层级,新旧对象完全独立,互不影响

实现方式

方式一:递归函数(你笔记中的方法)

javascript

function deepCopy(newObj, oldObj) { for (let k in oldObj) { let item = oldObj[k]; if (item instanceof Array) { newObj[k] = []; deepCopy(newObj[k], item); } else if (item instanceof Object) { newObj[k] = {}; deepCopy(newObj[k], item); } else { newObj[k] = item; } } }

方式二:JSON 方法(简单场景)

javascript

let o = JSON.parse(JSON.stringify(obj));

⚠️限制:会忽略undefinedfunctionsymbol,不能处理循环引用

4. 浅拷贝 vs 深拷贝对比表

对比维度浅拷贝深拷贝
拷贝层级仅第一层所有层级
引用类型处理复制地址递归创建新对象
与原数据关系嵌套数据会联动完全独立
性能较低
适用场景对象结构简单对象结构复杂且需完全独立

四、对象属性访问

1. 两种访问方式

方式语法特点
点语法obj.property简洁,但属性名必须为合法标识符且固定
方括号语法obj["property"]obj[variable]灵活,支持变量、表达式、特殊字符

2. 必须使用方括号的场景

javascript

// 1. 属性名包含特殊字符 obj["first-name"]; obj["user age"]; // 2. 属性名是变量 let key = "name"; obj[key]; // 3. 动态遍历属性 for (let k in obj) { obj[k]; // 必须用方括号 } // 4. 属性名是表达式 obj["a" + "b"];

3. Object.keys() 和 Object.values()

方法返回值示例
Object.keys(obj)属性名组成的数组['name', 'age']
Object.values(obj)属性值组成的数组['张三', 18]
Object.entries(obj)键值对数组[['name','张三'], ['age',18]]

javascript

// 常用遍历模式 Object.keys(obj).forEach(key => { console.log(key, obj[key]); });

4. 点语法 vs 方括号记忆要点

点语法:属性名已知且符合命名规范时使用
方括号:属性名动态、含特殊字符或为变量时使用


五、综合对比速查表

知识点关键概念注意事项
媒体查询max-widthmin-width注意样式覆盖顺序
事件绑定三要素、批量绑定循环中使用let或闭包解决作用域问题
浅拷贝只拷贝第一层引用类型属性会联动
深拷贝递归拷贝所有层JSON 方法有局限性
属性访问点语法 vs 方括号动态属性名必须用方括号

六、典型面试题

1. 浅拷贝和深拷贝的区别?

浅拷贝只复制对象的第一层属性,引用类型属性复制的是内存地址,修改会影响原对象;深拷贝递归复制所有层级,新对象与原对象完全独立。

2. for 循环中绑定事件为什么全部输出相同值?如何解决?

因为var没有块级作用域,循环结束后变量为最终值。解决方法:使用let或闭包。

3.obj.keyobj[key]有什么区别?

点语法后面必须跟固定的属性名字面量;方括号内可以是变量、表达式,支持特殊字符属性名,更灵活。

4. 如何判断数据类型以实现深拷贝?

使用instanceof判断ArrayObject,注意nullArraytypeof都返回'object',需特殊处理。

http://www.jsqmd.com/news/568529/

相关文章:

  • 如何评估SEO代码优化工具的效果和性价比
  • 苏州沃虎电子(VOOHU)10/100M集成式RJ45连接器SYT111B002BA2A1D产品介绍
  • 别再只画框了!用YOLOv8实时获取物体中心坐标,5行代码搞定视觉追踪第一步
  • 首选蘑兔 AI!4 款 AI 音乐工具精选
  • ArxRobot库详解:3DoT机器人嵌入式C++控制框架
  • 乙巳马年春联生成终端企业应用:商场新年IP互动大屏部署案例
  • 4个维度解析Steam Achievement Manager:开源工具如何重塑游戏成就管理体验
  • SAP开发运维必备:手把手教你用传输请求(Transport Request)跨系统搬运程序和数据字典
  • Greasy Fork终极指南:三步掌握浏览器增强神器,提升10倍上网效率
  • 联发科MT8385芯片方案
  • 让 AI 听懂业务、直接干活:销售易 NeoAgent 2.0 的三大跃迁
  • Go AI 生态实战:从单机 RAG 到分布式智能服务架构演进
  • Gitee团队协作实战:从零到一掌握项目协同开发流程
  • 无需公网 IP!手把手教你把内网 Serv-U 文件服务映射到外网,远程访问超简单
  • 【STM32F103标准库开发】DMA+USART双剑合璧:实战环形缓冲区与空闲中断解析
  • 5步掌握Meld:让文件对比与差异合并效率提升80%
  • MediaPipe人脸检测避坑指南:如何优化检测精度与性能(含模型选择建议)
  • 用C语言手搓一个表达式语法检查器:从文法定义到算符优先表实战
  • 智能表格在敏捷项目管理中的工时统计实践
  • 从需求到代码:基于快马ai快速构建stm32智能家居环境控制实战项目
  • 解决宝可梦存档管理难题的全能工具:让跨世代精灵收藏变得轻松无忧
  • 如何自学使用关键字排名软件_关键字排名软件与SEO有什么关系
  • 从T5到万亿参数:保姆级拆解Switch Transformers的并行策略(DP/MP/EP混合实战)
  • CentOS部署PHP项目完整步骤
  • 特朗普政府发布《国家人工智能立法框架》,多维度布局AI领域
  • 别再手动敲命令了!用PyCharm自带功能一键创建Linux桌面快捷方式(附手动配置备份方案)
  • RAG的真相!别再被“知识库外挂”骗了,这才是让AI Agent真正“聪明”的关键!
  • BEAST 2完整指南:如何利用贝叶斯方法进行生物进化分析
  • 浙江润鑫 STW-18 轮轴重检测仪:匠心打造,让每一组轮轴重数据都精准可靠
  • FunASR Docker部署SSL配置的四个‘天坑’与避坑指南(附完整启动命令)