JS数据类型是一种抽象的描述,定义了数据的模式。而JS表达式是一个由任意类型的数据组成的短语,会进行计算,返回一个具体的结果。啊哈!虚实相生,便构成了丰富多彩而又诡异莫测的代码世界。呃...程序猿的世界就是这么的奇妙,莫名的奇妙!@_@!
我是原子——“原始表达式”
- 表达式
最小
的单位,不包含其他表达式(就像原子一样,是组成复杂表达式的最小单位); - 共有四种:
常量
或直接量
,关键字
,变量
;
(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==10
,sum==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==10
,sum==10
。
个人觉得,概念性的东西最好先熟悉实例后再去啃,再厚的牛皮也经不住日积月累的摩擦!
申明:以上所有内容均是在《JavaScript权威指南》(淘宝前端译)一书的基础上整理所得。
以上,仅与诸君共勉!如有错漏,欢迎大神指正,为谢!