js基本比较,函数的具名和匿名,对象的遍历

1,比较规则

在比较字符串、数值和布尔值的相等性时,问题还比较简单。但在涉及到对象的比较时,问题就变得复杂了。最早的ECMAScript中的相等和不相等操作符会在执行比较之前,先将对象转换成相似的类型。后来,有人提出了这种转换到底是否合理的质疑。最后,ECMAScript的解决方案就是提供两组操作符:
相等和不相等—先转换再比较(
全等和不全等—仅比较而不转换(
=)
ECMAScript中相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true,这种操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性
在转换不同的数据类型时,对于相等和不相等操作符:在JS高程中一书中给出如下的基本转换规则
①、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值false转换为0,而true转换为1;
②、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
③、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf0方法,用得到的基本类型值按照前面的规则进行比较这两个操作符在进行比较时则要遵循下列规则。①、null 和undefined是相等的
②、要比较相等性之前,不能将null和undefined转换成其他任何值
③、如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。重要提示:即使两个操作数都是NaN,相等操作符也返回false了;因为按照规则,NaN不等于NaN
④、如果两个操作数都是对象,则比较它们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false

2具名函数和匿名函数

具名函数
var a = 2;
function foo() {
var a = 3;
console.log( a ); //3
} 
foo(); 
console.log( a ); // 2
虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的问题。首先,
必须声明一个具名函数 foo() ,意味着 foo 这个名称本身“污染”了所在作用域(在这个例子中是全局作用域)。其次,必须显式地通过函数名( foo() )调用这个函数才能运行其中的代码。如果函数不需要函数名(或者至少函数名可以不污染所在作用域),并且能够自动运行,
这将会更加理想。



匿名函数
var a = 2;
( function foo(){ 
var a = 3;
console.log( a ); // 3
})(); 
console.log( a );
函数会被当作函数表达式而不是一个标准的函数声明来处理。
function如果出现在声明中第一个词的位置,就是函数声明
函数表达式意味着函数被直接绑定在作用域中,意味着foo只能再被自己代表的位置被调用,不会污染全局作用域
匿名函数的缺点在于

忽略了代码可读性
在栈追踪中不会显示有意义的函数名,造成调试困难
因为没有函数名,所以函数在调用自己时,必须使用过期的argument.callee
解决方案
行内函数表达式,比如计时器函数
setTimeout( function timeoutHandler() { // <-- 快看,我有名字了!
console.log( "I waited 1 second!" );
}, 1000 );

3具名函数的四种调用方式:

1、()小括号运算符,平时常用的就是()运算符来调用执行一个函数
2、call
3、apply
4、new(不推荐使用这种方式)
总结:用new方式调用函数时,如果存在返回值,当返回值是Javascript的内置类型(基本类型)如String,Number,Boolean等时,将不会返回该值;当返回值是对象,函数,数组等对象类型时,将返回该对象,函数,数组

4js 遍历对象的几种方法

第一种
for......in
const obj = {
        id:1,
        name:'zhangsan',
        age:18
}
 for(let key  in obj){
    console.log(key + '---' + obj[key])
 }


第二种:
1)、Object.keys(obj)
2)、Object.values(obj)
参数:
obj:要返回其枚举自身属性的对象
返回值:
一个表示给定对象的所有可枚举属性的字符串数组。
	const obj = {
    id:1,
    name:'zhangsan',
    age:18
	}
	 console.log(Object.keys(obj))
	console.log(Object.values(obj))
	输出结果: obj对象的key组成的数组
	['id','name','age']
	输出结果:obj对象的value组成的数组
	['1','zhangsan','18']
	
	使用forEach遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值