废话不多说,请接表达式篇(上)。
啰嗦之前
var oCreator = new Object();
oCreator.say = "";
if(oCreator.say == "没有对象"){
console.log("怎么面向对象编程?");
}
else{
console.log("难道真要抽象出一个对象,像this那样指向任意对象?o(╯□╰)o");
console.log("关于原型,犀牛书上看不太明白,恳求大神指点!");
}
4.属性访问表达式
属性访问表达式运算得到一个对象属性或一个数组元素的值。
-
两种语法
(1)expression.identifier
<1>一个表达式后跟随一个句点和标识符;
<2>表达式指定对象,标识符指定需要访问的属性的名称。(2)expression[expression]
<1>方括号内是一个表达式(一般用于对象和数组);
<2>第二个表达式指定要访问的属性的名称或者代表要访问数组元素的索引。 -
区别
(1)expression.identifier这种方式只适用于要访问的属性名是合法的标识符(符合命名规范),并且需要知道被访问属性的名字;
(2)如果属性名称是一个保留字或包含空格和标点符号,或是一个数字,则必须用expression[expression]写法;当属性名是一个计算值而不是固定值的时候,也必须使用方括号写法。 - 注意事项
(1)两种写法在“.”和“[”之前的表达式最先计算,若结果是null或undefined,表达式会抛出一个类型错误异常;若运算结果是不是对象,JS会将其转换为对象。
(2)若对象表达式后跟随句点和标识符,则会查找由这个标识符所指定的属性的值,并将其作为整个表达式的值返回;
(3)若对象表达式够跟随一对方括号,则会计算方括号内的表达式的值并将它转换为字符串;
(4)不论哪种情况,若命名的属性不存在,则整个属性访问表达式的值就是undefined。
一种调用(或者执行)函数或方法的语法表示。
-
构成
(1)以一个函数表达式(指代了要调用的函数)开始;
(2)函数表达式后跟随一对圆括号
(3)括号内是一个以逗号隔开的参数列表,参数可以有0个也可有多个 -
求值
(1)先计算函数表达式,再计算参数表达式;
(2)传参;
(4)执行函数体。若函数使用return语句给出一个返回值,那么这个返回值就是整个调用表达式的值。否则,调用表达式的值就是undefined。 - 说明
(1)若将调用表达式用作以个属性访问表达式,则这个调用称为“方法调用”;
(2)作为方法调用时,调用该方法的对象就是其调用方法内this的指向;
(3)不作为方法调用时,通常使用全局对象作为this关键字的值,一般为window对象。例外:在ECMAScript5中,通过严格模式定义的函数在调用时,this的值为undefined,而不会指向全局对象。
使用new关键字,通过构造函数创建并初始化。
实例:var obj = new Object();
注:若不传参,小括号可省略。
-
算术表达式
(1)所有无法转换成数字的操作数都转换为NaN,对应表达式的值也是NaN;
(2)计算结果不区分整型和浮点型,如5/2==2.5;
(3)除数为0时,结果为Infinity或-Infinity,例外:0/0==NaN;
(4)取余(%)也适用于浮点数,如6.5%2.1==0.2;
(5)注意加号运算符的双重作用:加法和字符串连接。 -
关系表达式
返回一个布尔值true/false;
(1)相等(==)只比较值,恒等(===)比较值和类型,不等(!=)和不恒等(!==)同理;
(2)in运算符用于属性归属判断,instanceof运算符用于对象类别判断。 -
逻辑表达式
(1)逻辑与&&
若左操作数的计算结果(包括布尔转换)为假值,则整个表达式的值为左操作数的值,不计算右操作数的值;否则,整个表达式的值为右操作数的值。
(2)逻辑或||
若左操作数的计算结果(包括布尔转换)为假值,则整个表达式的值为右操作数的值;否则,整个表达式的值为左操作数的值,不计算右操作数的值。
(3)逻辑非!
首先将操作数转换成布尔值,再取反! -
赋值表达式
用来给变量或属性赋值。
运算符的存在使得表达式的生命变得丰富多彩,二者几乎形影不离。在具体使用时,需要注意“运算符的优先级”。JS中的运算符分为一元、二元、三元之分,约有51种,内涵实在丰富,这里就不做赘述了!
申明:以上所有内容均是在《JavaScript权威指南》(淘宝前端译)一书的基础上整理所得。 以上,仅与诸君共勉!如有错漏,欢迎大神指正,为谢!