js基础call() apply(),argument(),date(),math()

这篇博客介绍了JavaScript中的函数方法call()和apply(),它们用于改变函数调用时的上下文。文章还讲解了arguments对象,展示了如何获取函数参数的长度。此外,博主讨论了Date对象的使用,包括获取和设置日期,以及math工具类的各种数学操作。最后,博主探讨了字符串的包装类,列举了一系列字符串操作方法。

call()和apply()
//这两个对象都是函数对象的方法,需要通过函数对象来调用
//apply()方法需要将实参封装到一个数组中统一传递
//arguments()方法
// arguments是实参的对象是一个类数组对象
//arguments.length获取实参的长度

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
		//call()和apply()
		//这两个对象都是函数对象的方法,需要通过函数对象来调用
		//apply()方法需要将实参封装到一个数组中统一传递
			function fun(){
				alert('我是fun函数');
				var obj ={
					name:'obj',
					sayName:function(){
						alert(this.name);
					}
			};
			
			};
			// fun.call(obj,2,3);
			// fun.apply(obj,[2,3]);
			
			//arguments()方法
			// arguments是实参的对象是一个类数组对象
			//arguments.length获取实参的长度
			function fun(){
				console.log(arguments.length);
			}
			fun('hello',true);
			
			
			
			//date对象在js中表示日期
			//输出当前时间
			// document.write(Date())
			//输出指定日期
			var d = new Date(2022,3,26,12,33,0);
			// document.write(d)
			d1 = d.getDate();//获取几号
			console.log(d1);
			d2 = d.getDay();//获取一周中的第几天
			console.log(d2);
			d3 = d.getMonth();//获取月份
			console.log(d3)
			d4 = d.getTime()//获取时间戳
			console.log(d4/1000/60/60/24/365);
			//设定日期
			var myDate = new Date();
			document.write(myDate.setDate(myDate.getDate()+5));//当前日期加5天
			
			
			
			//math工具类,属于一个工具类不需要创建可以直接用
			console.log(Math.round(4.7));
			// 常量有e,pi
			//abs计算一个数的绝对值
			console.log(Math.abs(-99));
			//向上求余
			console.log(Math.ceil(1.1));
			//向下求余
			console.log(Math.floor(1.9));
			//四舍五入
			console.log(Math.round(2.5));
			//最大数
			console.log(Math.max(1,2,344,567));
			//3的2次幂
			console.log(Math.pow(3,2));
			//随机数默认生成0-1之间的数字
			console.log(Math.random()*10);
			console.log(Math.floor(Math.random()*11));
			
			
			//包装类,有三个包装类,通过这3个包装类可以将基本数据类型转换成对象
			//字符串相关方法
			var str = 'hello atguigu';
			console.log(str[1]);//打印字符串的精确位置
			var res = str.charAt(0);
			console.log(res);//返回指定位置的字符
			rest = str.charCodeAt(1);//返回字符串编码
			console.log(rest);
			resu = String.fromCharCode(72);//返回unicode代表的字符串
			console.log(resu);
			resu = str.concat('嘿嘿嘿');//连接一个或者多个字符
			console.log(resu);
			resul = str.indexOf('h');//检索一个字符在一串字符中的位置
			console.log(resul);
			result =str.lastIndexOf('h');//检索一个字符在字符串的位置,反向
			console.log(result);
			result1 = str.split(',');//拆分字符串为数组,参数是分隔符
			console.log(result1);
			result2 = str.toUpperCase();//将字符串转化成大写字母
			console.log(result2);
			result3 = str.toLowerCase();//字符串转换成小写字母
		</script>
	</body> 
</html>

<think>我们正在讨论JavaScript的Reflect对象。根据引用内容,Reflect是ES6引入的一个内置对象,它提供了一系列静态方法来操作JavaScript对象,这些方法与Proxyhandler的方法一一对应。Reflect的设计目的是将一些对象操作从运算符(如delete、in)和Object方法中规范化,统一为函数式调用,使代码更加清晰和函数式风格。关键点:1.Reflect不是构造函数,不能使用new调用,所有方法都是静态的(类似Math对象)。2.Reflect的方法与Proxyhandler的方法一一对应,因此Reflect的方法通常用于Proxy的陷阱函数中作为默认行为。3.Reflect提供的方法与Object上的一些方法功能类似,但存在一些细微差别(例如,Reflect.defineProperty返回布尔值表示是否成功,而Object.defineProperty在失败时会抛出错误)。根据引用,我们可以总结Reflect的常用方法:-Reflect.apply(target,thisArgument,argumentsList):调用一个函数,等同于Function.prototype.apply.call(target,thisArgument,argumentsList)。-Reflect.construct(target,argumentsList[,newTarget]):类似于new操作符,等同于newtarget(...argumentsList),但可以指定新的原型(newTarget)。-Reflect.defineProperty(target,propertyKey,attributes):定义对象属性,返回布尔值表示是否成功(而Object.defineProperty返回修改后的对象,失败则抛出错误)。-Reflect.deleteProperty(target,propertyKey):删除对象属性,等同于deletetarget[propertyKey],返回布尔值表示是否删除成功。-Reflect.get(target,propertyKey[,receiver]):获取对象属性的值,receiver可以指定getter中的this。-Reflect.getOwnPropertyDescriptor(target,propertyKey):获取对象属性的描述符,等同于Object.getOwnPropertyDescriptor。-Reflect.getPrototypeOf(target):获取对象的原型,等同于Object.getPrototypeOf。-Reflect.has(target,propertyKey):判断对象是否具有某个属性,等同于propertyKeyintarget。-Reflect.isExtensible(target):判断对象是否可扩展,等同于Object.isExtensible。-Reflect.ownKeys(target):返回对象的所有自身属性(包括不可枚举属性和Symbol属性)组成的数组,等同于Object.getOwnPropertyNames与Object.getOwnPropertySymbols的组合。-Reflect.preventExtensions(target):使对象不可扩展,等同于Object.preventExtensions,返回布尔值表示是否成功。-Reflect.set(target,propertyKey,value[,receiver]):设置对象属性的值,receiver可以指定setter中的this,返回布尔值表示是否设置成功。-Reflect.setPrototypeOf(target,prototype):设置对象的原型,等同于Object.setPrototypeOf,返回布尔值表示是否设置成功。使用Reflect的好处:1.函数式编程:所有操作都是函数调用,便于函数组合和传递。2.操作返回值更加一致:大部分方法返回布尔值表示操作成功与否,而不是像Object上的方法那样在失败时抛出错误(这让我们可以用条件判断来处理结果)。3.与Proxy完美配合:在Proxy的陷阱中,我们可以方便地使用Reflect来执行默认行为。下面我们通过一些示例来演示Reflect的用法:示例1:Reflect.get和Reflect.set```javascriptletobj={a:1};console.log(Reflect.get(obj,'a'));//1Reflect.set(obj,'a',2);console.log(obj.a);//2```示例2:Reflect.has和Reflect.deleteProperty```javascriptletobj={a:1,b:2};console.log(Reflect.has(obj,'a'));//trueReflect.deleteProperty(obj,'a');console.log(Reflect.has(obj,'a'));//false```示例3:Reflect.construct```javascriptfunctionPerson(name){this.name=name;}letp=Reflect.construct(Person,['Alice']);console.log(pinstanceofPerson);//trueconsole.log(p.name);//'Alice'```示例4:Reflect.defineProperty```javascriptletobj={};letsuccess=Reflect.defineProperty(obj,'name',{value:'Bob',writable:true,enumerable:true,configurable:true});console.log(success);//trueconsole.log(obj.name);//'Bob'```示例5:Reflect.apply```javascriptfunctiongreet(name){return`Hello,${name}!`;}letresult=Reflect.apply(greet,null,['World']);//第二个参数是this,这里为nullconsole.log(result);//'Hello,World!'```示例6:在Proxy中使用Reflect```javascriptlettarget={name:'Original'};lethandler={get(target,prop,receiver){console.log(`Getting${prop}`);returnReflect.get(target,prop,receiver);},set(target,prop,value,receiver){console.log(`Setting${prop}to${value}`);returnReflect.set(target,prop,value,receiver);}};letproxy=newProxy(target,handler);proxy.name;//控制台输出:Gettingnameproxy.name='Proxy';//控制台输出:SettingnametoProxy```注意事项:-虽然Reflect提供了很多便利,但在不需要函数式风格或不需要处理操作结果的情况下,传统的操作符(如delete,in)和Object方法仍然可以继续使用。-由于Reflect是ES6的新特性,在旧版浏览器中可能需要使用polyfill。综上所述,Reflect对象提供了一种统一、函数式的方式来操作对象,并且与Proxy结合使用可以方便地实现元编程。§§相关问题§§1.Reflect对象与Object对象的方法有何区别?2.如何用Reflect实现一个简单的代理(Proxy)?3.Reflect在函数式编程中的具体应用有哪些?4.Reflect.construct方法如何使用?它与new操作符有什么不同?5.在哪些实际场景中推荐使用Reflect?</think>### JavaScript Reflect 对象使用指南 #### 基本概念 Reflect 是 ES6 引入的 JavaScript 内置对象,提供了一系列静态方法用于操作对象,使对象操作具有**函数式编程风格**。它不是构造函数,不能使用 `new` 调用(类似 `Math` 对象)[^1][^4]。 #### 核心功能 1. **统一对象操作** 将原本分散的操作符(如 `delete`、`in`)和 `Object` 方法统一为函数式调用: ```javascript // 传统方式 delete obj.name; 'name' in obj; // Reflect 方式 Reflect.deleteProperty(obj, 'name'); Reflect.has(obj, 'name'); ``` 2. **Proxy 的默认行为** Reflect 方法与 Proxy 的陷阱方法一一对应,常用于实现 Proxy 的默认行为[^3]: ```javascript const proxy = new Proxy(target, { get(target, key) { return Reflect.get(target, key); // 调用默认行为 } }); ``` #### 常用方法详解 | 方法 | 作用 | 示例 | |------|------|------| | **`Reflect.get(target, key)`** | 获取属性值 | `Reflect.get({a:1}, 'a') // 1` | | **`Reflect.set(target, key, value)`** | 设置属性值 | `Reflect.set(obj, 'age', 30)` | | **`Reflect.has(target, key)`** | 检查属性存在 | `Reflect.has(obj, 'name')` | | **`Reflect.deleteProperty(target, key)`** | 删除属性 | `Reflect.deleteProperty(obj, 'tmp')` | | **`Reflect.ownKeys(target)`** | 获取所有键(含 Symbol) | `Reflect.ownKeys(obj)` | | **`Reflect.construct(constructor, args)`** | 替代 `new` 操作符 | `Reflect.construct(Date, [2023])` [^2] | | **`Reflect.defineProperty(...)`** | 定义属性(返回布尔值) | `Reflect.defineProperty(obj, 'id', {value: 1})` [^5] | #### 关键优势 1. **函数式风格** 所有操作通过函数调用完成,便于函数组合和代码维护: ```javascript // 链式操作示例 const newObj = Reflect.construct( MyClass, Reflect.apply(preprocessArgs, null, args) ); ``` 2. **更安全的返回值** 相比 `Object` 方法,Reflect 方法返回布尔值而非抛出错误: ```javascript // Object 方式(失败时抛出错误) try { Object.defineProperty(obj, 'readOnly', {value: 1}); } catch (e) { /* 处理错误 */ } // Reflect 方式(返回 true/false) if (!Reflect.defineProperty(...)) { // 错误处理 } ``` 3. **与 Proxy 完美配合** 在 Proxy 陷阱中调用 Reflect 方法可保持对象默认行为: ```javascript const validator = { set(target, key, value) { if (key === 'age' && value < 0) { throw new Error("年龄不能为负数"); } return Reflect.set(target, key, value); // 执行默认设置 } }; ``` #### 使用场景 1. **元编程** 与 Proxy 结合实现高级拦截逻辑(如自动日志记录、数据验证)[^3]。 2. **替代操作符** 在函数式编程中替代 `delete`、`in` 等操作符。 3. **安全属性操作** 需要处理属性操作失败时(如定义不可配置属性)。 4. **框架开发** 提供统一的对象操作接口(如 Vue3 响应式系统)。 > **注意**:Reflect 并非要完全替代传统对象操作方式,而是提供一种补充方案,特别适合需要统一处理对象操作的场景[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值