什么是JavaScript中的结果值?


Posted in Javascript onOctober 08, 2016

你知道JavaScript中的每条语句、甚至表达式都有一个结果值吗?

当你在浏览器中测试代码时,经常会在控制台的输出结果的最后面多出一条,大部分为undefined,这个undefined就是一个结果值。

ES7的do表达式

先从ES7的一个提案说起吧:do表达式do{...}(注意:不是do{...}while();中的do)

var a,b,c = 3;
a = do {
   if (true) {
      b = c*3;
   }
};
a; //9 目前的浏览器暂不支持

表达式do{...}的作用就是返回它后面的语句块的结果值,功能其实和return类似,只不过return需要通过函数来封装后调用。

不过目前来说,我们还无法使用上面的功能,目前的规范是不允许我们获得语句的结果值并将其赋值给一个变量的(除了使用eval(),如var a = eval('if (true) {b = c*3;}'),a的值被赋值为eval()内的语句的结果值,不建议使用eval())。

ES5规范关于结果值的规定

现在你应该大概理解了什么是结果值了,本人翻看了ES5规范,发现JavaScript中,语句块、语句、甚至表达式都会隐式地返回一个结果值,总结如下:
结果值是语句、表达式经过逻辑运算后的值,若无逻辑(按顺序执行)则为最后一条子语句、表达式的结果值(语句可以包含子语句),简单地说它就是一个语句、表达式的“隐式的返回值”,JavaScript会计算每一条语句、表达式并返回一个结果值,而对于语句块的结果值,它是最后一条最外层语句的结果值(非嵌套的子语句)。

部分浏览器会在控制台输出一段代码的最后一条语句或语句块的结果值(本文所有代码均使用Firefox测试,不同浏览器有差别)

结果值可以为任何表达式的值,也可以为空(;、break;、continue;),为空时结果值为undefined。当结果值为空时,浏览器会忽略该语句,而打印出上一条同级的非空的语句,若仅有自身一条同级语句则打印出undefined。

特例:var变量声明语句、函数声明语句的结果值为undefined。

1、变量声明语句算法的返回值实际为表示该变量名称的字符串,但是这个值被变量语句算法屏蔽掉了(for...in循环除外),最后返回结果为undefined
2、而对于函数声明语句,它的结果值本人按规范解读为该函数对象,但浏览器显示为undefined,具体什么原因,本人还不理解(可能是因为函数只是定义,未被实际执行的原因);
3、函数执行语句的结果值为:
3.1 若有throw语句,则为throw语句的结果值
3.1 若有return语句,则为return语句的结果值
3.2 若无throw、return语句则为undefined

例子:

var a,b,c = 3;
if (true) {b = c*3;} //按顺序执行到最后一条语句,输出9
; //undefined 单独的空语句
var d = 5; //undefined 所有的var声明语句的结果值均为undefined

function foo(a){
 a = a+2;
 return a;
}
//undefined 函数声明语句的最终结果值也为undefined
foo(1); //3 函数执行语句的结果值为函数throw、return语句的结果值,若无throw、return语句,则为undefined
if(true){a=1;}else{b=2;} //1 按逻辑计算结果执行a=1;语句

{
 var a = 1,b = 2;
 if(true){a;}else{b;} //输出1,最后一条空语句会被忽略
 ;
}
var a = 5;
switch(a){
 case 1:
  a+1;
  break;
 case 5:
  a+5;
  break;
 case 3:
  a+3;
  break;
}
//10 空的break;语句会被忽略
var a = 5;
switch(a){
 case 1:
  a+1;
  break;
 case 5:
  break; //执行这里,它这里无同级语句
 case 3:
  a+3;
  break;
}
//undefined

下面来具体看看表达式的结果值有什么用:
大部分表达式只有结果值,没有副作用,如:var a = 2; var b = a + 3;,这里的表达式a+3的结果值为5,被赋值给了b。

而有副作用的表达式,如:

function foo(){
  a++;
}
var a=0;
foo(); //结果值为undefined,副作用是改变了a的值

又如:

var a = 0; 
var b = a++;
a; //1
b; //0
var c = a++; //结果值为undefined 副作用是c被赋值了,a变成了2 
var d = a++, a; //结果值为undefined,副作用是d被赋值为2,a变成了3,实际执行的是var d = a++;
var d = (a++,a);//结果值为undefined,副作用是d被赋值为3,a变成了3,实际执行的是var d = ++a;
function foo(){
  var e = f = 1;  //表达式f=1的结果值为1,1又被赋值给e
}
foo();
f; //1 创建了全局变量f
e; //ReferenceError

赋值语句的副作用是将'='右边的表达式的结果值赋值给了左边的变量,最终整个赋值语句的结果值为变量的值,为此我们可以这样:

function foo(a){
  var b;
  if(a&&(b = a*10;)<50){
    ...
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 继承详解(四)
Jul 13 Javascript
JQuery live函数
Dec 24 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
jquery单行文字向上滚动效果示例
Mar 06 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
Feb 18 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
基于JS实现前端压缩上传图片的实例代码
May 14 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 Javascript
Vue学习之axios的使用方法实例分析
Jan 06 Javascript
JavaScript如何判断对象有某属性
Jul 03 Javascript
一小时迅速入门Mybatis之bind与多数据源支持 Java API
Sep 15 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 #Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
Oct 08 #Javascript
bootstrap下拉列表与输入框组结合的样式调整
Oct 08 #Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 #Javascript
Javascript中常用的检测方法小结
Oct 08 #Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 #Javascript
AngularJS 2.0入门权威指南
Oct 08 #Javascript
You might like
php的一个登录的类 [推荐]
2007/03/16 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
php的curl封装类用法实例
2014/11/07 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python实现截屏的函数
2015/07/26 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Python下载网络小说实例代码
2018/02/03 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
Python wordcloud库安装方法总结
2020/12/31 Python
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
应届毕业生个人自荐信范文
2013/11/30 职场文书
项目总经理岗位职责
2014/02/14 职场文书
教师师德反思材料
2014/02/15 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
办公室禁烟通知
2015/04/23 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
小学班级标语口号大全
2015/12/26 职场文书
Python Django获取URL中的数据详解
2021/11/01 Python
Vue h函数的使用详解
2022/02/18 Vue.js