继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【大犀牛笔记】表达式篇(上)

李夜
关注TA
已关注
手记 13
粉丝 50
获赞 1379
JS数据类型是一种抽象的描述,定义了数据的模式。而JS表达式是一个由任意类型的数据组成的短语,会进行计算,返回一个具体的结果。啊哈!虚实相生,便构成了丰富多彩而又诡异莫测的代码世界。呃...程序猿的世界就是这么的奇妙,莫名的奇妙!@_@!
我是原子——“原始表达式”
  1. 表达式最小的单位,不包含其他表达式(就像原子一样,是组成复杂表达式的最小单位);
  2. 共有四种:常量直接量关键字变量
    (what?直接量又是什么鬼?直接量是直接在程序中出现的常数值,包含数字直接量、字符串直接量、正则表达式直接量。PS:从字面上理解,直接量就是可以直接使用的原始值,不过”正则“是例外)
    举个栗子:
0x1607    //数字直接量,即JS中直接出现的数字(此处为十六进制)
1.606     //数字直接量

“hello everybody”     //字符串直接量,即引号括起来的字符序列

/regexp/     //正则表达式直接量,即直接在两条斜杠之间添加文本

那些有趣的“复杂表达式”
复杂表达式均由原始表达式组成,通常是用运算符来组合,也可以通过其他方法得到一个神奇的复杂表达式(如访问数组元素和函数调用)。其中,运算符是按照特定的规则对操作数(即运算符作用的目标)进行计算,并返回一个值,这个值就是表达式的值(请看最后的`i++`和`++i`实例)。

先来看3个常见的复杂表达式:

郑重申明:以下“对象直接量”、“数组直接量”、"函数直接量",均不是原始表达式(因其所包含的成员或元素都是子表达式)


1.对象初始化表达式(也叫“对象直接量”)

(1)构成:由一对`花括号`包含,其内每个子表达式都包含一个属性名和一个`冒号`作为前缀,每组`名/值对`之间用`逗号`隔开。
(2)返回值:一个新创建的对象。

注意事项
(1)可以嵌套;
(2)在求对象初始化表达式的值的时候,对象表达式也都会各自计算一次,并且它们可以是任意是JS表达式;
(3)对象直接量中的属性名称可以是字符串而不是标识符。

两个例子:

var obj1 = {a:1,b:"hi"};    //属性值可以是任意类型的值
var obj2 = {                //可以嵌套对象
            x:{cc:"我是嵌套的对象"},
            "y":{arr:[1,2,3]}};

PS:语法很开放,使用须谨慎!


2.数组初始化表达式(也叫“数组直接量”)
(1)构成:通过一对方括号和其内由逗号隔开的列表构成。
(2)返回值:一个新创建的数组。
(3)数组元素:由逗号分隔的表达式的值。

注意事项
(1)可以嵌套;
(2)每次计算的值有可能不同;
(3)数组直接量中的列表逗号之间的元素可以省略,省略的空位会填充值undefined;
(4)数组直接量的元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值为undefined的元素。

两个例子:

var arr1 = [1,2,3,,,6];         //数组元素可以为空
var arr2 = [[1,2,3],{attr:"Array"}]    //可以任意嵌套

PS2:语法很开放,使用须谨慎!


3.函数定义表达式(也可称为“函数直接量”)
(1)作用:定义一个JS函数,表达式的值是这个新定义的函数。
(2)构成:包含关键字function,其后是一对小括号(括号内是一个以逗号分割的列表,列表含有0个或多个标识符(参数名)),小括号后跟随一个由花括号包裹的JS代码段(函数体)。

注意事项
(1)函数定义表达式也可以包含函数的名字;
(2)函数也可以通过函数语句来定义。

var doSomething = function(argument){
        alert("I love Imooc!");
}

PS2:语法很开放,使用须谨慎!


4.未完待续,且看下篇......


关于i++和++i的那些事

/*i++*/
var sum = 0;
for(var i=0; i<10;){
    sum = i++;
}
console.log("i: "+i);        //i: 10
console.log("sum: "+sum);    //sum: 9

分析:i++这个整体是一个表达式(计算时,i先将值赋给该表达式,然后i自增1),每次进入循环的时候,先计算赋值运算符(=)右边的表达式i++的值,然后将这个值赋给sum,但sum的值在循环结束前会被依次覆盖,直到i==9的时候,表达式i++的值等于9,再将9赋给sum,之后i自增1变成10。此时判断条件i<10不成立,结束循环。最终,i==10sum==9

/*++i*/
var sum = 0;
for(var i=0; i<10;){
    sum = ++i;
}
console.log("i: "+i);        //i: 10
console.log("sum: "+sum);    //sum: 10

分析:表达式++i在计算时,i先自增1,然后将值赋给该表达式。同理,当i==9时,表达式++i的值等于10,再将10赋给sum,之后i自增1变成10。此时判断条件i<10不成立,结束循环。最终,i==10sum==10


个人觉得,概念性的东西最好先熟悉实例后再去啃,再厚的牛皮也经不住日积月累的摩擦!
申明:以上所有内容均是在《JavaScript权威指南》(淘宝前端译)一书的基础上整理所得。
以上,仅与诸君共勉!如有错漏,欢迎大神指正,为谢!

打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP