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

刷题 | 牛客 - js中等题-下(更ing)30/54知识点解答

知识点汇总:

数组:

Array.prototype.pop():从数组末尾删除一个元素并返回这个元素。

Array.prototype.shift():从数组开头删除一个元素并返回这个元素。

array.reverse()将数组元素反转顺序

array.join()将数组 拼接成字符串。


JS30 回文字符串

描述

请补全JavaScript代码,要求以Boolean的形式返回参数字符串是否为回文字符串。


法一: array.pop() + array.shift()

取数组的前和后的字符做对比

            const _isPalindrome = string => {// 补全代码// 法四:let str = string.split('');while(str.length > 1){if(str.pop()!=str.shift()){return false;}}return true;}

法二:字符串访问(字符串索引访问)

// 前后字符相等,如何取到第一个字符,和最后一个字符let len = string.lengthfor(let i = 0;i < len/2; i++){if(string[i] != string[len-i-1]){return false;}}return true;

法三:数组反转【正序 array.join() 和 倒序 array.reverse().join()】

// 法三:// 字符串转数组并拼接,对比 从前往后 和 从后往前(倒过来),是否相等。let oldArr = string.split('').join()let newArr = string.split('').reverse().join();if(oldArr === newArr){return true;}return false;

 法四:前后指针

        // 法四:let left = 0;let right = string.length - 1;while(left<right){// 相等 则继续;不相等 则返回falseif(string[left] === string[right]){left++;right--;}else{return false;}}return true;

知识点:

Array.prototype.pop():从数组末尾删除一个元素并返回这个元素。

Array.prototype.shift():从数组开头删除一个元素并返回这个元素。

array.reverse()将数组元素反转顺序

array.join()将数组 拼接成字符串。

.join()  ,不写,则用 逗号 , (默认分隔符)拼接;

.join(’‘) ,传入 ''(空字符串),那么元素之间不会加任何符号,会直接拼接起来。


JS31 Proxy计数器

描述

请补全JavaScript代码,请给参数对象添加拦截代理功能,并返回这个代理,要求每当通过代理调用该对象拥有的属性时,"count"值加1,否则减1。


法一:

            let count = 0const _proxy = object => {// 补全代码// 法一:let proxy = new Proxy(object, {get: function(target, propKey){// has:检查属性是否存在if(propKey in target){count++;}else{count--;}}})return proxy;}

★🧠 知识点 —— Proxy代理

Proxy代理,es6的新特性,用于创建对象的代理,可以在对象的访问 操作被执行时 进行 拦截 或 自定义处理。

是元编程工具,可以在不修改原对象下,控制其行为

语法:

const proxy = new Proxy(target, handler);

  • target:你要代理的原始对象
  • handler:一个对象,里面定义了拦截操作的方法(称为“捕捉器”或“陷阱” trap)。
Reflect 的作用:在 handler 中,使用 Reflect 是为了以更一致、更安全的方式调用原始操作,比如:

Reflect.get(target, prop, receiver) <----> target[prop]

Reflect.set(target, prop, value, receiver) <------> target[prop] = value

Reflect.get(target, prop, receiver) // 等价于 target[prop] 
Reflect.set(target, prop, value, receiver) // 等价于 target[prop] = value
✅ Proxy代理的 典型应用场景
  1. 数据监控(如 Vue2 的响应式原理)

  2. 访问权限控制

  3. 属性校验(比如类型检查)

  4. 自动记录日志(如访问次数)

  5. 默认值处理

 

📚 常用拦截方法(Trap)

拦截方法说明
get读取属性时触发
set写入属性时触发
has使用 in 操作符时触发
deleteProperty使用 delete 删除属性时触发
ownKeys使用 Object.keys()for...in 等操作时触发
defineProperty使用 Object.defineProperty() 时触发
getOwnPropertyDescriptor使用 Object.getOwnPropertyDescriptor() 时触发

1. Proxy(被代理的对象,处理方法)

  • Proxy(target, handler)代理一个对象handler 里可以定义 拦截的行为(如 get、set)。

2. get(要代理的对象,读取的属性,)

get(target, prop, receiver):当你访问 proxy.prop 时,get 被触发

3. Reflect.get(...)

  • 用来返回实际的属性值,相当于 target[prop],但更安全、更规范。

例子:

1. get 和 set:访问和修改属性
   const proxy = new Proxy(obj, {get(target, prop, receiver){console.log(`读取了属性${prop}`);count++;return Reflect.get(target, prop, receiver);        // 安全地返回原属性},set(target, prop, value, receiver){console.log(`设置属性"${prop}"为${value}`);return Reflect.set(target, prop, value, receiver);   // 安全地设置值}});console.log(proxy.name);        // 触发 getproxy.age = 18;                        // 触发 set
2. has:检查属性是否存在
const proxy = new Proxy({ a: 1}, {has(target, prop){console.log(`判断"${prop}"是否在对象中`);return prop in target;}
})
console.log('a' in proxy);
3. deleteProperty: 删除属性
const proxy = new Proxy({ name: 'Tom'}, {deleteProperty(target, prop){console.log(`删除属性"${prop}"`);return Reflect.deleteProperty(target, prop);}
})
delete proxy.name;
http://www.lryc.cn/news/2385637.html

相关文章:

  • RAM(随机存取存储器)的通俗解释及其在路由器中的作用
  • 六、【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架
  • 【项目需求分析文档】:在线音乐播放器(Online-Music)
  • C++ 前缀和数组
  • PHP 实现通用数组字段过滤函数:灵活去除或保留指定 Key
  • NACOS2.3.0开启鉴权登录
  • 细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐
  • 快速上手Linux火墙管理
  • [创业之路-375]:企业战略管理案例分析 - 华为科技巨擘的崛起:重构全球数字化底座的超级生命体
  • 【paddle】常见的数学运算
  • AI基础知识(05):模型提示词、核心设计、高阶应用、效果增强
  • 分布式事务之Seata
  • 推测解码算法在 MTT GPU 的应用实践
  • Axure酒店管理系统原型
  • 写实交互数字人在AI招聘中的应用方案
  • C++中IO类(iostream、fstream和sstream)知识详解和应用
  • Spring Boot中如何对密码等敏感信息进行脱敏处理
  • React从基础入门到高级实战:React 基础入门 - JSX与组件基础
  • 房贷利率计算前端小程序
  • 在Visual Studio中进行cuda编程
  • Fastrace:Rust 中分布式追踪的现代化方案
  • Linux云计算训练营笔记day13【CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM】
  • 黑马Java基础笔记-15
  • Elasticsearch简单集成java框架方式。
  • 【RAG文档切割】从基础拆分到语义分块实战指南
  • stream数据流
  • 利用 XML 外部实体注入(XXE)读取文件和探测内部网络
  • 软件设计师“排序算法”真题考点分析——求三连
  • Visual Studio 2019/2022:当前不会命中断点,还没有为该文档加载任何符号。
  • vue--ofd/pdf预览实现