资讯专栏INFORMATION COLUMN

JavaScript中一个运算符优先级问题引发的思考

zengdongbao / 1663人阅读

摘要:中一个运算符优先级问题引发的思考题目假设已经声明可定义为任何值。分析因为我们忽略了运算符的优先级。要知道,加号优先级高于三目运算,低于括号。为值,在里的判断就是值。

JavaScript中一个运算符优先级问题引发的思考 题目

假设 val 已经声明,可定义为任何值。则下面js代码有可能输出的结果为:

console.log("Value is " + (val != "0") ? "define" : "undefine");

A. Value is define
B. Value is undefine
C. define
D. undefine
E. Value is define 或者 Value is undefine
F. define 或者 undefine
G. 其它选项都有可能

如果是你,你会选什么呢?

可以说,大部分人都会在A、B、E中选择,以为重点在后面的三目运算符,前面字符串原样输出就是了。但是答案是 C

分析

因为我们忽略了运算符的优先级。要知道,加号 + 优先级高于三目运算 ? :,低于括号 ()。不管 (val != "0") 的真假,"Value is " + (val != "0") 是一个字符串并且转换成布尔值一定是 true

下面我们来具体分析里面的每一部分。

先来看看括号里面的情况,题目已经说了:

假设 val 已经声明,可定义为任何值。

所以,(val != "0") 的值可以是 true 或者 false ,那么这个就涉及到JavaScript的一些隐式转换逻辑。

众所周知,

0 == "0"  // true
null == undefined  // true
false == "0"  // true
常用的隐式转换逻辑
x+""  //等价于String(x)

+x  //等价于Number(x),也可以写成x-0

!!x  //等价于Boolean(x)
附录 - Javascript类型转换

回到本题条件永远为真,并且只输出 "define"

Boolean

还有一个需要注意的地方

下面程序的显示结果是?

var x = new Boolean(false);
if (x) {
  alert("hi");
}
var y = Boolean(0);
if (y) {
  alert("hello"); 
}

x为Boolean对象,在if语句里的判断为true,虽然x的值为false,但是作为对象,if会直接判断为true。y为Boolean值,在if里的判断就是false值。所以会显示 "hi"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88206.html

相关文章

  • 一道前端面试题引发思考

    摘要:直接开始题目是厉害了说句实话开发中谁写成这样保证会被打死。不过面试就是面试,有面试官的考量点。官方是这么说的。结果完美,不过小姐姐的意思是数组的方法会自动触发数组的。 直接开始题目是 if(a==1 && a==2 && a==3){ alert(厉害了) } 说句实话开发中谁写成这样保证会被打死。 不过面试就是面试,有面试官的考量点。 我理解的点有两个 1、隐式类型转换 先说...

    gaomysion 评论0 收藏0
  • 一道三目运算测试题引发思考

    摘要:因为加法的优先级比条件运算符高,所以先运算加号,是字符串拼接,结果是非空字符串,在中字符串的布尔类型为。知识点三目运算为真执行为假执行运算优先级在中布尔类型只有以下种情况为假,其他都为真。 一、测试题 原题:以下代码的输出是? var val = false; alert(val is + val ? true : false); 解析: 1. 此题考察的知识点: 三目运算、**运...

    SHERlocked93 评论0 收藏0
  • 简单说 !![]==true 与 []==true 引发思考

    摘要:简单说中的与方法我们一句一句的看结果是逻辑非,会将操作数的布尔值求反,而就是类型转换,将对应的类型转换为型所以我们看一看,一次求反返回的就是,再求反返回的就是。原始值不可变更的值,包括布尔值数字和字符串。 说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情...

    lbool 评论0 收藏0
  • 简单说 !![]==true 与 []==true 引发思考

    摘要:简单说中的与方法我们一句一句的看结果是逻辑非,会将操作数的布尔值求反,而就是类型转换,将对应的类型转换为型所以我们看一看,一次求反返回的就是,再求反返回的就是。原始值不可变更的值,包括布尔值数字和字符串。 说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情...

    gnehc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<