var a = { n: 1 }; var b = a; a.x = a = { n: 2 };JavaScript中运算符优先级----坑坑坑

博客聚焦于JavaScript中运算符优先级存在的问题。在JavaScript开发里,运算符优先级可能带来诸多‘坑’,了解这些能避免开发时出现错误,保障代码的准确性和稳定性。

JavaScript中运算符优先级----坑坑坑
在这里插入图片描述
**加粗样式
**

作用域面试六

var a = { n: 1 };
var b = a;
a.x = a = { n: 2 };
console.log(a.x);
console.log(b);
// 结果
// undefined
// { n: 1, x: { n: 2 } }
// 原理
// 第一行  a = { n: 1 }; 给变量a 赋值一个引用对象{ n: 1 };
// 第二行 b = a; 将a的引用地址赋值给 b  b={ n: 1 };
// 第三行 a.x = a = { n: 2 }; 拆解 之后 a = { n: 2 } a重写了引用地址 而 a.x = { n: 2 };相当于在a变量中添加一个属性x 并给x属性赋值为{ n: 2 };
// 第四行 a.x因为 a重写了引用地址  里面a没有属性x所以为undefined
// 第五行 由于第二行b = a;a和b同一个地址然后又在a中添加一个属性x 并给x属性赋值为{ n: 2 } 所以b的值为// { n: 1, x: { n: 2 } }

// 注意点 对a.x=a={n:1},赋值语句一般都是从右向左赋值,但是这里涉及到了赋值运算符优先级的问题,我们再看一下js中的运算符的优先级
// 我们可以看到“.”的优先级是要大于“=”的,因此先执行a.x,这是属性赋值(不了解的小伙伴可以先去看一下js的属性),在内存中是这样的,因为x声明未定义,所以是undefined。 


第4关:运算符优先级和结合性 100 学习内容 参考答案 记录 评论 任务描述 相关知识 运算符优先级 运算符的结合性 编程要求 测试说明 任务描述 本关任务:我们将给出函数mainJs()的完整代码,要求在函数体内第三句以及第五句中添加适当的括号,实现编程要求里面的要求。 要想完成本关任务,必须熟悉运算符优先级和结合性,请阅读下面的相关知识。 相关知识 在我们平时的学习中,经常会看到一些前辈的代码短小精悍却功能复杂,大部分是通过把大量运算符放在一起结合使用实现的,所以我们要深入理解运算符优先级和结合性,写出漂亮的代码! 运算符优先级 JavaScript运算符优先级和数学中运算符优先级意思相同,优先级高的运算符优先级低的运算符先计算,例如数学中1+2*3算式,先计算2*3,结果再与1相加,所以乘法的优先级高于加法,在JavaScript中,不同的优先级也是这个作用。 下面是常见的运算符优先级: 分类 运算符 含义 结合性 1 ++ 前后增量 R 1 -- 前后减量 R 1 ! 逻辑非 R 2 * / % 乘 除 求余 L 3 + - 加减 L 4 < <= > >= 比较数字顺序 L 4 in 测试属性是否存在 L 5 == 判断相等 L 5 != 判断不等 L 6 & 按位与 L 7 && 逻辑与 L 8 ?: 条件运算符 R 9 = 赋值 R 9 += -= *= /= %= 运算且赋值 R 10 , 忽略第一个操作数 L 从上到下优先级逐渐降低。第一栏数字相同的运算符优先级相同,对于这个表格,不需要全部记住,但是常见的需要记住,比如加减乘除的优先级高于比较运算符,赋值运算符优先级几乎是最低的,下面给出例子帮助理解: var a = 1; var b = 2; var c = ++a+b; 因为++的优先级高于+,所以上面的第三个句子等价于: var c = (++a)+b; 运算符的结合性 运算符优先级是针对不同优先级运算符来说的,对于同一级的运算符,运算顺序取决于运算符的结合性,比如加法和减法的优先级相同,而加法和减法都是从左向右结合,所以a+b-c式中,会先计算a+b,即按照阅读的顺序计算。 也有很多运算符是从右到左结合的,比如取反、逻辑非。 上面图中的第三栏就是结合性,R表示从右向左结合,L表示从左到右结合,从左向右的占多数,这和我们在数学中的习惯相同。 var d = a*b/c;//先计算乘法后计算除法 var aa = 2; var bb = 3; var cc = aa *= bb;//先计算aa*=bb,再把结果赋值给cc,为6 上面第一个式子是从左到右结合,第四个式子是从右到左结合。 分别等价于: var d = (a*b)/c; var cc = (aa *= bb); 编程要求 本关的编程任务是补全右侧代码片段中begin至end中间的代码,在函数体内第三句以及第五句添加适当的括号,以实现如下功能: 参数a先减去1,所得差再与参数b相加,然后将结果再与b相乘; 上面的结果为24则给参数c赋值1,否则赋值0; 计算c与d(d 等于4)的积,这个积再与参数d求和,所得结果赋值给参数e; 函数参见下面的测试说明部分。 本关涉及的代码文件Priority.js的代码框架如下: function mainJs(a,b) { var a = parseInt(a); var b = parseInt(b); //请在此处编写代码 /********** Begin **********/ var c = --a+b*b==24?1:0; var d = 4; var e = c*=d+d; /********** End **********/ return e; } 测试说明 测试过程: 平台将读取用户补全后的Priority.js; 调用其中的mainJs()方法,输入若干组测试数据; 接着根据测试后的输出判断程序是否正确。 以下是测试样例: 测试输入: 6,3 预期输出: 8 测试输入: 5,1 预期输出: 4
最新发布
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值