你知道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中的结果值是什么吗?的更多相关文章

  1. javascript中的原始值和复杂值

    × 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...

  2. Javascript中的Keycode值列表

    关于如何得到一个键在Javascript中的Keycode值,可以参考: <body onkeypress=alert(event.keyCode)>请按任意键,你将得到该键的键值! ke ...

  3. 在javascript中检查一个值是否为integer

    integer 类型在javascript中很奇怪.ECMAScript技术规格说明书中,它是以概念的形式存在.number类型包括浮点型(floating )和整形(integer )不包括小数(详 ...

  4. 论javascript中的原始值和对象

    javascript将数据类型分为两类:原始值(undefined.null.布尔值.数字和字符串),对象(对象.函数和数组) 论点:原始值不可以改变,对象可以改变:对象为引用类型: '原始值不可以改 ...

  5. javascript中的this值

    如何确定this的值  this值会被传递给所有函数,this的值是基于运行时调用函数的上下文. 例如:从全局作用域调用sayFoo函数时,this引用window对象, 当它作为myObject的一 ...

  6. 关于javascript中=的返回值

    今天看了一段代码,大概是这样的: function test(){ a=4; b=5; return b=a; } test();//返回? 返回值是多少呢?运行结果是4 这可以理解为将a的值赋给b以 ...

  7. [java面试]javascript中dom取值问题radio名字一样归属于同一个组,求点击的是哪一个

    题目描述: 看如下的html文件,里面定义了一些radio类型的元素,请完成parse()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框. </pre><pre code ...

  8. JavaScript中函数作为值

    function myfunc() { // .. } 这是个函数,这样理解, myfunc只是外层作用域的一个变量,指向刚刚声明的function. 也就是说,function本身就是一个值, 就像 ...

  9. 在JavaScript中引用类型和值类型的区别

    一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...

随机推荐

  1. 数据库 DML、DDL、DCL区别 .

    总体解释: DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的 ...

  2. Jquery 获得当前标签的名称和标签属性

    得到标签的名称 $("#name").prop("tagName"); 或者 $("#name")[0].tagName; 注意:1.得到的 ...

  3. mysql 大表拆分成csv导出

    最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...

  4. sqlyog导出json数据格式支持mysql数据转存mongodb

    <!-------------知识的力量是无限的(当然肯定还有更简单的方法)-----------!> 当我考虑将省市区三级联动数据从mysql转入mongodb时遇到了网上无直接插入mo ...

  5. 邻接矩阵的深度优先遍历(java版)

    这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.dat ...

  6. NYOJ 455

    1.应该交代清楚,参加宴会的人不知道一共有多少顶帽子.假如知道有n顶帽子的话,第一次开灯看见有n-1只,自然就知道自己是第n顶黑帽子,所以应该是这n个人在第一次关灯就打自己脸,不过这么一来就没意思了, ...

  7. 开源发布:VS代码段快捷方式及可视化调试快速部署工具

    前言: 很久前,我发过两篇文章,分别介绍自定义代码版和可视化调试: 1:Visual Studio 小技巧:自定义代码片断 2:自定义可视化调试工具(Microsoft.VisualStudio.De ...

  8. Centos 7.0 安装Mono 3.4 和 Jexus 5.6

    2013-07-26 写过一篇<CentOS 6.3下 安装 Mono 3.2 和Jexus 5.4>,CentOS 7在CentOS 6的基础上有很大的调整,本文是这篇文章的更新,主要介 ...

  9. ARM的栈指令

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

  10. 从EF的使用中探讨业务模型能否脱离单一存储层完全抽象存在

    上次赶时间,就很流水账地写了上次项目对EF的一次实践应用模式,因为太长了,也没能探讨太多,所以再继续扩展. 这次想探讨的是,实体,如果作为类似于领域模型的业务模型存在,它的数据能否来自不同的数据源.这 ...